Een RealTimeData-server maken voor Excel

Vertaalde artikelen Vertaalde artikelen
Artikel ID: 285339 - Bekijk de producten waarop dit artikel van toepassing is.
Alles uitklappen | Alles samenvouwen

Samenvatting

Microsoft Excel bevat een nieuwe werkbladfunctie, RTG, waarmee u een COM-automatiseringsserver (Component Object Model) kunt aanroepen om gegevens in real-time op te halen. In dit artikel wordt beschreven hoe u met Visual Basic een RTG-server maakt die u bij de RTG-functie van Excel kunt gebruiken.

Meer informatie

De RTG-werkbladfunctie heeft de volgende syntaxis:
=RTG(Prog-id;Server;Onderwerp1,[Onderwerp2],...)
Het eerste argument, Prog-id, staat voor de Prog-id van de RTG-server. Het argument Server verwijst naar de naam van de computer waarop de RTG-server wordt uitgevoerd. Dit argument kan leeg zijn of worden weggelaten als de RTG-server lokaal wordt uitgevoerd. De overige argumenten geven parameters aan die naar de RTG-server worden verzonden. Elke unieke combinatie van deze parameters vertegenwoordigt één 'onderwerp' met een bijbehorende onderwerp-id. Parameters zijn hoofdlettergevoelig. In het volgende voorbeeld ziet u drie aanroepen van de RTG-server die resulteren in drie afzonderlijke onderwerp-id's:
=RTG("ExcelRTD.RTDFunctions";;"AAA"'; "10")

=RTG("ExcelRTD.RTDFunctions";;"AAA"; "5")

=RTG("ExcelRTD.RTDFunctions";;"aaa"; "5")
Als u een COM-automatiseringsserver als RTG-server wilt gebruiken bij de RTG-functie van Excel, moet u de interface IRTDServer implementeren. Hierbij moet u alle methoden van IRTDServer implementeren:

ServerStart
Deze methode wordt aangeroepen als Excel om het eerste RTG-onderwerp voor de server vraagt. ServerStart geeft een 1 als resultaat bij een geslaagde poging, en een negatieve waarde of 0 bij een mislukte poging. De eerste parameter van de methode ServerStart is een terugbelobject waarmee de RTG-server aan Excel doorgeeft wanneer updates van de RTG-server moeten worden verzameld.
ServerTerminate
Deze methode wordt aangeroepen als Excel geen RTG-onderwerpen van de RTG-server meer nodig heeft.
ConnectData
Deze methode wordt aangeroepen wanneer Excel om een nieuw RTG-onderwerp van de RTG-server vraagt.
DisconnectData
Deze methode wordt aangeroepen als Excel een bepaald onderwerp niet meer nodig heeft.
HeartBeat
Deze methode wordt door Excel aangeroepen als een bepaald interval is verstreken sinds de laatste keer dat er updates op de RTG-server werden gemeld aan Excel.
RefreshData
Deze methode wordt aangeroepen wanneer Excel om vernieuwing van onderwerpen vraagt. RefreshData wordt aangeroepen nadat de server aan Excel heeft doorgegeven dat er updates zijn. De methode retourneert het aantal onderwerpen waarvoor een update beschikbaar is, samen met de onderwerp-id en waarde voor elk onderwerp.

Voorbeeld van een RTG-server maken

In het volgende voorbeeld wordt aangegeven hoe u een RTG-server maakt en gebruikt in combinatie met Microsoft Excel 2002. Deze server biedt een teller die elke 10 seconden wordt bijgewerkt op een werkblad. De server accepteert maximaal twee onderwerptekenreeksen. De eerste onderwerptekenreeks kan AAA, BBB en CCC zijn. Andere onderwerptekenreeksen worden als ongeldig beschouwd, en de server retourneert #WAARDE! naar de RTG-functie. De tweede tekenreeks is een numerieke waarde die aangeeft hoe de retourwaarde moet worden verhoogd. Als de tweede tekenreeks wordt weggelaten, wordt de standaardwaarde 1 gebruikt. Als de tweede tekenreeks niet numeriek is, retourneert de server #NUM! naar de RTG-functie.
  1. Maak een nieuw ActiveX DLL-project in Visual Basic.
  2. Klik op Verwijzingen in het menu Project, selecteer de objectbibliotheek voor Excel en klik op OK.
    Voor Microsoft Excel 2002: Microsoft Excel 10.0-objectbibliotheek
  3. Voor Microsoft Office Excel 2003: Microsoft Excel 11.0-objectbibliotheek
  4. Klik op Project1 Properties in het menu Project. Wijzig de projectnaam in ExcelRTD en klik op OK.
  5. Wijzig de eigenschap Name van de klassemodule Class1 in RTDFunctions. Voeg de volgende code toe aan RTDFunctions:
    Option Explicit
    
    Implements IRtdServer  'Interface waarmee Excel verbinding kan maken met deze RTG-server
    
    Private m_colTopics As Collection
        
    Private Function IRtdServer_ConnectData(ByVal TopicID As Long, Strings() As Variant, GetNewValues As Boolean) As Variant
        '** ConnectData wordt aangeroepen wanneer om een nieuw RTG-onderwerp wordt gevraagd
        
        'Maak een nieuwe onderwerpklasse met de opgegeven onderwerp-id en voeg de klasse toe aan de
        'verzameling m_colTopics
        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)
        
        'In dit voorbeeld is de beginwaarde voor een nieuw onderwerp altijd 0
        IRtdServer_ConnectData = oTopic.TopicValue
        
        Debug.Print "ConnectData", TopicID
    End Function
    
    Private Sub IRtdServer_DisconnectData(ByVal TopicID As Long)
       '** DisconnectData wordt aangeroepen wanneer een bepaald onderwerp niet meer nodig is
       
       'Verwijder het onderwerp uit de verzameling
       m_colTopics.Remove CStr(TopicID)
       
       Debug.Print "DisconnectData", TopicID
    End Sub
    
    Private Function IRtdServer_Heartbeat() As Long
        '** HeartBeat wordt aangeroepen wanneer het heartbeatinterval is verstreken sinds de laatste keer
        '   dat Excel werd aangeroepen met UpdateNotify.
        Debug.Print "HeartBeat"
    End Function
    
    Private Function IRtdServer_RefreshData(TopicCount As Long) As Variant()
        '** RefreshData wordt aangeroepen wanneer Excel om vernieuwing van onderwerpen vraagt. RefreshData wordt aangeroepen
        '   nadat de server een UpdateNotify heeft verzonden. Deze methode retourneert het volgende:
        '   - Een waarde voor TopicCount (aantal onderwerpen waarvoor een update beschikbaar is)
        '   - Een tweedimensionale matrix met varianten, die de onderwerp-id's en de
        '     nieuwe waarden van elk onderwerp bevat.
       
        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 & " bijgewerkte onderwerpen"
    End Function
    
    Private Function IRtdServer_ServerStart(ByVal CallbackObject As Excel.IRTDUpdateEvent) As Long
        '** ServerStart wordt aangeroepen wanneer het eerste RTG-onderwerp wordt aangevraagd
        
        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       'Elke waarde <1 geeft mislukking aan.
        
        Debug.Print "ServerStart"
    End Function
    
    Private Sub IRtdServer_ServerTerminate()
        '** ServerTerminate wordt aangeroepen wanneer Excel geen onderwerpen meer nodig heeft.
        
        KillTimer 0, g_TimerID
    
        '** Verwijder eventuele resterende onderwerpen. Dit wordt hier gedaan omdat
        '   IRtdServer_DisconnectData alleen wordt aangeroepen als de verbinding met een onderwerp wordt verbroken
        '   terwijl de werkmap is geopend. De items die achterblijven in de verzameling wanneer de verbinding wordt verbroken,
        '   zijn de onderwerpen die actief waren toen de werkmap werd gesloten.
    
        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
    
    					
  6. Klik op Add Class Module in het menu Project. Wijzig de eigenschap Name van de klassemodule in Topic en wijzig de eigenschap Instancing in Private. Voeg de volgende code toe aan de klassemodule 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) 'Retourneer #VALUE als dit niet een van de weergegeven onderwerpen is
        End If
    End Property
    
    Friend Sub Update()
        On Error Resume Next 'De volgende bewerking mislukt als m_Value een foutwaarde is (zoals #NUM of #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) 'Retourneer #NUM als de verhoging geen numerieke waarde is
        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
    					
  7. Klik op Add Module in het menu Project. Voeg de volgende code toe aan de nieuwe module:
    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
    					
  8. Klik op Make ExcelRTD.dll in het menu File om het onderdeel samen te stellen.

