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

文書翻訳 文書翻訳
文書番号: 285339 - 対象製品
すべて展開する | すべて折りたたむ

概要

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 Explicit
    
    Implements IRtdServer  'Interface allows Excel to contact this RealTimeData server
    
    Private 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", TopicID
    End Function
    
    Private 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", TopicID
    End Sub
    
    Private 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 Function
    
    Private 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 Function
    
    Private 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 Function
    
    Private 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 Explicit
    
    Private m_TopicID As Long
    Private m_TopicString As String
    Private m_Value As Variant
    Private m_IncrementVal As Long
    
    Private Sub Class_Initialize()
        m_Value = 0
        m_IncrementVal = 1
    End Sub
    
    Friend Property Let TopicID(ID As Long)
        m_TopicID = ID
    End Property
    
    Friend Property Get TopicID() As Long
        TopicID = m_TopicID
    End Property
    
    Friend 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 If
    End Property
    
    Friend 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_IncrementVal
    End Sub
    
    Friend 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 If
    End Sub
    
    Friend Property Get TopicValue() As Variant
        If Not (IsError(m_Value)) Then
            TopicValue = m_TopicString & ": " & m_Value
        Else
            TopicValue = m_Value
        End If
    End 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 Long
    
    Public Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
    
    Public Const TIMER_INTERVAL = 5000
    Public oCallBack As Excel.IRTDUpdateEvent
    Public g_TimerID As Long
    
    Public Sub TimerCallback(ByVal hWnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
        oCallBack.UpdateNotify
    End 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 - 最終更新日: 2006年2月13日 - リビジョン: 4.1
この資料は以下の製品について記述したものです。
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Visual Basic 6.0 Professional Edition
キーワード:?
kbhowto kbautomation KB285339
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com