「Excelで株価や為替を秒単位で更新したい」「製造ラインのセンサー値をシートに流し込みたい」――こうした業務要件にピンポイントで応えるのが RTD関数 です。
RTD(RealTimeData)は、外部のRTDサーバーと通信してデータを継続的に取り込む仕組みです。証券会社のトレーディングツール、PLCや SCADA などの現場制御システム、Bloomberg のような金融データサービスで広く使われています。
ただし「サーバーが必要」「Windows版限定」「ProgID とトピックの理解が必要」と、初見ではハードルが高い関数でもあります。
この記事では、RTD関数の仕組み・書式・基本コード・DDE関数との比較・実務での活用例・エラー対処までを順番に解説します。読み終えるころには、自社環境で RTD を導入するための判断材料がそろうはずです。
ExcelのRTD関数とは?RTDサーバーとリアルタイムデータ取得の仕組み
読み方と語源
RTD関数は「アール ティー ディー かんすう」と読みます。RTDは RealTimeData(リアルタイムデータ) の略です。外部プログラムから継続的にデータを受け取り、Excelのセル上に最新値を表示するための関数です。
通常の関数が「呼び出されたタイミングで一度だけ計算する」のに対し、RTD関数は サーバー側からのプッシュ通知 を待ち受けます。データが更新されるたびにセルを自動再計算する点が最大の特徴です。
RTDサーバーとは何か
RTDサーバーは、Microsoft の COM(Component Object Model) という仕組みで作られた外部プログラムです。IRTDServer というインターフェースを実装することで、Excelからの接続要求に応答できるようになります。
ExcelはCOMを通じてサーバーに「このトピックのデータがほしい」と伝えます。サーバーは値が変わるたびにExcelに通知を返します。この双方向通信のおかげで、Excelは画面を再読み込みすることなく最新値を保持できます。
どんな業務シーンで使うのか
RTD関数が特に活躍するのは、以下のような「秒〜分単位でデータが変わる業務」です。
- 株価・為替・指数・先物・暗号資産のリアルタイム取得
- 製造ラインの温度・圧力・回転数などのセンサー値モニタリング
- 物流倉庫のタグ読み取り数や処理レーンの稼働状況
- コールセンターの着信待ち件数・応対中件数の表示
- スポーツのライブスコアや競技進行状況のダッシュボード
要するに「外部の何かが動き続けていて、その状態を一覧で見たい」シーンに向いています。
対応バージョンと前提条件
RTD関数は Excel 2002 以降 で利用できますが、いくつかの前提条件があります。
| 条件 | 内容 |
|---|---|
| OS | Windows 版 Excel のみ対応(Mac版は COM を持たないため非対応) |
| RTDサーバー | 別途インストールまたは自作が必要 |
| 信頼設定 | マクロセキュリティで COM サーバーの実行が許可されている必要あり |
| 更新間隔 | デフォルト2秒。Application.RTD.ThrottleInterval で変更可能 |
RTD関数だけを書いてもデータは取れません。「Excel + RTDサーバー」のセット で初めて機能する点を、最初に押さえておきましょう。
RTD関数の書式と引数の渡し方
基本構文
RTD関数の構文はとてもシンプルです。ただし、第3引数以降の「トピック」がやや独特です。
=RTD(ProgID, Server, Topic1, [Topic2], ...)
引数一覧
| 引数 | 必須/任意 | 内容 |
|---|---|---|
| ProgID | 必須 | RTDサーバーの ProgID(COMサーバーの識別子)を文字列で指定。例:"MyCompany.StockRTD" |
| Server | 必須 | RTDサーバーが動作するコンピューター名。ローカルなら ""(空文字)または省略可 |
| Topic1 | 必須 | 取得するデータを特定する第1キー。証券コードや銘柄シンボルなど |
| Topic2〜 | 任意 | 取得するデータをさらに絞り込むための第2〜第28キー。「銘柄+項目」のように複数キーで1データを特定する |
ProgID とは何か
ProgID(Programmatic Identifier)は、COMサーバーごとに割り振られた 一意の識別文字列 です。形式は Vendor.Component または Vendor.Component.Version が一般的です。
ProgID は通常、サーバー提供元のマニュアルや、Windowsレジストリの HKEY_CLASSES_ROOT 配下で確認できます。証券会社のRTDサーバーであれば、セットアップガイドに必ず記載されています。
トピックの設計思想
トピックは「サーバー側で公開されているデータを特定するためのキー」です。1つのトピックで足りないケースも多く、たとえば株価サーバーなら「証券コード」と「項目名」の2つで1つの値を特定します。
=RTD("MyCompany.StockRTD", , "7203", "price") → トヨタの現在値
=RTD("MyCompany.StockRTD", , "7203", "volume") → トヨタの出来高
=RTD("MyCompany.StockRTD", , "7203", "bid") → トヨタの買気配
トピックの組み合わせは サーバー側の仕様で決まっています。必ずサーバー提供元のドキュメントを確認してください。
引数を渡すときの注意
引数の文字列は 二重引用符で囲む 必要があります。セル参照を使う場合は引用符は不要です。
=RTD(A1, "", B1, C1)
セル参照にしておくと、参照先の値を変えるだけで取得対象を切り替えられます。保守性が大幅に上がるため、実務では推奨の書き方です。
RTD関数の使い方①|基本的なRTDサーバー接続例
ここからは、実際にどのような数式を書いてRTDサーバーに接続するかを具体例で見ていきます。
例1:ローカルのRTDサーバーから1つの値を取得する
もっともシンプルなパターンです。ローカルPCでサーバーが稼働している場合、Server 引数は空にします。
=RTD("MyCompany.StockRTD", , "7203", "price")
| 引数 | 値 | 意味 |
|---|---|---|
| ProgID | “MyCompany.StockRTD” | サーバーの識別子 |
| Server | (省略) | ローカル実行 |
| Topic1 | “7203” | 証券コード |
| Topic2 | “price” | 取得項目(現在値) |
サーバーが稼働していれば、セルに現在値が表示されます。データ更新のたびに自動で書き換わります。
例2:リモートサーバーからデータを取得する
社内のデータ配信サーバーから値を引きたい場合は、Server 引数にコンピューター名を入れます。
=RTD("MyCompany.StockRTD", "DATA-SERVER01", "USDJPY", "ask")
ホスト名解決ができる前提で、DATA-SERVER01 というマシンのRTDサーバーに接続します。社内ネットワークのDNS設定やDCOM設定が必要なケースが多いので、情報システム部門と連携して進めましょう。
例3:セル参照で動的にデータを切り替える
実務では、銘柄や項目名を 入力セル に持たせる構成が便利です。
=RTD($A$1, $A$2, B3, C3)
| セル | 入力例 | 意味 |
|---|---|---|
| A1 | “MyCompany.StockRTD” | ProgID |
| A2 | “” | サーバー(空=ローカル) |
| B3 | “7203” | 証券コード |
| C3 | “price” | 項目名 |
このパターンなら、B列とC列を増やすだけで「銘柄一覧×複数項目」のリアルタイム表が完成します。
例4:複数項目を横並びで表示する
トピック2を「項目名」にして、列方向に複数項目を並べる構成もよく使われます。
A列: 銘柄コード
B列: =RTD("MyCompany.StockRTD", , $A2, "price")
C列: =RTD("MyCompany.StockRTD", , $A2, "volume")
D列: =RTD("MyCompany.StockRTD", , $A2, "change")
下方向にコピーするだけで、銘柄ごとの価格・出来高・前日比が一覧化されます。Excelの条件付き書式と組み合わせれば、値動きの大きな銘柄をハイライトする簡易ボードも作れます。
更新頻度の調整
RTDの更新間隔はデフォルトで 2秒 に設定されています。頻繁な更新は画面のチラつきやCPU負荷を招くため、用途に応じて間隔を変更しましょう。
Application.RTD.ThrottleInterval = 2000 ' 2秒(デフォルト)
Application.RTD.ThrottleInterval = 5000 ' 5秒に変更
Application.RTD.ThrottleInterval = 0 ' サーバーからの通知を即時反映
このコードはVBAのイミディエイトウィンドウや起動マクロから実行できます。0 を指定するとサーバー通知が来るたびに即座に再計算されます。CPU負荷とのトレードオフを意識して値を決めてください。
RTD関数の使い方②|DDE関数との比較と移行
リアルタイムデータ取得には、RTD登場以前から DDE(Dynamic Data Exchange) という仕組みも使われていました。古い証券アプリやレガシー業務システムには、いまも DDE 連携が残っています。
DDEとRTDの違い
| 項目 | DDE | RTD | |
|---|---|---|---|
| 通信方式 | プロセス間通信(旧式) | COM ベースのプッシュ通知 | |
| 安定性 | アプリ停止や再起動でリンク切れしやすい | リンク切れに強く、自動再接続が容易 | |
| 通知タイミング | クライアントからのポーリング中心 | サーバー側からのプッシュ | |
| パフォーマンス | 大量データに弱い | 大量データの差分更新が得意 | |
| Excelからの記述 | リンク貼り付け(`=サーバー | トピック!項目`) | RTD関数 |
| Microsoftの位置付け | レガシー扱い・推奨されない | リアルタイム連携の標準 | |
| サポート状況 | Excel 2016 以降は既定で無効 | 現行バージョンで標準サポート |
セキュリティ上の理由から、Excel 2016 以降は DDE が初期状態で無効化 されています。DDE を有効にすると外部からの攻撃面が広がるため、MicrosoftはRTDへの移行を推奨しています。
DDEからRTDへの移行イメージ
たとえば、古い DDE 形式のリンクが以下のように書かれていたとします。
=StockApp|Quote!7203
これと同等の情報をRTDで取得するなら、サーバー提供元が用意したRTDサーバーを介して次のような数式に置き換えます。
=RTD("StockApp.QuoteRTD", , "7203", "price")
DDE の アプリ名|トピック!項目 構造が、RTD の ProgID + Topic1 + Topic2 に対応するイメージです。サーバー側のリプレースが必要なので個人で完結できる作業ではありません。ただし提供元がRTDサーバーを用意していれば、Excelファイル側の数式書き換えは比較的シンプルです。
移行時のチェックリスト
- 提供元が RTDサーバー版を提供しているか確認する
- ProgID とトピック仕様のドキュメントを入手する
- 既存ファイルの DDE リンクを棚卸しする(
数式→名前の管理などから検索) - 試験用シートで小規模に RTD 化し、表示と更新を確認する
- 本番ファイルを段階的に置き換える
DDE のままでは将来のExcelアップデートで動かなくなるリスクがあります。レガシーリンクを抱えている現場は早めの移行計画を立てましょう。
RTD関数の応用|株価・為替・センサーデータのリアルタイム取得
ここでは、業界別の代表的な活用パターンを紹介します。RTDサーバーを「自分で書く」場合の参考にもなります。
活用例1:株価・為替のダッシュボード
国内ネット証券のなかには、自社ツール経由でRTDサーバーを提供しているサービスがあります。FX業者の一部や、Bloomberg・LSEG(旧Refinitiv)などのプロ向け配信もRTDに対応しています。
代表的なシート構成は以下のようなものです。
| 列 | 内容 | 数式例 |
|---|---|---|
| A | 銘柄コード(7203, 6758 など) | 手入力 |
| B | 現在値 | =RTD(ProgID, , A2, "price") |
| C | 前日比 | =RTD(ProgID, , A2, "change") |
| D | 出来高 | =RTD(ProgID, , A2, "volume") |
| E | アラート | =IF(ABS(C2)>=100, "★急変", "") |
条件付き書式で「前日比がプラスなら緑、マイナスなら赤」と色分けすれば、視覚的にもわかりやすい簡易トレードボードになります。
活用例2:製造現場のセンサーモニタリング
PLC(プログラマブルロジックコントローラ)や SCADA は、OPCサーバー経由で値を公開していることが多く、OPC-RTDブリッジを介すことでExcelから直接読み取れます。
A2: 設備ID("LINE-01-MOTOR")
B2: =RTD("OpcRtd.Server", , A2, "Temperature")
C2: =RTD("OpcRtd.Server", , A2, "Pressure")
D2: =RTD("OpcRtd.Server", , A2, "RPM")
温度や圧力が閾値を超えたら背景色を赤に変えるだけで、現場の朝礼で見せられるリアルタイム監視シートが完成します。
活用例3:自作RTDサーバーとの連携
社内システムやIoTデバイスからのデータをExcelに流したい場合、RTDサーバーを自作する選択肢もあります。Microsoftの公式ドキュメントには IRTDServer インターフェースの実装サンプルが用意されています。C# / VB.NET / VBA など複数の言語で記述できます。
自作RTDサーバーから値を受け取る側のExcel数式は、市販製品と同じ書式です。
=RTD("MyOrg.SensorRTD", , "SENSOR-001", "value")
=RTD("MyOrg.SensorRTD", , "SENSOR-001", "status")
サーバー側で1秒ごとに UpdateNotify を呼ぶ実装にしておけば、Excel側でほぼ遅延なく値が更新されます。
活用例4:VBAと組み合わせたアラート発火
RTDで取得した値をトリガーに、VBAで通知やログ保存を自動化することもできます。値が閾値を超えたタイミングでOutlookメールを送る、別シートにタイムスタンプ付きで履歴を残すといった処理が定番です。
Private Sub Worksheet_Calculate()
Dim rng As Range
Set rng = Me.Range("B2")
If rng.Value > 100 Then
Application.EnableEvents = False
Me.Range("D2").Value = "★閾値超過 " & Now
Application.EnableEvents = True
End If
End Sub
Worksheet_Calculate イベントは、RTDによる再計算でも発火します。EnableEvents = False で囲んでイベントの無限ループを防ぐ点だけ注意してください。VBAのイベント設計をしっかり押さえたい場合は、ExcelVBAの自動化ガイド もあわせて参照してください。
RTD関数でよくあるエラーと対処法(N/A・接続失敗・更新されない)
RTD関数のトラブルは「サーバー側」「Excel設定」「数式」「ネットワーク」のどこかに原因があります。症状別に切り分けていきましょう。
#N/A エラー:サーバーに接続できない
| 原因 | 対処 |
|---|---|
| RTDサーバーが起動していない | サーバープログラムを起動。サービス化されている場合は services.msc で稼働状況を確認 |
| ProgID が間違っている | レジストリ HKEY_CLASSES_ROOT で正確な ProgID を確認。typo がないかチェック |
| COM コンポーネントが未登録 | regsvr32 で DLL を再登録。インストーラ付属のセットアップを再実行 |
| 32bit / 64bit の不一致 | Excelのビット数とサーバーのビット数を揃える(混在不可) |
#VALUE! エラー:トピックが解釈できない
| 原因 | 対処 |
|---|---|
| トピック名が辞書にない | サーバーのドキュメントで正しい名称を確認 |
| 引数の数や型が仕様外 | 引数を文字列として渡す。空セルを "" に置き換える |
| データ型の変換に失敗 | サーバー側の戻り値型を確認。VALUE 関数で明示的に数値化 |
#REF! エラー:接続が途中で切れた
| 原因 | 対処 |
|---|---|
| サーバー側のクラッシュ | プロセスを再起動。イベントログでエラー詳細を確認 |
| ネットワーク切断 | ping や Test-NetConnection で経路を確認 |
| DCOM 権限不足 | dcomcnfg でアクセス権・起動権を確認・付与 |
データが更新されない
エラー値は出ていないのに値が動かない、というケースもよくあります。原因と対処は以下のとおりです。
| 原因 | 対処 |
|---|---|
| 計算モードが手動 | 数式 → 計算方法の設定 を「自動」に変更 |
ThrottleInterval が長すぎ | Application.RTD.ThrottleInterval = 2000 で2秒に戻す |
| マクロセキュリティで COM がブロック | トラストセンター → マクロの設定 を確認 |
| サーバーが Heartbeat を返していない | サーバー側ログで通知送信状況を確認 |
セキュリティ警告でブロックされる
「セキュリティに関する警告:COMサーバーをアクティブ化しようとしました」と表示される場合は、信頼できる発行元のサーバーであることを確認したうえで許可してください。出所不明なRTDサーバーは絶対に有効化しないことが鉄則です。
トラブル切り分けの基本フロー
- サーバー単体で動くか確認:付属のテストツールがあれば先にそちらで疎通を取る
- 別の簡単なトピックで試す:複雑な数式の前に「サーバー側のサンプルトピック」で接続だけ確認
- 同じPCでローカル接続を試す:リモート問題かExcel側問題かの切り分けに有効
- イベントログ・サーバーログを見る:Windowsの「アプリケーション」ログにエラーが出ていることが多い
ExcelのRTD関数 よくある質問(FAQ)
Q1. RTD関数は Microsoft 365 でなくても使えますか?
はい、使えます。RTD関数は Excel 2002 以降の全Windows版 に標準搭載されています。Microsoft 365 サブスクリプションは必須ではありません。ただし Mac版Excelでは利用不可 です。MacにはWindowsと同じCOM基盤が存在しないためです。Macで類似のことをしたい場合は、Power QueryでのAPI定期取得や、Office Scriptsでの代替を検討してください。
Q2. RTDサーバーは自分で作れますか?
はい、作れます。Microsoftの公式ドキュメントに IRTDServer インターフェース仕様が公開されており、C# / VB.NET / Delphi などで実装できます。ただしCOM登録・DCOM設定・ビット数管理など、Excel関数を「書く」よりも前段で覚えることが多めです。自社でIoTデータをExcelに流したいといった要件であれば、社内の開発リソースと相談しながら段階的に進めるのが現実的です。
Q3. RTD関数とPower Queryはどちらを使うべきですか?
更新の 粒度 で使い分けます。秒〜数秒単位で値が変わるデータ(株価・為替・センサー)はRTD関数が向きます。数分〜数時間に1回の更新で十分なデータ(Web上のCSV、社内DBのスナップショット)はPower Queryのほうが扱いやすく、可視化や変換の自由度も高くなります。ファイルを開いたときの自動更新でよければPower Query、開きっぱなしで流し見したいならRTD、と覚えておくと選びやすいです。
Q4. RTD関数で取得した値を別のセルで計算に使えますか?
使えます。RTDが返す値は通常のセル値と同じように扱えます。四則演算・IF判定・条件付き書式・グラフのデータソースなど、Excelのあらゆる機能と組み合わせられます。値が更新されるたびに参照先の数式も再計算されるので、リアルタイム集計のダッシュボードが組みやすいのがRTDの強みです。
Q5. RTD関数の更新でCPU使用率が高くなりすぎます。どう抑えればよいですか?
主に3つの方法で抑えられます。まず Application.RTD.ThrottleInterval を 2000〜5000 程度に引き上げ、更新間隔を広げます。次に、不要なトピックの購読を減らします。表示しなくなった列のRTD関数は削除するか、別シートに退避させてください。さらに、サーバー側にThrottling機能がある場合は、サーバー側で配信頻度を間引く設定を行うのも有効です。
Q6. ExcelファイルにRTD関数を残したまま閉じても問題ないですか?
問題はありません。ただし次回ファイルを開いたときに、RTDサーバーが稼働しているマシンと再接続できる状態である必要があります。サーバーが停止している環境でファイルを開くと、セルに #N/A が並ぶことになります。配布用のファイルでRTD関数を含める場合は、サーバーがない閲覧者向けに 値貼り付けのスナップショットシート を別途用意しておくと親切です。
まとめ
RTD関数のポイントを整理します。
- RTD関数は、外部の RTDサーバー と COM 通信し、リアルタイム値をExcelセルに表示する関数
- 構文は
=RTD(ProgID, Server, Topic1, [Topic2], ...)のシンプル3要素+追加トピック - ProgID とトピックの仕様は サーバー提供元のドキュメント が一次情報。まずはそこを読む
- DDE は既定で無効化されており、MicrosoftはRTDへの移行を推奨している
- 株価・為替・センサー・物流・コールセンターなど、秒単位で変わるデータの表示に最適
- エラーの切り分けは「サーバー → COM登録 → 数式 → ネットワーク → セキュリティ設定」の順
- Macでは使えない。MacならPower QueryやOffice Scriptsでの代替を検討する
RTD関数はやや専門性が高いものの、対応するRTDサーバーさえあれば、Excelを リアルタイムダッシュボード として活用できる強力な機能です。最初の一歩は、自社で使っている業務システムやデータプロバイダーが「RTD対応」を謳っているかを確認することです。対応していれば、本記事の数式テンプレートをコピペするだけで、すぐに値が流れ込んでくるはずです。