Wachtwoord vergeten?

Wachtwoord vergeten
Vul hier uw email adres in. U ontvangt dan een nieuw wachtwoord.

Een RealTimeData-server maken voor Excel

Gepost op 04-09-2006 - Microsoft Office - 0 reacties


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

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", TopicIDEnd 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", TopicIDEnd 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 LongPrivate m_TopicString As StringPrivate m_Value As VariantPrivate m_IncrementVal As Long
    Private Sub Class_Initialize() m_Value = 0 m_IncrementVal = 1End Sub
    Friend Property Let TopicID(ID As Long) m_TopicID = IDEnd Property
    Friend Property Get TopicID() As Long TopicID = m_TopicIDEnd 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 IfEnd 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_IncrementValEnd 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 IfEnd Sub
    Friend 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 Long
    Public Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
    Public Const TIMER_INTERVAL = 5000Public oCallBack As Excel.IRTDUpdateEventPublic g_TimerID As Long
    Public 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

PrintPrint RSS reactiesRSS reacties BookmarkBookmark

Gekoppelde tags

ActiveX, Cellen, DLL, Excel, Excel 2002, Excel 2003, Office, Project, Update, Visual Basic, Werkblad

Reacties
Nog geen reacties geplaatst.

Winkelmandje

Het winkelmandje is leeg

Inloggen
Als u hierboven op de knop 'bestellen' klikt krijgt u een overzicht van de door uw gewenste producten. Indien het overzicht compleet en correct is kunt via de wizard de verdere gegevens invullen en uw bestelling afronden. In het bestelproces kunt u altijd op 'vorige' drukken om terug te gaan in het proces. Bij Perrit staan vertrouwen, privacy en veiligheid op de eerste plaats, wij zullen uw gegevens dan ook met uiterste zorgvuldigheid behandelen en nooit doorgeven aan derden.

Perrit.nl Sherwood Rangers 29 Hengelo

Perrit.nl telefoon: +31 74 750 12 20

Kenniscentrum - Een RealTimeData-server maken voor Excel
Perrit Kenniscentrum - Een RealTimeData-server maken voor Excel