De RTG-server gebruiken in Excel

  1. Maak een nieuwe werkmap in Microsoft Excel.
  2. Typ de volgende formule in cel A1 en druk op Enter:
    =RTG("ExcelRTD.RTDFunctions";;"AAA"; 5)
    De eerste retourwaarde is 'AAA: 0'. Na vijf seconden wordt de waarde bijgewerkt tot 'AAA: 10', na tien seconden wordt de waarde bijgewerkt tot 'AAA:15', enzovoort.

  3. Typ de volgende formule in cel A2 en druk op Enter:
    =RTG("ExcelRTD.RTDFunctions";;"BBB"; 3)
    De eerste retourwaarde is 'BBB: 0'. Elke vijf seconden wordt de celwaarde verhoogd met 3.

  4. Typ de volgende formule in cel A3 en druk op Enter:
    =RTG("ExcelRTD.RTDFunctions";;"AAA"; 5)
    De eerste retourwaarde komt overeen met de inhoud van cel A1, omdat dit hetzelfde 'onderwerp' is als voor cel A1.

  5. Typ de volgende formule in cel A4 en druk op Enter:
    =RTG("ExcelRTD.RTDFunctions";;"AAA"; 10)
    De eerste retourwaarde is 'AAA: 0'. Elke vijf seconden wordt de celwaarde verhoogd, net als de andere cellen. De retourwaarde komt niet overeen met de inhoud van cel A1 en A3 omdat er een andere combinatie parameters is doorgegeven aan de server.
