Du er frakoblet, venter på at Internett skal koble til igjen

Nettleseren støttes ikke

Du må oppdatere nettleseren for å bruke nettstedet.

Oppdater til den nyeste versjonen av Internet Explorer

Slik oppretter du en RealTimeData-server for Excel

Kundestøtte for Office 2003 er avsluttet

Microsoft avsluttet kundestøtte for Office 2003 den 8. april 2014. Denne endringen har påvirket programvareoppdateringene og sikkerhetsalternativene dine. Finn ut hvordan dette påvirker deg og hvordan du forblir beskyttet.

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 ExplicitImplements IRtdServer  'Interface allows Excel to contact this RealTimeData serverPrivate 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", TopicIDEnd FunctionPrivate 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", TopicIDEnd SubPrivate 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 FunctionPrivate 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 FunctionPrivate 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 FunctionPrivate 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 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) 'Return #VALUE if not one of the listed topics    End IfEnd PropertyFriend 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_IncrementValEnd SubFriend 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 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. 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 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. 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: 02/02/2006 16:41:00 – Revisjon: 4.1

  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • kbhowto kbautomation KB285339
Tilbakemelding
c1.microsoft.com/c.gif?DI=4050&did=1&t=">);" src="http://c1.microsoft.com/c.gif?"> rotocol) + "//c.microsoft.com/ms.js'><\/script>");