RealTimeData-palvelimen luominen Excelissä

Artikkeleiden käännökset Artikkeleiden käännökset
Artikkelin tunnus: 285339 - Näytä tuotteet, joita tämä artikkeli koskee.
Laajenna kaikki | Kutista kaikki

Yhteenveto

Microsoft Excel sisältää uuden RTD-laskentataulukkofunktion, jonka avulla voit kutsua COM (Component Object Model) -automaatiopalvelinta tietojen reaaliaikaista noutamista varten. Tässä artikkelissa kuvataan, miten Visual Basicin avulla luodaan RealTimeData-palvelin käytettäväksi Excelin RTD-funktion kanssa.

Enemmän tietoa

RTD-laskentataulukkofunktion syntaksi on seuraava:
=RTD(ProgID,Palvelin,Merkkijono1,[Merkkijono2],...)
Ensimmäinen argumentti, ProgID, edustaa RealTimeData-palvelimen ProgID (Programmatic Identifier) -tunnusta. Palvelin-argumentti ilmaisee sen tietokoneen nimeä, jossa RealTimeData-palvelin suoritetaan. Tämä argumentti voi olla null-merkkijono tai se voidaan jättää pois, jos RealTimeData-palvelin suoritetaan paikallisena. Jäljellä olevat argumentit yksinkertaisesti edustavat RealTimeData-palvelimelle lähetettäviä parametreja. Kukin näiden parametrien yksilöllinen yhdistelmä edustaa yhtä aihetta, jolle on määritetty aiheen tunnus. Parametreissa isot ja pienet kirjaimet tulkitaan eri merkeiksi. Seuraava esimerkki esittelee RTD-palvelimelle tehtäviä kutsuja, jotka antavat tulokseksi kolme erillistä aiheen tunnusta:
=RTD("ExcelRTD.RTDFunctions",,"AAA", "10")

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

=RTD("ExcelRTD.RTDFunctions",,"aaa", "5")
Jotta COM-automaatiopalvelin voisi olla RealTimeData-palvelin käytettäväksi Excelin RTF-funktion kanssa, sen on toteutettava IRTDServer-liittymä. Palvelimen on toteutettava kaikki IRTDServer-menetelmät:

ServerStart
Kutsutaan, kun Excel pyytää palvelimesta ensimmäistä RTD-aihetta. ServerStart palauttaa onnistuessaan arvon 1 ja epäonnistuessaan negatiivisen arvon tai arvon 0. ServerStart-menetelmän ensimmäinen parametri on takaisinkutsuobjekti, jonka avulla RealTimeData-palvelin ilmoittaa Excelille, kun sen pitäisi kerätä päivitykset RealTimeData-palvelimesta.
ServerTerminate
Kutsutaan, kun Excel ei enää tarvitse RTD-aiheita RealTimeData-palvelimesta.
ConnectData
Kutsutaan, kun Excel pyytää uuden RTF-aiheen RealTimeData-palvelimesta.
DisconnectData
Kutsutaan, kun Excel ei enää tarvitse jotakin tiettyä aihetta.
HeartBeat
Excel kutsuu tätä, jos määritetty aikaväli on kulunut siitä, kun Excelille viimeksi ilmoitettiin RealTimeData-palvelimen päivityksistä.
RefreshData
Kutsutaan, kun Excel pyytää aiheiden päivittämistä. RefreshData kutsutaan, kun palvelin on ilmoittanut Excelille päivitysten olemassaolosta. Se palauttaa päivitettävien aiheiden määrän sekä kunkin aiheen tunnuksen ja arvon.

RealTimeData-mallipalvelimen luominen

