Wie Sie einen RealTimeData-Server für Excel erstellen

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 285339 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Zusammenfassung

Microsoft Excel bietet eine neue Tabellenfunktion RTD, die das Aufrufen eines COM-Automatisierungsserver zum Zweck der Abrufen von Daten in Echtzeit ermöglicht. Dieser Artikel beschreibt die Visual Basic verwenden, um einen RealTimeData Server für die Verwendung mit Excel RTD-Funktion zu erstellen.

Weitere Informationen

Die RTD-Tabellenfunktion verwendet die folgende Syntax:
= RTD(ProgID,Server,String1,[String2],...)
Das erste Argument, ProgID , stellt die programmgesteuerte ID (ProgID) des Servers RealTimeData dar. Das Server -Argument gibt den Namen der der Computer, auf dem der RealTimeData-Server ausgeführt wird; dieses Argument kann eine null-Zeichenfolge, oder ausgelassen, wenn der RealTimeData-Server lokal ausgeführt ist. Die verbleibenden Argumente einfach Parameter zum Senden an den Server RealTimeData darstellen; jede eindeutige Kombination dieser Parameter steht eine "Thema Thema-Id", hat eine zugeordnete"." Parameter sind Unterscheidung nach Groß-/Kleinschreibung. Der folgende Code zeigt beispielsweise, Aufrufe an die RTD-Server, der in drei separaten Thema Ids entstehen würden:
= RTD("ExcelRTD.RTDFunctions",,"AAA", "10")

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

= RTD("ExcelRTD.RTDFunctions",,"aaa", "5")
Für ein COM-Automatisierungsserver einen RealTimeData Server für die Verwendung mit Excel RTD-Funktion werden muss er die IRTDServer -Schnittstelle implementieren. Der Server muss alle IRTDServer -Methoden implementieren:

ServerStart
Aufgerufen, wenn Excel das erste Thema RTD für den Server anfordert. ServerStart sollte auf Erfolg, und einen negativen Wert oder 0 bei einer 1 zurückgeben. Der erste Parameter der ServerStart -Methode ist ein Callback-Objekt, der RealTimeData-Server verwendet, um Excel zu benachrichtigen, wenn Sie Updates von der RealTimeData sammeln sollten, Server.
ServerTerminate
Wird aufgerufen, wenn Excel RTD Themen aus der RealTimeData-Server nicht mehr benötigt.
ConnectData
Aufgerufen, wenn Excel ein neues RTD Thema vom RealTimeData Server anfordert.
DisconnectData
Wird aufgerufen, wenn Excel ein bestimmtes Thema nicht mehr benötigt.
Takt
Von Excel aufgerufen, wenn ein bestimmten Zeitraum seit der letzten abgelaufen Excel von Updates von der RealTimeData-Server benachrichtigt wurde.
RefreshData
Aufgerufen, wenn Excel eine Aktualisierung auf Themen anfordert. RefreshData aufgerufen, nachdem der Server Excel benachrichtigt, die Aktualisierungen vorhanden sind, und gibt die Anzahl der Themen, zusammen mit dem Thema-Id und Wert für jedes Thema aktualisieren zurück.

Erstellen Sie eine RealTimeData-Beispielserver