In dit voorbeeld werd de RTG-server gecompileerd en werd in Excel de runtimeversie van het onderdeel gebruikt. U kunt RTB-servers ook uitvoeren vanuit de Visual Basic IDE om fouten op te sporen.

Ga als volgt te werk als u de RTB-server wilt uitvoeren in de foutopsporingsmodus:
  1. Sluit Microsoft Excel af en schakel over naar het project in Visual Basic.
  2. Druk op F5 om het onderdeel te starten. Als het dialoogvenster Projecteigenschappen wordt weergegeven, klikt u op OK om de standaardoptie Wachten tot de onderdelen zijn gemaakt te selecteren.
  3. Zorg ervoor dat het venster Direct wordt weergegeven in Visual Basic. Terwijl u formules in de cellen invoert en de cellen worden bijgewerkt, controleert u de inhoud van het venster Direct in Visual Basic om te zien met welke acties de verschillende gebeurtenissen worden geactiveerd.
Opmerking over de gebeurtenis DisconnectData

Zolang Excel verbinding met uw RTG-server heeft, wordt de gebeurtenis DisconnectData geactiveerd als een bepaald onderwerp niet meer nodig is (wanneer u bijvoorbeeld een RTG-formule in een cel verwijdert of een cel met een RTG-formule leegmaakt). DisconnectData wordt niet aangeroepen voor elk onderwerp voor de RTG-server zodra het werkboek wordt gesloten of Excel wordt afgesloten. In dat geval wordt alleen ServerTerminate aangeroepen. Als u een RTG-server maakt, kunt u hierin het beste code opnemen om onderwerpen of andere objecten te verwijderen wanneer de gebeurtenis ServerTerminate wordt geactiveerd.

(c) Microsoft Corporation 2001. Alle rechten voorbehouden. Bijdragen: Lori B. Turner, Microsoft Corporation.

Referenties

Klik op het volgende artikelnummer in de Microsoft Knowledge Base voor meer informatie:
284883RTD Server verzendt geen meldingsbericht voor updates naar meerdere exemplaren van Excel

Eigenschappen

Artikel ID: 285339 - Laatste beoordeling: maandag 4 september 2006 - Wijziging: 4.1
De informatie in dit artikel is van toepassing op:
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Visual Basic 6.0 Professional Edition
Trefwoorden: 
kbautomation kbhowto KB285339

Geef ons feedback

 

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