Erstellen Sie einen RealTimeData Server für Excel

Zusammenfassung

Microsoft Excel bietet eine neue Tabellenblattfunktion FTE, die einen Component Object Model (COM) Automatisierungsserver Daten in Echtzeit aufrufen kann. Dieser Artikel beschreibt, wie mit Visual Basic ein RealTimeData Server für die Verwendung mit Excel RTD-Funktion erstellt.

Weitere Informationen

Die RTD-Funktion hat die folgende Syntax:
= RTD (ProgID, Server, Zeichenfolge1,[String2]... )
Das erste Argument ProgIDdarstellt Programmbezeichner (ProgID) des RealTimeData-Servers. Das Server -Argument gibt den Namen des Computers, auf dem RealTimeData-Server ausgeführt wird; Dieses Argument kann eine null-Zeichenfolge oder ausgelassen, wenn RealTimeData Server lokal ausgeführt wird. Die verbleibenden Argumente darstellen einfach Parameter an den Server RealTimeData; jede eindeutige Kombination dieser Parameter stellt eine "Thema" hat eine zugeordnete "Thema Id". Parameter Groß-/Kleinschreibung. Zeigt die folgenden Aufrufe der RTD-Server drei separaten Themen-Ids würde:
= RTD("ExcelRTD.RTDFunctions",,"AAA", "10")

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

= RTD("ExcelRTD.RTDFunctions",,"aaa", "5")
Für ein COM-RealTimeData Server mit Excel RTD-Funktion zu sein muss es IRTDServer -Schnittstelle implementieren. Der Server muss alle Methoden IRTDServerimplementieren:

ServerStart
Wird aufgerufen, wenn Excel das erste RTD-Thema für den Server anfordert. ServerStart sollte 1 für Erfolg und einen negativen Wert oder 0 bei einem Fehlschlag zurück. Der erste Parameter der Methode ServerStart ist ein Rückrufobjekt RealTimeData Server verwendet, um Excel zu benachrichtigen, wenn Updates vom Server RealTimeData erfasst werden soll.
ServerTerminate
Wird aufgerufen, wenn Excel RTD-Themen aus dem RealTimeData-Server nicht mehr benötigt.
ConnectData
Aufgerufen, wenn Excel ein neues RTD Thema von RealTimeData Server anfordert.
DisconnectData
Aufgerufen, wenn Excel ein bestimmtes Thema nicht mehr benötigt.
Takt
Von Excel aufgerufen, wenn ein angegebenes Intervall seit dem letzten Updates vom Server RealTimeData Excel benachrichtigt wurde.
RefreshData
Wird aufgerufen, wenn Excel eine Aktualisierung Themen anfordern. RefreshData wird aufgerufen, nachdem der Server Excel benachrichtigt, die Updates vorhanden sind, und gibt die Anzahl der Themen und die Themen-Id-Wert für jedes Thema aktualisieren zurück.

Beispiel RealTimeData Server erstellen

Das folgende Beispiel veranschaulicht das Erstellen und Verwenden eines RealTimeData Servers mit Microsoft Excel 2002. Dieser Server stellt einfach einen Zähler bereit, der alle 10 Sekunden auf einem Arbeitsblatt aktualisiert wird. Der Server akzeptiert zwei Thema Zeichenfolgen. Die erste Zeichenfolge Thema kann AAA, BBB und CCC sein. andere Thema-Zeichenfolge ist ungültig, und der Server gibt #VALUE! der RTD-Funktion. Die zweite Zeichenfolge ist einen numerischen Wert, der darstellt, wie der Rückgabewert erhöht werden sollte. Die zweite Zeichenfolge fehlt, ist der Standardwert Schrittweite 1. Wenn die zweite Zeichenfolge nicht numerisch ist, gibt der Server #NUM! der RTD-Funktion.
  1. Starten Sie ein neues ActiveX-DLL-Projekt in Visual Basic.
  2. Im Menü Projekt klicken Sie auf Referenzen, wählen Sie die Objektbibliothek für Ihre Version von Excel und klicken Sie dann auf OK. Wählen Sie z. B. die folgenden:
    • Wählen Sie Microsoft Excel 12.0-Objektbibliothekfür Microsoft Office Excel 2007.
    • Wählen Sie Microsoft Excel 11.0-Objektbibliothekfür Microsoft Office Excel 2003.
    • Wählen Sie für Microsoft Excel 2002 Microsoft Excel 10.0-Objektbibliothek.
  3. Klicken Sie im Menü Projekt auf Eigenschaften von Project1. Ändern Sie den Projektnamen in ExcelRTD
  4. Ändern Sie die Name -Eigenschaft des Klassenmoduls Class1 in RTDFunctions. RTDFunctionsden folgenden Code hinzufügen:
    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. Klicken Sie im Menü Projekt auf Klassenmodul hinzufügen. Ändern Sie das Klassenmodul Namenseigenschaft Thema und Instancing -Eigenschaft Privat. Fügen Sie folgenden Code zu dem Klassenmodul Thema :
    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. Wählen Sie im Menü Projekt auf Modul hinzufügen. Das neue Modul den folgenden Code hinzufügen:
    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. Klicken Sie im Menü Datei auf ExcelRTD.dll machen , um die Komponente zu erstellen.

