Je bent nu offline; er wordt gewacht tot er weer een internetverbinding is

Een RealTimeData-server maken voor Excel

De ondersteuning voor Office 2003 is beëindigd

De ondersteuning voor Office 2003 is door Microsoft beëindigd op 8 april. Deze wijziging heeft gevolgen voor software-updates en beveiligingsopties. Meer informatie over wat voor gevolgen dit voor u heeft en hoe u beveiligd blijft.

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 ExplicitImplements IRtdServer  'Interface waarmee Excel verbinding kan maken met deze RTG-serverPrivate 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", TopicIDEnd FunctionPrivate 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", TopicIDEnd SubPrivate 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 FunctionPrivate 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 FunctionPrivate 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 FunctionPrivate 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 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) 'Retourneer #VALUE als dit niet een van de weergegeven onderwerpen is    End IfEnd PropertyFriend 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_IncrementValEnd SubFriend 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 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					
  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 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					
  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 - Laatst bijgewerkt: 09/04/2006 13:49:47 - Revisie: 4.1

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

  • kbautomation kbhowto KB285339
Feedback
t" src="https://c.microsoft.com/ms.js">