Du arbetar offline, väntar på att återansluta till Internet

Så här skapar du en RealTimeData-server för Excel

Supporten för Office 2003 har upphört

Microsoft upphörde med supporten för Office 2003 den 8 april 2014. Denna ändring påverkar dina programuppdateringar och säkerhetsalternativ. Läs om vad detta innebär för dig och hur du behåller skyddet.

Sammanfattning
Microsoft Excel innehåller en ny kalkylbladsfunktion, RTD, som du kan använda för att anropa en COM Automation-server (Component Object Model) för att hämta data i realtid. I artikeln beskrivs hur du använder Visual Basic för att skapa en RealTimeData-server och använder den med RTD-funktionen i Excel.
Mer Information
RTD-kalkylbladsfunktionen har följande syntax:
=RTD(ProgID,Server,String1,[String2],...)
Första argumentet, ProgID, motsvarar den programmässiga identifieraren (ProgID) för RealTimeData-servern. Argumentet Server visar namnet på datorn där RealTimeData-servern körs. Om servern ska köras lokalt kan argumentet vara en null-sträng eller utelämnas. Resterande argument är parametrar som skickas till RealTimeData-servern. Varje unik kombination av dessa parametrar motsvarar ett "avsnitt" med tillhörande "avsnitts-ID". Parametrarna är skiftlägeskänsliga. Följande exempel visar anrop till RTD-servern som ger tre skilda avsnitts-ID:n:
=RTD("ExcelRTD.RTDFunctions",,"AAA", "10")

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

=RTD("ExcelRTD.RTDFunctions",,"aaa", "5")
För att en COM Automation-server ska fungera som RealTimeData-server med Excels RTD-funktion måste gränssnittet IRTDServer implementeras i den. Alla metoder för IRTDServer måste implementeras i servern:

ServerStart
Anropas när det första RTD-avsnittet för servern begärs i Excel. ServerStart ska returnera 1 om begäran lyckas och ett negativt värde eller noll om den misslyckas. Den första parametern för metoden ServerStart är ett återanropsobjekt som används i RealTimeData-servern för att meddela Excel när uppdateringar ska inhämtas från RealTimeData-servern.
ServerTerminate
Anropas när det inte krävs fler RTD-avsnitt från RealTimeData-servern till Excel.
ConnectData
Anropas när ett nytt RTD-avsnitt från RealTimeData-servern begärs i Excel.
DisconnectData
Anropas när ett visst avsnitt inte längre behövs i Excel.
HeartBeat
Anropas i Excel om en viss tid har förflutit sedan senaste meddelandet om uppdateringar skickades från RealTimeData-servern till Excel.
RefreshData
Anropas när en uppdatering av avsnitt begärs i Excel. RefreshData anropas efter att ett meddelande har skickats från servern till Excel om att det finns en uppdatering och det returnerar antalet avsnitt som ska uppdateras tillsammans med avsnitts-ID och värde för varje avsnitt.

Skapa en RealTimeData-exempelserver

I följande exempel visas hur du skapar och använder en RealTimeData-server med Microsoft Excel 2002. Med denna server tillhandahålls en räknare som uppdateras var tionde sekund i ett kalkylblad. Server kan ta emot upp till två avsnittssträngar. Den första avsnittssträngen kan vara AAA, BBB eller CCC. Andra strängar är ogiltiga och servern returnerar #VALUE! till RTD-funktionen för sådana strängar. Den andra strängen är ett numeriskt värde som motsvarar ökningen av returvärdet. Om den andra strängen inte anges används 1 som ökningsvärde. Om strängen inte är numerisk returnerar servern #NUM! till RTD-funktionen.
  1. Skapa ett nytt ActiveX-DLL-projekt i Visual Basic.
  2. Klicka på ReferenserProjekt-menyn, markera objektbiblioteket för Excel och klicka sedan på OK.
    För Microsoft Excel 2002: Objektbibliotek för Microsoft Excel 10.0
  3. För Microsoft Office Excel 2003: Objektbibliotek för Microsoft Excel 11.0
  4. Klicka på Egenskaper för projekt1Verktyg-menyn. Ändra Projektnamn till ExcelRTD och klicka på OK.
  5. Ändra Name-egenskapen för klassmodulen Class1 till RTDFunctions. Lägg till följande kod i RTDFunctions:
    Option ExplicitImplements IRtdServer  'Gränssnitt för kontakt mellan Excel och denna RealTimeData-serverPrivate m_colTopics As Collection    Private Function IRtdServer_ConnectData(ByVal TopicID As Long, Strings() As Variant, GetNewValues As Boolean) As Variant    '** ConnectData anropas när ett RTD-avsnitt begärs        'Skapa en ny avsnittsklass med givet avsnitts-ID och sträng och lägg till den i    'm_colTopics-mängden    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)        'I detta exempel är startvärdet för ett nytt avsnitt alltid 0    IRtdServer_ConnectData = oTopic.TopicValue        Debug.Print "ConnectData", TopicIDEnd FunctionPrivate Sub IRtdServer_DisconnectData(ByVal TopicID As Long)   '** DisconnectData anropas när ett visst avsnitt inte behövs längre      'Ta bort avsnittet ur mängden   m_colTopics.Remove CStr(TopicID)      Debug.Print "DisconnectData", TopicIDEnd SubPrivate Function IRtdServer_Heartbeat() As Long    '** Anropas i Excel om heartbeat-intervallet har förflutit sedan senaste gången    '   Excel anropades med UpdateNotify.    Debug.Print "HeartBeat"End FunctionPrivate Function IRtdServer_RefreshData(TopicCount As Long) As Variant()    '** Anropas när en avsnittsuppdatering begärs i Excel. RefreshData anropas    '   när en UpdateNotify har skickats från servern. Med denna händelse ska:    '   - ett värde tillhandahållas för TopicCount (antal avsnitt som ska uppdateras)    '   - en tvådimensionell variantmatris returneras med avsnitts-ID:n    '     och nya värden för varje avsnitt.       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 & " uppdaterade avsnitt"End FunctionPrivate Function IRtdServer_ServerStart(ByVal CallbackObject As Excel.IRTDUpdateEvent) As Long    '** ServerStart anropas när det första RTD-avsnittet begärs        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       'Värden <1 indikerar fel.        Debug.Print "ServerStart"End FunctionPrivate Sub IRtdServer_ServerTerminate()    '** ServerTerminate anropas när det inte behövs fler avsnitt i Excel.        KillTimer 0, g_TimerID    '** Rensa eventuella kvarblivna avsnitt. Detta görs här eftersom     '   IRtdServer_DisconnectData endast anropas när ett avsnitt har kopplats från     '   medan boken är öppen. Objekt som är kvar i mängden när proceduren avslutas    '   är sådana avsnitt som fortfarande körs när arbetsboken stängs.    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. Klicka på Lägg till klassmodulProjekt-menyn. Ändra klassmodulsegenskapen Name till Topic och ändra egenskapen Instancing till Private. Lägg till följande kod i klassmodulen 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) 'Returnera #VALUE om det inte är ett av avsnitten i listan    End IfEnd PropertyFriend Sub Update()    On Error Resume Next 'nästa åtgärd misslyckas om m_Value är ett fel (som #NUM eller #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) 'Returnera #NUM om ökningsvärdet inte är numeriskt    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. Klicka på Lägg till modulProjekt-menyn. Lägg till följande kod i den nya modulen:
    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. Skapa komponenten genom att klicka på Skapa ExcelRTD.dllArkiv-menyn.