Das folgende Beispiel veranschaulicht, wie erstellen und einen RealTimeData-Server mit Microsoft Excel 2002 verwenden. Dieser Server stellt einfach einen Zähler, der alle 10 Sekunden in einem Arbeitsblatt aktualisiert wird. Der Server akzeptiert bis zu zwei Thema Zeichenfolgen. Die erste Zeichenfolge Thema kann AAA, BBB und CCC; andere Thema-Zeichenfolge als ungültig angesehen und der Server Fehlerwert! Der RTD-Funktion. Die zweite Zeichenfolge ist ein numerischer Wert, der darstellt, wie der Rückgabewert erhöht werden soll. Wenn die zweite Zeichenfolge weggelassen wird, Standardwert die Schrittweite 1. Die zweite Zeichenfolge nicht numerisch ist, gibt der Server Fehlerwert # Zahl! Der RTD-Funktion.
  1. Starten Sie ein neues ActiveX DLL-Projekt in Visual Basic.
  2. Im Menü Projekt klicken Sie auf Verweise auf die Objektbibliothek für Ihre Version von Excel, und klicken Sie dann auf OK . Beispielsweise Wählen Sie eine der folgenden:
    • Wählen Sie für Microsoft Office Excel 2007 Microsoft Excel 12.0-Objektbibliothek .
    • Wählen Sie für Microsoft Office Excel 2003 Microsoft Excel 11.0-Objektbibliothek .
    • Wählen Sie für Microsoft Excel 2002 Microsoft Excel 10.0-Objektbibliothek .
  3. Klicken Sie im Projekt auf Eigenschaften von Projekt1 . Ändern Sie den Projektnamen , ExcelRTD , und klicken Sie dann auf OK .
  4. Ändern Sie die Name -Eigenschaft des Klassenmoduls Class1 in RTDFunctions . Fügen Sie folgenden Code zu 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. Klicken Sie im Menü Projekt auf Klassenmodul hinzufügen . Ändern Sie das Klassenmodul Name -Eigenschaft zum Thema und ändern Sie die Instancing -Eigenschaft auf private . Fügen Sie zu dem Thema Klassenmodul den folgenden Code:
    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 Projekt die Option Modul hinzufügen . Fügen Sie folgenden Code in das neue Modul:
    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 Datei -Menü auf ExcelRTD.dll erstellen , 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 anschließend die [EINGABETASTE]:
    = RTD("ExcelRTD.RTDFunctions",,"AAA", 5)
    Der erste zurückgegebene Wert ist "AAA: 0". Nach fünf Sekunden aktualisiert der Wert auf "AAA: 10" und nach 10 Sekunden aktualisiert der Wert auf "AAA:15".

  3. Geben Sie in Zelle A2 die folgende Formel, und drücken Sie die [EINGABETASTE]:
    = RTD("ExcelRTD.RTDFunctions",,"BBB", 3)
    Der erste zurückgegebene Wert ist "BBB: 0". Alle fünf Sekunden der Wert der Zelle durch 3 erhöht.

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

  5. Geben Sie in Zelle A4 die folgende Formel, und drücken Sie die EINGABETASTE:
    = RTD("ExcelRTD.RTDFunctions",,"AAA", 10)
    Der erste zurückgegebene Wert ist "AAA: 0." alle fünf Sekunden der Zelle Wert erhöht, wie die anderen Zellen. Beachten Sie, dass return Wert nicht den Inhalt der Zelle A1 oder A3 übereinstimmt, da die Kombination von Parametern an den Server übergeben unterscheidet.
Diese Abbildung der RTD-Server wurde kompiliert und Excel wurde mit der Run-Time-Version der Komponente. Für Debugzwecke, RTD-Server aus der Visual Basic-Entwicklungsumgebung ausgeführt werden können.

So führen Sie in Debug-Modus:
  1. Beenden Sie Microsoft Excel, und wechseln Sie zu dem Projekt in Visual Basic.
  2. Drücken Sie F5, um die Komponente zu starten. Wenn im Dialogfeld Projekteigenschaften angezeigt wird, klicken Sie auf OK , um die Standardoption für Komponenten erstellt werden, warten auszuwählen.
  3. Stellen Sie sicher, dass das Direktfenster in Visual Basic angezeigt wird. Überprüfen Sie Sie Formeln in Zellen eingeben und die Zellen aktualisiert werden, den Inhalt des Direktfensters im Visual Basic zu sehen, welche Aktionen verschiedene Ereignisse ausgelöst werden.
Hinweis bezüglich das DisconnectData-Ereignis

Während Excel einen Abonnenten RTD-Server ist, löst das DisconnectData -Ereignis, wenn Sie ein Thema (z. B. beim Löschen oder deaktivieren eine RTD-Formel in einer Zelle) nicht mehr benötigt wird. Jedoch Excel nicht aufruft DisconnectData auf jedes Thema für die RTD-Server beim Schließen der Arbeitsmappe oder Excel wird beendet; stattdessen Excel ruft nur ServerTerminate . Wenn Sie einen RTD-Server erstellen, sollten Sie für alle erforderlichen Bereinigung von Themen oder anderen Objekten code Wenn das ServerTerminate -Ereignis ausgelöst wird.

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

Informationsquellen

Weitere Informationen finden Sie die folgende KB-Artikelnummer:
284883RTD-Server wird an mehreren Excel-Instanzen Update Benachrichtigungen nicht gesendet werden.

Eigenschaften

Artikel-ID: 285339 - Geändert am: Donnerstag, 29. März 2007 - Version: 5.1
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Office Excel 2007
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Visual Basic 6.0 Professional Edition
Keywords: 
kbmt kbexpertisebeginner kbautomation kbhowto KB285339 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 285339
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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