Slik oppretter du en RealTimeData-server for Excel

Artikkeloversettelser Artikkeloversettelser
Artikkel-ID: 285339 - Vis produkter som denne artikkelen gjelder for.
Vis alt | Skjul alt

Sammendrag

Microsoft Excel inneholder en ny regnearkfunksjon, RTD, som gjør det mulig å kalle en COM-automatiseringsserver (Component Object Model) for å hente data i sanntid. Denne artikkelen beskriver hvordan du bruker Visual Basic til å opprette en RealTimeData-server for bruk med RTD-funksjonen i Excel.

Mer informasjon

RTD-regnearkfunksjonen har følgende syntaks:
=RTD(ProgID,Server,String1,[String2],...)
Det første argumentet, ProgID, representerer program-IDen (ProgID) for RealTimeData-serveren. Server-argumentet angir navnet på maskinen som RealTimeData-serveren kjøres på. Dette argumentet kan være en null-streng, eller det kan utelates hvis RealTimeData-serveren skal kjøres lokalt. De gjenstående argumentene representerer ganske enkelt parametere som sendes til RealTimeData-serveren. Hver unike kombinasjon av disse parameterne representerer ett "emne", som har en tilknyttet "emne-ID." Det skilles mellom store og små bokstaver i parametere. Følgende illustrerer for eksempel kall til RTD-serveren som vil resultere i tre separate emne-IDer:
=RTD("ExcelRTD.RTDFunctions",,"AAA", "10")

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

=RTD("ExcelRTD.RTDFunctions",,"aaa", "5")
Hvis en COM-automatiseringsserver skal være en RealTimeData-server som kan brukes med RTD-funksjonen i Excel, må den implementere IRTDServer-grensesnittet. Serveren må implementere alle metodene for IRTDServer:

ServerStart
Kalles når Excel ber om det første RTD-emnet for serveren. ServerStart skal returnere en 1 hvis det lykkes, og en negativ verdi eller 0 hvis det mislykkes. Den første parameteren for ServerStart-metoden er et tilbakeringingsobjekt som RealTimeData-serveren bruker til å varsle Excel om å samle oppdateringer fra RealTimeData-serveren.
ServerTerminate
Kalles når Excel ikke lenger krever RTD-emner fra RealTimeData-serveren.
ConnectData
Kalles når Excel ber om et nytt RTD-emne fra RealTimeData-serveren.
DisconnectData
Kalles når Excel ikke lenger krever et bestemt emne.
HeartBeat
Kalles av Excel hvis en angitt tid er gått siden forrige gang Excel ble varslet om oppdateringer fra RealTimeData-serveren.
RefreshData
Kalles når Excel ber om en oppdatering av emner. RefreshData kalles når serveren har varslet Excel om oppdateringer, og kallet returnerer antall emner som skal oppdateres, sammen med emne-IDen og verdien for hvert emne.

Opprette et eksempel på en RealTimeData-server

Følgende eksempel viser hvordan du oppretter og bruker en RealTimeData-server med Microsoft Excel 2002. Denne serveren betjener en teller som oppdateres hvert 10. sekund i et regneark. Serveren godtar opptil to emnestrenger. Den første emnestrengen kan være AAA, BBB og CCC. Alle andre emnestrenger anses som ugyldige, og serveren returnerer #VERDI! til RTD-funksjonen. Den andre strengen er en numerisk verdi som representerer hvordan returverdien skal økes. Hvis den andre strengen utelates, brukes en økningsverdi på 1 som standard. Hvis den andre strengen ikke er numerisk, returnerer serveren #NUM! til RTD-funksjonen.
  1. Start et nytt ActiveX DLL-prosjekt i Visual Basic.
  2. KlikkReferencesProject-menyen, velg objektbiblioteket for Excel, og klikk deretter OK.
    For Microsoft Excel 2002: Microsoft Excel 10.0-objektbibliotek
  3. For Microsoft Office Excel 2003: Microsoft Excel 11.0-objektbibliotek
  4. Klikk Project1 PropertiesProject-menyen. Endre Project Name til ExcelRTD, og klikk deretter OK.
  5. Endre Name-egenskapen for klassemodulen Class1 til RTDFunctions. Legg til følgende kode i RTDFunctions:
    Option Explicit
    
    Implements IRtdServer  'Interface allows Excel to contact this RealTimeData server
    
    Private m_colTopics As Collection
        
    Private Function IRtdServer_ConnectData(ByVal TopicID As Long, Strings() As Variant, GetNewValues As Boolean) As Variant
        '** ConnectData is called whenever a new RTD topic is requested
        
        'Create a new topic class with the given TopicId and string and add it to the
        'm_colTopics collection
        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)
        
        'For this example, the initial value for a new topic is always 0
        IRtdServer_ConnectData = oTopic.TopicValue
        
        Debug.Print "ConnectData", TopicID
    End Function
    
    Private Sub IRtdServer_DisconnectData(ByVal TopicID As Long)
       '** DisconnectData is called whenever a specific topic is not longer needed
       
       'Remove the topic from the collection
       m_colTopics.Remove CStr(TopicID)
       
       Debug.Print "DisconnectData", TopicID
    End Sub
    
    Private Function IRtdServer_Heartbeat() As Long
        '** Called by Excel if the heartbeat interval has elapsed since the last time
        '   Excel was called with UpdateNotify.
        Debug.Print "HeartBeat"
    End Function
    
    Private Function IRtdServer_RefreshData(TopicCount As Long) As Variant()
        '** Called when Excel is requesting a refresh on topics. RefreshData will be called
        '   after an UpdateNotify has been issued by the server. This event should:
        '   - supply a value for TopicCount (number of topics to update)
        '   - return a two dimensional variant array containing the topic ids and the
        '     new values of each.
       
        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 & " topics updated"
    End Function
    
    Private Function IRtdServer_ServerStart(ByVal CallbackObject As Excel.IRTDUpdateEvent) As Long
        '** ServerStart is called when the first RTD topic is requested
        
        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       'Any value <1 indicates failure.
        
        Debug.Print "ServerStart"
    End Function
    
    Private Sub IRtdServer_ServerTerminate()
        '** ServerTerminate is called when no more topics are needed by Excel.
        
        KillTimer 0, g_TimerID
    
        '** Cleanup any remaining topics. This is done here since 
        '   IRtdServer_DisconnectData is only called if a topic is disconnected 
        '   while the book is open. Items left in the collection when we terminate
        '   are those topics left running when the workbook was closed.
    
        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. Klikk Add Class ModuleProject-menyen. Endre Name-egenskapen for klassemodulen til Topic, og endre Instancing-egenskapen til Private. Legg til følgende kode i Topic-klassemodulen:
    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) 'Return #VALUE if not one of the listed topics
        End If
    End Property
    
    Friend Sub Update()
        On Error Resume Next 'the next operation will fail if m_Value is an error (like #NUM or #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) 'Return #NUM if Increment value is not numeric
        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. Velg Legg til modulProsjekt-menyen. Legg til følgende kode i den nye 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. Klikk Make ExcelRTD.dllFile-menyen for å bygge komponenten.

