Πώς μπορείτε να δημιουργήσετε ένα διακομιστή RealTimeData για το Excel

Σύνοψη

Το Microsoft Excel παρέχει μια νέα συνάρτηση φύλλου εργασίας RTD, που σας επιτρέπει να καλέσετε ένα διακομιστή αυτοματοποίησης Component Object Model (COM) για την ανάκτηση δεδομένων σε πραγματικό χρόνο. Αυτό το άρθρο περιγράφει τον τρόπο χρήσης της Visual Basic για να δημιουργήσετε ένα διακομιστή RealTimeData για χρήση με συνάρτηση RTD του Excel.

Περισσότερες πληροφορίες

Η συνάρτηση φύλλου εργασίας RTD έχει την ακόλουθη σύνταξη:
= ΕΤΑ (ProgID, διακομιστής, συμβολοσειρά1,[συμβολοσειρά2],... )
Το πρώτο όρισμα, το ProgID, αντιπροσωπεύει το αναγνωριστικό προγραμματισμού (ProgID) του διακομιστή RealTimeData. Το όρισμα διακομιστή δηλώνει το όνομα του υπολογιστή στον οποίο εκτελείται ο διακομιστής RealTimeData; Αυτό το όρισμα μπορεί να είναι μια μηδενική συμβολοσειρά ή παραλείπεται αν ο διακομιστής RealTimeData είναι να εκτελείται τοπικά. Τα υπόλοιπα ορίσματα αντιπροσωπεύουν απλώς παραμέτρους για αποστολή στο διακομιστή RealTimeData. Κάθε μοναδικός συνδυασμός των παραμέτρων αυτών αντιπροσωπεύει ένα "θέμα" που διαθέτει συσχετισμένο "αναγνωριστικό θέματος". Οι παράμετροι είναι διάκριση πεζών-κεφαλαίων. Για παράδειγμα, το παρακάτω παράδειγμα δείχνει κλήσεις στο διακομιστή RTD που θα οδηγούσε σε τρεις ξεχωριστές θέμα ταυτότητες:
= RTD("ExcelRTD.RTDFunctions",,"AAA", "10")

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

= RTD("ExcelRTD.RTDFunctions",,"aaa", "5")
Προκειμένου για ένα διακομιστή αυτοματοποίησης COM ως διακομιστή RealTimeData για χρήση με τη συνάρτηση RTD του Excel, αυτό πρέπει να υλοποιεί τη διασύνδεση IRTDServer . Ο διακομιστής πρέπει να υλοποιήσει όλες τις μεθόδους της IRTDServer:

ServerStart
Κλήση όταν το Excel ζητά το πρώτο θέμα του ΕΤΑ για το διακομιστή. ServerStart θα πρέπει να επιστρέψει ένα 1 στην επιτυχία, και μια αρνητική τιμή ή 0 σε περίπτωση αποτυχίας. Η πρώτη παράμετρος της μεθόδου ServerStart είναι ένα αντικείμενο επιστροφής κλήσης που χρησιμοποιεί ο διακομιστής RealTimeData για να ειδοποιήσετε το Excel όταν αυτό πρέπει να συλλέξετε ενημερώσεις από το διακομιστή RealTimeData.
ServerTerminate
Κλήση όταν το Excel απαιτεί πλέον θέματα ε & τα από το διακομιστή RealTimeData.
ConnectData
Καλείται κάθε φορά που το Excel ζητά ένα νέο θέμα ΕΤΑ από το διακομιστή RealTimeData.
DisconnectData
Καλείται κάθε φορά που το Excel δεν είναι πλέον απαιτεί ένα συγκεκριμένο θέμα.
Παλμών
Κλήση από το Excel, εάν ένα δεδομένο διάστημα έχει παρέλθει από την τελευταία φορά που κοινοποιήθηκε Excel ενημερωμένες εκδόσεις από τον διακομιστή RealTimeData.
RefreshData
Κλήση όταν το Excel ζητά μια ανανέωση σε θέματα. RefreshData καλείται αφού του διακομιστή ειδοποιεί το Excel που υπάρχουν ενημερωμένες εκδόσεις και επιστρέφει μια καταμέτρηση των θεμάτων για την ενημέρωση μαζί με το αναγνωριστικό θέματος και την τιμή για κάθε θέμα.

