現在オフラインです。再接続するためにインターネットの接続を待っています

Excel 用の RealTimeData サーバーを作成する方法

Office 2003 のサポートは終了しました

マイクロソフトでは、2014 年 4 月 8 日に Office 2003 のサポートを終了しました。この変更は、ソフトウェアの更新プログラムおよびセキュリティ オプションに影響しています。 この変更の意味および保護された状態を維持する方法について説明します。

概要
Microsoft Excel には、RTD という新しいワークシート関数が導入されました。この関数を使用すると、Component Object Model (COM) オートメーション サーバーを呼び出し、そのデータをリアルタイムに取得することができます。この資料では、Visual Basic を使用して、Excel の RTD 関数で使用できる RealTimeData サーバーを作成する方法について説明します。
詳細
RTD ワークシート関数では、次の構文を使用します。
=RTD(ProgID,Server,String1,[String2],...)
最初の引数である ProgID には、RealTimeData サーバーのプログラム識別子 (ProgID) を指定します。2 番目の引数である Server には、RealTimeData サーバーが実行されているコンピュータの名前を指定します。RealTimeData サーバーをローカルで実行する場合は、この引数に NULL 文字列を設定するか、この引数を省略することができます。3 番目以降の引数には、RealTimeData サーバーに送信するパラメータを単純に指定します。ここに指定したパラメータの一意の組み合わせが 1 つの "トピック" となり、"トピック ID" が関連付けられます。パラメータでは大文字と小文字が区別されます。たとえば、RTD サーバーの呼び出しを行う以下のパラメータでは、異なる 3 つのトピック ID が生成されます。
=RTD("ExcelRTD.RTDFunctions",,"AAA", "10")

=RTD("ExcelRTD.RTDFunctions",,"AAA", "5")

=RTD("ExcelRTD.RTDFunctions",,"aaa", "5")
COM オートメーション サーバーを、Excel の RTD 関数で使用する RealTimeData サーバーとするには、IRTDServer インターフェイスを実装する必要があります。サーバーには、IRTDServer のすべてのメソッドが実装されている必要があります。

ServerStart
Excel でサーバーからの最初の RTD トピックが必要なときに呼び出されます。ServerStart では、処理が正常に終了したときは 1 が、失敗したときには負の値または 0 が返されます。ServerStart メソッドの最初のパラメータは、RealTimeData サーバーから更新内容を収集する必要があることを Excel に通知するために、RealTimeData サーバーが使用するコールバック オブジェクトです。
ServerTerminate
Excel で RealTimeData サーバーからの RTD トピックをそれ以上要求しないときに呼び出されます。
ConnectData
Excel で RealTimeData サーバーから新しい RTD トピックを要求するときに必ず呼び出されます。
DisconnectData
Excel で特定のトピックをそれ以上要求しないときに必ず呼び出されます。
HeartBeat
Excel が RealTimeData サーバーから更新内容の通知を最後に受け取ったときから、指定した時間が経過すると、Excel によって呼び出されます。
RefreshData
Excel でトピックの更新を要求するときに呼び出されます。RefreshData は、サーバーから Excel に更新内容が存在することが通知された後に呼び出され、更新対象のトピック数と共に、各トピックのトピック ID およびその値が返されます。

サンプルの RealTimeData サーバーを作成する