Bruke RTD-serveren i Excel

  1. Start en ny arbeidsbok i Microsoft Excel.
  2. I celle A1 skriver du inn følgende formel, og trykker deretter ENTER:
    =RTD("ExcelRTD.RTDFunctions",,"AAA", 5)
    Standard returverdi er "AAA: 0". Etter fem sekunder oppdateres verdien til "AAA: 10", og etter 10 sekunder oppdateres verdien til "AAA:15," og så videre.

  3. I celle A2 skriver du inn følgende formel, og trykker deretter ENTER:
    =RTD("ExcelRTD.RTDFunctions",,"BBB", 3)
    Standard returverdi er "BBB: 0". Hvert femte sekund økes celleverdien med 3.

  4. I celle A3 skriver du inn følgende formel, og trykker deretter ENTER:
    =RTD("ExcelRTD.RTDFunctions",,"AAA", 5)
    Standard returverdi samsvarer med innholdet i celle A1 fordi dette er det samme "emnet" som brukes i A1.

  5. I celle A4 skriver du inn følgende formel, og trykker deretter ENTER:
    =RTD("ExcelRTD.RTDFunctions",,"AAA", 10)
    Standard returverdi er "AAA: 0." Hvert femte sekund øker celleverdien i likhet med de andre cellene. Merk at returverdien ikke samsvarer med innholdet i celle A1 eller A3 fordi kombinasjonen av parametere som sendes til serveren, er forskjellig.
For denne illustrasjonen ble RTD-serveren kompilert, og Excel brukte kjøretidsversjonen av komponenten. Til feilsøking kan RTD-servere kjøres fra Visual Basic IDE.

Slik kjører du i feilsøkingsmodus:
  1. Avslutt Microsoft Excel, og bytt til prosjektet i Visual Basic.
  2. Trykk F5 for å starte komponenten. Hvis dialogboksen Project Properties vises, klikker du OK for å velge standardalternativet Wait for components to be created.
  3. Kontroller at Immediate-vinduet i Visual Basic vises. Mens du skriver inn formler i cellene, og cellene oppdateres, undersøker du innholdet i Immediate-vinduet i Visual Basic for å se hvilke handlinger som utløser de ulike hendelsene.
Merknad om DisconnectData-hendelsen

Mens Excel abonnerer på RTD-serveren, utløses DisconnectData-hendelsen når et emne ikke lenger kreves (for eksempel når du sletter eller fjerner en RTD-formen i en celle). Excel kaller imidlertid ikke DisconnectData for hvert emne for RTD-serveren når arbeidsboken lukkes eller Excel avsluttes. I stedet kalles bare ServerTerminate. Når du oppretter en RTD-server, bør du kjøre kode for eventuelle nødvendige oppryddinger av emner eller andre objekter når ServerTerminate-hendelsen startes.

(c) Microsoft Corporation 2001. Med enerett. Bidrag fra Lori B. Turner, Microsoft Corporation.

Referanser

Hvis du vil ha mer informasjon, klikker du følgende artikkelnummer for å vise artikkelen i Microsoft Knowledge Base (Denne artikkelen kan være på engelsk.):
284883 RTD-server sender ikke oppdateringsvarsler til flere Excel-forekomster

Egenskaper

Artikkel-ID: 285339 - Forrige gjennomgang: 2. februar 2006 - Gjennomgang: 4.1
Informasjonen i denne artikkelen gjelder:
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Visual Basic 6.0 Professional Edition
Nøkkelord: 
kbhowto kbautomation KB285339

Gi tilbakemelding

 

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