Δημιουργήστε ένα διακομιστή RealTimeData δείγμα

Το ακόλουθο δείγμα επιδεικνύει τον τρόπο δημιουργίας και χρήσης ενός διακομιστή RealTimeData με το Microsoft Excel 2002. Αυτός ο διακομιστής παρέχει απλώς ένα μετρητή που ενημερώνεται κάθε 10 δευτερόλεπτα σε ένα φύλλο εργασίας. Ο διακομιστής δέχεται μέχρι δύο συμβολοσειρές θέμα. Μπορεί να είναι η πρώτη συμβολοσειρά θέμα AAA ΒΒΒ και ΣΤΣ; οποιαδήποτε άλλη συμβολοσειρά θέμα θεωρείται μη έγκυρη και ο διακομιστής επιστρέψει #VALUE! στη συνάρτηση RTD. Η δεύτερη συμβολοσειρά είναι μια αριθμητική τιμή που αντιπροσωπεύει τον τρόπο που θα πρέπει να αυξάνεται η επιστρεφόμενη τιμή. Εάν παραλειφθεί η δεύτερη συμβολοσειρά, προεπιλογή την τιμή προσαύξησης 1. Εάν η δεύτερη συμβολοσειρά δεν είναι αριθμητικό, ο διακομιστής επιστρέφει #NUM! στη συνάρτηση RTD.
  1. Για να ξεκινήσετε ένα νέο έργο βιβλιοθήκη DLL ActiveX σε Visual Basic.
  2. Στο μενού ' έργο ', κάντε κλικ στην επιλογή αναφορές, επιλέξτε τη βιβλιοθήκη αντικειμένων για την έκδοση του Excel και, στη συνέχεια, κάντε κλικ στο κουμπί OK. Για παράδειγμα, επιλέξτε ένα από τα εξής:
    • Για το Microsoft Office Excel 2007, επιλέξτε τη Βιβλιοθήκη αντικειμένων του Microsoft Excel 12.0.
    • Για το Microsoft Office Excel 2003, επιλέξτε τη Βιβλιοθήκη αντικειμένων του Microsoft Excel 11.0.
    • Για το Microsoft Excel 2002, επιλέξτε τη Βιβλιοθήκη αντικειμένων του Microsoft Excel έκδοση 10.0.
  3. Στο μενού ' έργο ', κάντε κλικ στο κουμπί Ιδιότητες Project1. Αλλάξτε το Όνομα του έργου σε ExcelRTDκαι, στη συνέχεια, κάντε κλικ στο κουμπί OK.
  4. Αλλάξτε την ιδιότητα όνομα της λειτουργικής μονάδας κλάσης Class1 σε RTDFunctions. Προσθέστε τον ακόλουθο κώδικα στο 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


  5. Στο μενού ' έργο ', κάντε κλικ στο κουμπί Προσθήκη λειτουργικής μονάδας κλάσης. Αλλάξτε τη λειτουργική μονάδα κλάσης ιδιότητα Name θέμα και αλλάξτε την ιδιότητα Instancing σε ιδιωτικό. Προσθέστε τον ακόλουθο κώδικα στη λειτουργική μονάδα κλάσης θέμα :
    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

  6. Από το μενού " έργο ", επιλέξτε " Προσθήκη λειτουργικής μονάδας". Προσθέστε τον ακόλουθο κώδικα στη νέα λειτουργική μονάδα:
    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

  7. Στο μενού αρχείο , κάντε κλικ στο κουμπί ExcelRTD.dll βεβαιωθείτε για τη δημιουργία του στοιχείου.