Seuraava esimerkki esittelee, miten RealTimeData-palvelin luodaan Microsoft Excel 2002:n avulla ja miten sitä käytetään. Tämä palvelin yksinkertaisesti tarjoaa laskurin, joka päivitetään laskentataulukossa 10 sekunnin välein. Palvelin hyväksyy enintään kaksi aihemerkkijonoa. Ensimmäinen aihemerkkijono voi olla AAA, BBB tai CCC. Mitä tahansa muuta aihemerkkijonoa pidetään virheellisenä, ja palvelin palauttaa RTD-funktiolle tuloksen #ARVO!. Toinen merkkijono on numeerinen arvo, joka ilmaisee, miten palautusarvoa tulee kasvattaa. Jos toinen merkkijono jätetään pois, lisäysarvon oletusarvo on 1. Jos toinen merkkijono ei ole numeerinen, palvelin palauttaa RTF-funktiolle tuloksen #LUKU!.
  1. Aloita Visual Basicissa uusi ActiveX DLL -projekti.
  2. Valitse Projekti-valikosta Viittaukset, valitse Excelin objektikirjasto ja valitse sitten OK.
    Microsoft Excel 2002: Microsoft Excel 10.0 -objektikirjasto
  3. Microsoft Office Excel 2003: Microsoft Excel 11.0 -objektikirjasto
  4. Valitse Projekti-valikosta Ominaisuudet: Projekti1. Muuta Projektin nimi muotoon ExcelRTD ja valitse sitten OK.
  5. Muuta Luokka1-luokkamoduulin Name-ominaisuudeksi RTDFunctions. Lisää RTDFunctions-moduuliin seuraava koodi:
    Option Explicit
    
    Implements IRtdServer  'Liittymä antaa Excelin muodostaa yhteyden tähän RealTimeData-palvelimeen
    
    Private m_colTopics As Collection
        
    Private Function IRtdServer_ConnectData(ByVal TopicID As Long, Strings() As Variant, GetNewValues As Boolean) As Variant
        '** ConnectData kutsutaan, kun uutta RTD-aihetta pyydetään
        
        'Luo uusi aihe käyttäen määritettyä TopicId-tunnusta ja merkkijonoa. Lisää se
        'm_colTopics-kokoelmaan
        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)
        
        'Tässä esimerkissä uuden aiheen arvo on aluksi aina 0
        IRtdServer_ConnectData = oTopic.TopicValue
        
        Debug.Print "ConnectData", TopicID
    End Function
    
    Private Sub IRtdServer_DisconnectData(ByVal TopicID As Long)
       '** DisconnectData kutsutaan, kun määritettyä aihetta ei enää tarvita
       
       'Poista aihe kokoelmasta
       m_colTopics.Remove CStr(TopicID)
       
       Debug.Print "DisconnectData", TopicID
    End Sub
    
    Private Function IRtdServer_Heartbeat() As Long
        '** Excel kutsuu tätä, jos Heartbeat-aikaväli on kulunut edellisestä kerrasta,
        '   kun Excelille tehtiin UpdateNotify-kutsu.
        Debug.Print "HeartBeat"
    End Function
    
    Private Function IRtdServer_RefreshData(TopicCount As Long) As Variant()
        '** Kutsutaan, kun Excel pyytää aiheiden päivittämistä. RefreshData kutsutaan, kun
        '   palvelin on antanut UpdateNotify-kutsun. Tämän tapahtuman pitäisi tehdä seuraavaa:
        '   - antaa TopicCount-arvo (päivitettävien aiheiden määrä)
        '   - palauttaa kaksiulotteinen muuttujataulukko, joka sisältää aiheiden tunnukset
        '     ja kunkin aiheen uuden arvon.
       
        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 & " aihetta päivitetty"
    End Function
    
    Private Function IRtdServer_ServerStart(ByVal CallbackObject As Excel.IRTDUpdateEvent) As Long
        '** ServerStart kutsutaan, kun ensimmäistä RTD-aihetta pyydetään
        
        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       'Mikä tahansa arvo, joka on <1, ilmaisee epäonnistumista.
        
        Debug.Print "ServerStart"
    End Function
    
    Private Sub IRtdServer_ServerTerminate()
        '** ServerTerminate kutsutaan, kun Excel ei enää tarvitse lisää aiheita.
        
        KillTimer 0, g_TimerID
    
        '** Poista jäljellä olevat aiheet. Tämä tehdään tässä, koska 
        '   IRtdServer_DisconnectData kutsutaan vain, jos aiheen yhteys katkaistaan
        '   kirjan ollessa avoinna. Kokoelmaan katkaisemisen aikana jääneet kohteet
        '   ovat käynnissä olevat kohteet työkirjan sulkemisen yhteydessä.
    
        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. Valitse Projekti-valikosta Lisää luokkamoduuli. Muuta luokkamoduulin Name-ominaisuudeksi Topic ja muuta Instancing-ominaisuudeksi Private. Lisää Topic-luokkamoduuliin seuraava koodi:
    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) 'Palauta #ARVO!, jos ei jokin luetelluista aiheista
        End If
    End Property
    
    Friend Sub Update()
        On Error Resume Next 'Seuraava toimi epäonnistuu, jos m_Value on virhe (kuten #LUKU! tai #ARVO!)
        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) 'Palauta #LUKU!, jos Increment-arvo ei ole numeerinen
        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. Valitse Projekti-valikosta Lisää moduuli. Lisää uuteen moduuliin seuraava koodi:
    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. Muodosta komponentti valitsemalla Tiedosto-valikosta Luo ExcelRTD.dll.