以下のサンプルでは、Microsoft Excel 2002 で RealTimeData サーバーを作成し、使用する方法について具体的に説明します。このサーバーは、単純にワークシート上で 10 秒ごとに更新されるカウンタを提供します。サーバーは、最大 2 つのトピック文字列を受け取ります。最初のトピック文字列には、AAA、BBB、または CCC を指定できます。これ以外のトピック文字列はすべて無効と見なされ、サーバーから RTD 関数に対して #VALUE! が返されます。2 番目の文字列には、戻り値の増分を示す数値を指定します。2 番目の文字列を省略すると、増分値はデフォルトの 1 に設定されます。2 番目の文字列が数値でない場合は、サーバーから RTD 関数に対して #NUM! が返されます。
  1. Visual Basic で、新しい ActiveX DLL プロジェクトを作成します。
  2. [プロジェクト] メニューの [参照設定] をクリックし、Excel のオブジェクト ライブラリのチェック ボックスをオンにして、[OK] をクリックします。
    Microsoft Excel 2002 の場合 : Microsoft Excel 10.0 Object Library
    Microsoft Office Excel 2003 の場合 : Microsoft Excel 11.0 Object Library
  3. [プロジェクト] メニューの [Project1 のプロパティ] をクリックします。[プロジェクト名] を ExcelRTD に変更し、[OK] をクリックします。
  4. クラス モジュール Class1 の [名前] プロパティを RTDFunctions に変更します。RTDFunctions に、次のコードを追加します。
    Option ExplicitImplements IRtdServer  'Interface allows Excel to contact this RealTimeData serverPrivate m_colTopics As Collection    Private Function IRtdServer_ConnectData(ByVal TopicID As Long, Strings() As Variant, GetNewValues As Boolean) As Variant    '** ConnectData is called whenever a new RTD topic is requested        'Create a new topic class with the given TopicId and string and add it to the    'm_colTopics collection    Dim oTopic As New Topic    m_colTopics.Add oTopic, CStr(TopicID)    oTopic.TopicID = TopicID    oTopic.TopicString = Strings(0)    If UBound(Strings) >= 1 Then oTopic.SetIncrement Strings(1)        'For this example, the initial value for a new topic is always 0    IRtdServer_ConnectData = oTopic.TopicValue        Debug.Print "ConnectData", TopicIDEnd FunctionPrivate Sub IRtdServer_DisconnectData(ByVal TopicID As Long)   '** DisconnectData is called whenever a specific topic is not longer needed      'Remove the topic from the collection   m_colTopics.Remove CStr(TopicID)      Debug.Print "DisconnectData", TopicIDEnd SubPrivate Function IRtdServer_Heartbeat() As Long    '** Called by Excel if the heartbeat interval has elapsed since the last time    '   Excel was called with UpdateNotify.    Debug.Print "HeartBeat"End FunctionPrivate Function IRtdServer_RefreshData(TopicCount As Long) As Variant()    '** Called when Excel is requesting a refresh on topics. RefreshData will be called    '   after an UpdateNotify has been issued by the server. This event should:    '   - supply a value for TopicCount (number of topics to update)    '   - return a two dimensional variant array containing the topic ids and the    '     new values of each.       Dim oTopic As Topic, n As Integer    ReDim aUpdates(0 To 1, 0 To m_colTopics.Count - 1) As Variant    For Each oTopic In m_colTopics        oTopic.Update        aUpdates(0, n) = oTopic.TopicID        aUpdates(1, n) = oTopic.TopicValue        n = n + 1    Next    TopicCount = m_colTopics.Count    IRtdServer_RefreshData = aUpdates      Debug.Print "RefreshData", TopicCount & " topics updated"End FunctionPrivate Function IRtdServer_ServerStart(ByVal CallbackObject As Excel.IRTDUpdateEvent) As Long    '** ServerStart is called when the first RTD topic is requested        Set oCallBack = CallbackObject    Set m_colTopics = New Collection    g_TimerID = SetTimer(0, 0, TIMER_INTERVAL, AddressOf TimerCallback)    If g_TimerID > 0 Then IRtdServer_ServerStart = 1       'Any value <1 indicates failure.        Debug.Print "ServerStart"End FunctionPrivate Sub IRtdServer_ServerTerminate()    '** ServerTerminate is called when no more topics are needed by Excel.        KillTimer 0, g_TimerID    '** Cleanup any remaining topics. This is done here since     '   IRtdServer_DisconnectData is only called if a topic is disconnected     '   while the book is open. Items left in the collection when we terminate    '   are those topics left running when the workbook was closed.    Dim oTopic As Topic    For Each oTopic In m_colTopics        m_colTopics.Remove CStr(oTopic.TopicID)        Set oTopic = Nothing    Next    Debug.Print "ServerTerminate"  End Sub					
  5. [プロジェクト] メニューの [クラス モジュールの追加] をクリックします。クラス モジュールの [名前] プロパティを Topic に、[インスタンス作成] プロパティを [Private] に、それぞれ変更します。Topic クラス モジュールに、次のコードを追加します。
    Option ExplicitPrivate m_TopicID As LongPrivate m_TopicString As StringPrivate m_Value As VariantPrivate m_IncrementVal As LongPrivate Sub Class_Initialize()    m_Value = 0    m_IncrementVal = 1End SubFriend Property Let TopicID(ID As Long)    m_TopicID = IDEnd PropertyFriend Property Get TopicID() As Long    TopicID = m_TopicIDEnd PropertyFriend Property Let TopicString(s As String)    s = UCase(s)    If s = "AAA" Or s = "BBB" Or s = "CCC" Then        m_TopicString = s    Else        m_Value = CVErr(xlErrValue) 'Return #VALUE if not one of the listed topics    End IfEnd PropertyFriend Sub Update()    On Error Resume Next 'the next operation will fail if m_Value is an error (like #NUM or #VALUE)    m_Value = m_Value + m_IncrementValEnd SubFriend Sub SetIncrement(v As Variant)    On Error Resume Next    m_IncrementVal = CLng(v)    If Err <> 0 Then        m_Value = CVErr(xlErrNum) 'Return #NUM if Increment value is not numeric    End IfEnd SubFriend Property Get TopicValue() As Variant    If Not (IsError(m_Value)) Then        TopicValue = m_TopicString & ": " & m_Value    Else        TopicValue = m_Value    End IfEnd Property					
  6. [プロジェクト] メニューの [モジュールの追加] をクリックします。新しいモジュールに、次のコードを追加します。
    Public Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, _ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As LongPublic Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As LongPublic Const TIMER_INTERVAL = 5000Public oCallBack As Excel.IRTDUpdateEventPublic g_TimerID As LongPublic Sub TimerCallback(ByVal hWnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)    oCallBack.UpdateNotifyEnd Sub					
  7. [ファイル] メニューの [ExcelRTD.dll の作成] をクリックし、コンポーネントをビルドします。

Excel で RTD サーバーを使用する

  1. Microsoft Excel で新しいブックを作成します。
  2. セル A1 に次の数式を入力し、Enter キーを押します。
    =RTD("ExcelRTD.RTDFunctions",,"AAA", 5)
    最初の戻り値は "AAA: 0" です。5 秒後、値は "AAA: 10" に更新されます。10 秒後、値は "AAA:15" に更新されます。同様に処理が繰り返されます。

  3. セル A2 に次の数式を入力し、Enter キーを押します。
    =RTD("ExcelRTD.RTDFunctions",,"BBB", 3)
    最初の戻り値は "BBB: 0" です。5 秒ごとに、セルの値は 3 ずつ大きくなります。

  4. セル A3 に次の数式を入力し、Enter キーを押します。
    =RTD("ExcelRTD.RTDFunctions",,"AAA", 5)
    最初の戻り値は、セル A1 の内容と一致します。これは、ここでは A1 と同じトピックを使用しているためです。

  5. セル A4 に次の数式を入力し、Enter キーを押します。
    =RTD("ExcelRTD.RTDFunctions",,"AAA", 10)
    最初の戻り値は "AAA: 0" です。5 秒ごとに、セルの値は他のセルと同様に増分されます。この戻り値は、セル A1 や A3 の内容とは一致しません。これは、サーバーに渡されるパラメータの組み合わせが A1 または A3 とは異なるためです。
ここで示した例では、RTD サーバーのコンパイルを実行し、Excel ではコンポーネントのランタイム バージョンを使用しました。デバッグを行う場合は、Visual Basic IDE で RTD サーバーを実行することができます。

デバッグ モードで実行するには、以下の手順を実行します。
  1. Microsoft Excel を終了し、Visual Basic で対象プロジェクトに切り替えます。
  2. F5 キーを押し、コンポーネントを起動します。プロジェクトのプロパティに関するダイアログ ボックスが表示される場合は、[OK] をクリックし、デフォルトのオプションである [コンポーネントが作成されるまで待機する] をクリックします。
  3. Visual Basic にイミディエイト ウィンドウが表示されていることを確認します。セルに数式を入力したとき、またセルが更新されたときに、Visual Basic のイミディエイト ウィンドウに表示される内容をチェックして、どのアクションによってそれぞれのイベントが発生しているのかを確認します。
DisconnectData イベントに関する注

Excel が RTD サーバーへのサブスクライバである場合、トピックが必要なくなった時点で (たとえば、セルの RTD 関数の数式を削除またはクリアしたときなど)、Excel は DisconnectData イベントを発生させます。ただし、Excel ブックが閉じられたときや Excel が終了されたときは、RTD サーバーのトピックに対して個別に DisconnectData を呼び出すことはしません。この場合に Excel が呼び出すのは、ServerTerminate だけです。したがって、RTD サーバーを作成するときには、ServerTerminate イベントの発生時にトピックまたはその他のオブジェクトを必要に応じてクリーンアップするためのコードを作成する必要があります。

(c) Microsoft Corporation 2001, All Rights Reserved. Contributions by Lori B. Turner, Microsoft Corporation.

関連情報
関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
284883 RTD サーバーから複数の Excel インスタンスに更新通知を送信できない
プロパティ

文書番号:285339 - 最終更新日: 02/13/2006 06:31:00 - リビジョン: 4.1

Microsoft Office Excel 2003, Microsoft Excel 2002 Standard Edition, Microsoft Visual Basic 6.0 Professional Edition

  • kbhowto kbautomation KB285339
フィードバック
="http://c1.microsoft.com/c.gif?"> + (window.location.protocol) + "//c.microsoft.com/ms.js'><\/script>"); >