Använd RTD-servern i Excel

  1. Skapa en ny arbetsbok i Microsoft Excel.
  2. Ange följande formel i cell A1 och tryck sedan på RETUR:
    =RTD("ExcelRTD.RTDFunctions",,"AAA", 5)
    Det ursprungliga returvärdet är "AAA: 0". Efter fem sekunder uppdateras värdet till "AAA: 10" och efter tio sekunder till "AAA:15" osv.

  3. Ange följande formel i cell A2 och tryck på RETUR:
    =RTD("ExcelRTD.RTDFunctions",,"BBB", 3)
    Det ursprungliga returvärdet är "BBB: 0". Var femte sekund ökas cellvärdet med 3.

  4. Ange följande formel i cell A3 och tryck på RETUR:
    =RTD("ExcelRTD.RTDFunctions",,"AAA", 5)
    Det ursprungliga returvärdet matchar innehållet i A1 eftersom det är samma "avsnitt" som det som används i A1.

  5. Ange följande formel i cell A4 och tryck på RETUR:
    =RTD("ExcelRTD.RTDFunctions",,"AAA", 10)
    Det ursprungliga returvärdet är "AAA: 0." Var femte sekund ökar cellvärdet liksom för de andra cellerna. Observera att returvärdet inte matchar innehållet i cell A1 eller A3, eftersom en annan parameterkombination skickas till servern.
För detta exempel kompilerades RTD-servern och för Excel användes körningsversion av komponenten. Om du behöver felsöka kan du köra RTD-servern från IDE:t för Visual Basic.

Så här kör du i felsökningsläge:
  1. Avsluta Microsoft Excel och växla till projektet i Visual Basic.
  2. Kör komponenten genom att trycka på F5. Klicka på OK om dialogrutan Projektegenskaper visas och välj standardalternativet Vänta på att komponenter skapas.
  3. Kontrollera att Direktfönstret i Visual Basic visas. När du anger formler i celler och cellerna uppdateras ska du granska innehållet i Direktfönstret i Visual Basic och kontrollera vilka åtgärder som utlöser vilka händelser.
Information om händelsen DisconnectData

När RTD-servern prenumereras i Excel utlöses händelsen DisconnectData när ett avsnitt inte längre behövs (t ex när du tar bort eller rensar en RTD-formel i en cell). DisconnectData anropas dock inte för alla avsnitt för RTD-servern när arbetsboken stängs eller Excel avslutas. I sådan fall anropas endast ServerTerminate. När du skapar en RTD-server bör du skapa kod för nödvändig rensning av avsnitt och andra objekt när händelsen ServerTerminate utlöses.

(c) Microsoft Corporation 2001. Med ensamrätt. Bidrag av Lori B. Turner, Microsoft Corporation.

Referenser
Om du vill veta mer klickar du på artikelnumret nedan och läser artikeln i Microsoft Knowledge Base:
284883 Det skickas inte uppdateringsmeddelanden från en RTD-server till flera Excel-instanser (Länken kan leda till en webbplats som är helt eller delvis på engelska)
Egenskaper

Artikel-id: 285339 – senaste granskning 02/02/2006 16:52:00 – revision: 4.1

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

  • kbhowto kbautomation KB285339
Feedback