RTD-palvelimen käyttäminen Excelissä

  1. Aloita uusi työkirja Microsoft Excelissä.
  2. Kirjoita seuraava kaava soluun A1 ja paina sitten ENTER-näppäintä:
    =RTD("ExcelRTD.RTDFunctions",,"AAA", 5)
    Ensimmäinen palautusarvo on "AAA: 0". Viiden sekunnin kuluttua arvoksi päivitetään "AAA: 10", kymmenen sekunnin kuluttua "AAA:15" ja niin edelleen.

  3. Kirjoita seuraava kaava soluun A2 ja paina sitten ENTER-näppäintä:
    =RTD("ExcelRTD.RTDFunctions",,"BBB", 3)
    Ensimmäinen palautusarvo on "BBB: 0". Solun arvo kasvaa kolmella viiden sekunnin välein.

  4. Kirjoita seuraava kaava soluun A3 ja paina sitten ENTER-näppäintä:
    =RTD("ExcelRTD.RTDFunctions",,"AAA", 5)
    Ensimmäinen palautusarvo vastaa solun A1 sisältöä, koska tämä on sama aihe, jota käytettiin solussa A1.

  5. Kirjoita seuraava kaava soluun A4 ja paina sitten ENTER-näppäintä:
    =RTD("ExcelRTD.RTDFunctions",,"AAA", 10)
    Ensimmäinen palautusarvo on "AAA: 0". Tämän solun arvo ja muiden solujen arvot kasvavat viiden sekunnin välein. Huomaa, että palautusarvo ei vastaa solun A1 tai A3 sisältöä, koska palvelimelle välitettyjen parametrien yhdistelmä ei ole sama.
Tässä RTF-palvelin käännettiin ja Excel käytti komponentin suorituksenaikaista versiota. RTD-palvelimet voidaan virheenkorjausta varten suorittaa Visual Basic IDE:stä.

Virheenkorjaustilan käyttäminen:
  1. Sulje Microsoft Excel ja siirry projektiin Visual Basicissa.
  2. Käynnistä komponentti painamalla F5-näppäintä. Jos Projektin ominaisuudet -valintaikkuna tulee näyttöön, valitse oletusasetus (komponenttien luomisen odottaminen) valitsemalla OK.
  3. Varmista, että Visual Basicin välitön suoritusruutu on näytössä. Kun kirjoitat kaavoja soluihin ja solut päivitetään, tarkastele Visual Basicin välittömän suoritusruudun sisältöä nähdäksesi, mitkä toimet käynnistävät eri tapahtumat.
DisconnectData-tapahtuman huomautus

Kun Excel on RTD-palvelimen käyttäjä, se käynnistää DisconnectData-tapahtuman, kun se ei enää tarvitse aihetta (esimerkiksi kun poistat tai tyhjennät solun RTD-kaavan). Excel ei kuitenkaan tee DisconnectData-kutsua kullekin RTD-palvelimen aiheelle, kun työkirja suljetaan tai kun Excel suljetaan. Sen sijaan Excel tekee vain ServerTerminate-kutsun. Kun luot RTD-palvelinta, sinun tulee koodata tarvittavat aiheiden tai muiden objektien tyhjennykset tehtäväksi, kun ServerTerminate-tapahtuma käynnistyy.

(c) Microsoft Corporation 2001. Kaikki oikeudet pidätetään. Sisällön tuottanut Lori B. Turner, Microsoft Corporation.

Suositukset

Saat lisätietoja napsauttamalla seuraavaa artikkelin numeroa, jolloin pääset lukemaan artikkelin Microsoft Knowledge Base -tietokannassa:
284883 RTD-palvelin ei lähetä päivitysilmoituksia useille Excel-esiintymille (tämä artikkeli saattaa olla englanninkielinen)

Ominaisuudet

Artikkelin tunnus: 285339 - Viimeisin tarkistus: 2. helmikuuta 2006 - Versio: 4.1
Artikkelin tiedot koskevat seuraavia tuotteita:
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Visual Basic 6.0 Professional Edition
Hakusanat: 
kbhowto kbautomation KB285339

Anna palautetta

 

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