Verwenden des RTD-Servers in Excel

  1. Starten Sie eine neue Arbeitsmappe in Microsoft Excel.
  2. Geben Sie in Zelle A1 die folgende Formel ein und drücken Sie dann die EINGABETASTE:
    = RTD("ExcelRTD.RTDFunctions",,"AAA", 5)
    Der anfängliche Rückgabewert "AAA: 0". Nach fünf Sekunden aktualisiert der Wert auf "AAA: 10" und nach 10 Sekunden der Wert "15" und So weiter.

  3. Geben Sie in Zelle A2 folgende Formel, und drücken Sie die EINGABETASTE:
    = RTD("ExcelRTD.RTDFunctions",,"BBB", 3)
    Der anfängliche Rückgabewert "BBB: 0". Alle fünf Sekunden erhöht den Zellenwert um 3.

  4. Geben Sie in Zelle A3 folgende Formel, und drücken Sie die EINGABETASTE:
    = RTD("ExcelRTD.RTDFunctions",,"AAA", 5)
    Der anfängliche Rückgabewert entspricht dem Inhalt der Zelle A1 ist dies die gleichen "Thema", die in A1 verwendet wird.

  5. Geben Sie in Zelle A4 folgende Formel, und drücken Sie die EINGABETASTE:
    = RTD("ExcelRTD.RTDFunctions",,"AAA", 10)
    Der anfängliche Rückgabewert "AAA: 0." alle fünf Sekunden Zelle Wert erhöht, wie die Zellen. Beachten Sie, dass der Rückgabewert nicht dem Inhalt der Zelle A1 und A3 unterscheidet die Kombination der Parameter an den Server übergeben.
Diese Darstellung wurde der RTD-Server und Excel verwendete Laufzeitversion der Komponente. RTD-Server können für das Debuggen von Visual Basic-IDE ausgeführt werden.

Im Debugmodus ausführen:
  1. Beenden Sie Microsoft Excel, und wechseln Sie zu dem Projekt in Visual Basic.
  2. Drücken Sie F5, um die Komponente zu starten. Erscheint im Dialogfeld Projekteigenschaften klicken Sie auf OK , um die Standardoption Warten Komponentenauszuwählen.
  3. Stellen Sie sicher, dass das Direktfenster in Visual Basic angezeigt wird. Überprüfen Sie eingeben von Formeln in den Zellen und Zellen aktualisiert werden, den Inhalt des Direktfensters im Visual Basic an, welche Aktionen verschiedene Ereignisse auslösen.
Hinweis zu DisconnectData-Ereignis

Während Excel RTD-Server abonniert ist, löst das DisconnectData -Ereignis bei einem Thema (z. B. löschen oder deaktivieren Sie eine RTD-Formel in einer Zelle) nicht mehr erforderlich. Jedoch ruft Excel nicht DisconnectData jedes Thema für die RTD-Server, wenn die Arbeitsmappe geschlossen oder Excel wird beendet. Stattdessen ruft Excel nur ServerTerminate. Beim Erstellen eines RTD-Servers sollten Sie code für alle notwendigen Bereinigung von Themen oder andere Objekte beim Auslösen des Ereignisses ServerTerminate .

(c) Microsoft Corporation 2001, alle Rechte vorbehalten. Beiträge von Lori B. Turner, Microsoft Corporation.

Referenzen

Klicken Sie für Weitere Informationen auf die folgende Artikelnummer, um den Artikel der Microsoft Knowledge Base anzuzeigen:

284883 RTD-Server Update-Benachrichtigung sendet keine an mehrere Instanzen von Excel

Eigenschaften

Artikelnummer: 285339 – Letzte Überarbeitung: 23.01.2017 – Revision: 1

Feedback