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

Artikelöversättning Artikelöversättning
Artikel-id: 285339 - Visa produkter som artikeln gäller.
Visa alla | Dölj alla

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 Explicit
    
    Implements IRtdServer  'Gränssnitt för kontakt mellan Excel och denna RealTimeData-server
    
    Private 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", TopicID
    End Function
    
    Private 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", TopicID
    End Sub
    
    Private 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 Function
    
    Private 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 Function
    
    Private 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 Function
    
    Private 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 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) 'Returnera #VALUE om det inte är ett av avsnitten i listan
        End If
    End Property
    
    Friend 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_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) 'Returnera #NUM om ökningsvärdet inte är numeriskt
        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. 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 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. 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: den 2 februari 2006 - Revision: 4.1
Informationen i denna artikel gäller:
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Visual Basic 6.0 Professional Edition
Nyckelord: 
kbhowto kbautomation KB285339

Ge 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