Χρήση του διακομιστή RTD στο Excel

  1. Ξεκινήστε ένα νέο βιβλίο εργασίας του Microsoft Excel.
  2. Στο κελί A1, πληκτρολογήστε τον ακόλουθο τύπο και, στη συνέχεια, πιέστε το πλήκτρο ENTER:
    = RTD("ExcelRTD.RTDFunctions",,"AAA", 5)
    Η αρχική τιμή επιστροφής είναι "AAA: 0". Μετά από πέντε δευτερόλεπτα, ενημερώνει την τιμή σε "AAA: 10" και έπειτα από 10 δευτερόλεπτα, ενημερώνει την τιμή "AAA:15" και ούτω καθεξής.

  3. Στο κελί A2, πληκτρολογήστε τον ακόλουθο τύπο και πιέστε το πλήκτρο ENTER:
    = RTD("ExcelRTD.RTDFunctions",,"BBB", 3)
    Η αρχική τιμή επιστροφής είναι "ΒΒΒ: 0". Κάθε πέντε δευτερόλεπτα, αυξάνει την τιμή του κελιού με το 3.

  4. Στο κελί A3, πληκτρολογήστε τον ακόλουθο τύπο και πιέστε το πλήκτρο ENTER:
    = RTD("ExcelRTD.RTDFunctions",,"AAA", 5)
    Η αρχική τιμή επιστροφής συμφωνεί με τα περιεχόμενα του κελιού A1, επειδή αυτό είναι το ίδιο "θέμα" που χρησιμοποιείται στο A1.

  5. Στο κελί A4, πληκτρολογήστε τον ακόλουθο τύπο και πιέστε το πλήκτρο Enter:
    = RTD("ExcelRTD.RTDFunctions",,"AAA", 10)
    Η αρχική τιμή επιστροφής είναι "AAA: 0." κάθε πέντε δευτερόλεπτα τις υποδιαιρέσεις τιμή κελιού, όπως τα άλλα κελιά. Σημειώστε ότι η τιμή που επιστρέφεται δεν συμφωνεί με το περιεχόμενο του κελιού A1 ή A3 επειδή ο συνδυασμός των παραμέτρων που μεταβιβάστηκαν στο διακομιστή είναι διαφορετική.
Για αυτήν την εικόνα, ο διακομιστής RTD μεταγλωττίστηκε και χρησιμοποιούσε την έκδοση χρόνου εκτέλεσης του στοιχείου από το Excel. Για σκοπούς εντοπισμού σφαλμάτων, RTD διακομιστές μπορούν να εκτελεστούν από τη Visual Basic IDE.

Για να εκτελέσετε σε κατάσταση εντοπισμού σφαλμάτων:
  1. Κλείστε το Microsoft Excel και να μεταβείτε στο έργο της Visual Basic.
  2. Πατήστε F5 για να ξεκινήσετε το στοιχείο. Εάν εμφανιστεί το παράθυρο διαλόγου Ιδιότητες έργου , κάντε κλικ στο κουμπί OK για να επιλέξετε την προεπιλεγμένη επιλογή της αναμονής για τα στοιχεία που θα δημιουργηθεί.
  3. Βεβαιωθείτε ότι εμφανίζεται το παράθυρο άμεσης παρακολούθησης στη Visual Basic. Κατά την εισαγωγή τύπων στα κελιά και όπως των κελιών ενημερώνονται, εξετάστε τα περιεχόμενα του παραθύρου άμεσης παρακολούθησης στη Visual Basic για να δείτε τις ενέργειες που προκαλούν τα διαφορετικά συμβάντα.
Σημείωση σχετικά με το συμβάν DisconnectData

Ενώ το Excel είναι συνδρομητής στο διακομιστή RTD, ενεργοποιεί το συμβάν DisconnectData όταν δεν χρειάζεται πλέον ένα θέμα (για παράδειγμα, μπορείτε να διαγράψετε ή να καταργήσετε την επιλογή ενός τύπου RTD σε ένα κελί). Ωστόσο, Excel δεν καλούν DisconnectData σχετικά με κάθε θέμα για το διακομιστή RTD όταν το βιβλίο εργασίας είναι κλειστό ή το Excel κλείνει; αντί για αυτό, το Excel καλεί μόνο ServerTerminate. Κατά τη δημιουργία ενός διακομιστή RTD, θα πρέπει να κώδικα για οποιεσδήποτε απαραίτητες εκκαθάρισης θέματα ή άλλα αντικείμενα όταν το συμβάν ServerTerminate .

(c) Microsoft Corporation 2001, επιφύλαξη παντός δικαιώματος. Συνεισφορές από ο B. δέτης, Microsoft Corporation.

Αναφορές

Για πρόσθετες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:

284883 διακομιστής RTD δεν αποστέλλει ειδοποιήσεις ενημέρωσης σε πολλές εμφανίσεις του Excel

Ιδιότητες

Αναγνωριστικό άρθρου: 285339 - Τελευταία αναθεώρηση: 23 Ιαν 2017 - Αναθεώρηση: 1

Σχόλια