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

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 285339 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Περίληψη

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

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

Η συνάρτηση φύλλου εργασίας RTD έχει την ακόλουθη σύνταξη:
= RTD)ProgID, διακομιστής, String1,[Συμβολοσειρά2]...)
Το πρώτο όρισμααναγνωριστικό_ProgID, αντιπροσωπεύει το αναγνωριστικό προγραμματισμού (ProgID) του διακομιστή RealTimeData. Για ναSERVERτο όρισμα δηλώνει το όνομα του υπολογιστή στον οποίο εκτελείται ο διακομιστής 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 απαιτεί το πρώτο θέμα RTD για το διακομιστή.ServerStartπρέπει να επιστρέψει ένα 1 στην επιτυχία, και μια αρνητική τιμή ή 0 σε περίπτωση αποτυχίας. Η πρώτη παράμετρος από τηνServerStartη μέθοδος είναι ένα αντικείμενο επιστροφής κλήσης που χρησιμοποιεί ο διακομιστής RealTimeData για να ειδοποιήσετε το Excel, όταν αυτό πρέπει να συγκεντρώσετε ενημερωμένες εκδόσεις από το RealTimeData διακομιστή.
ServerTerminate
Κλήση όταν το Excel δεν είναι πλέον απαιτεί RTD θέματα από το διακομιστή RealTimeData.
ConnectData
Καλείται κάθε φορά που το Excel απαιτεί ένα νέο θέμα RTD από το διακομιστή RealTimeData.
DisconnectData
Καλείται κάθε φορά που το Excel δεν είναι πλέον απαιτεί ένα συγκεκριμένο θέμα.
Παλμών
Εάν ένα δεδομένο χρονικό διάστημα έχει παρέλθει από την τελευταία φορά, το Excel έχει ειδοποιηθεί για ενημερωμένες εκδόσεις από το διακομιστή RealTimeData καλείται από το Excel.
RefreshData
Κλήση όταν το Excel ζητά μια ανανέωση σε θέματα.RefreshDataκαλείται αφού του διακομιστή ειδοποιεί το Excel που υπάρχουν ενημερωμένες εκδόσεις και επιστρέφει μια καταμέτρηση των θεμάτων για την ενημέρωση μαζί με το αναγνωριστικό θέματος και την τιμή για κάθε θέμα.

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

Το ακόλουθο δείγμα επιδεικνύει τον τρόπο δημιουργίας και χρήσης ενός διακομιστή RealTimeData με το Microsoft Excel 2002. Αυτός ο διακομιστής παρέχει απλώς ένα μετρητή που ενημερώνεται κάθε 10 δευτερόλεπτα σε ένα φύλλο εργασίας. Ο διακομιστής δέχεται μέχρι δύο συμβολοσειρές θέμα. Μπορεί να είναι η πρώτη συμβολοσειρά θέμα AAA BBB και CCC, θεωρείται μη έγκυρη οποιαδήποτε ακολουθία χαρακτήρων θέματος και ο διακομιστής επιστρέφει την τιμή σφάλματος # ΤΙΜΗ! στη συνάρτηση RTD. Η δεύτερη συμβολοσειρά είναι μια αριθμητική τιμή που αναπαριστά πώς πρέπει να αυξάνεται η επιστρεφόμενη τιμή. Εάν παραλειφθεί η δεύτερη συμβολοσειρά, η τιμή προσαύξησης προεπιλεγμένη τιμή 1. Εάν η δεύτερη συμβολοσειρά δεν είναι αριθμητικό, ο διακομιστής επιστρέφει την τιμή σφάλματος # ΑΡΙΘ! στη συνάρτηση 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.
    • Για το Excel 2002, επιλέξτεΒιβλιοθήκη αντικειμένων του Microsoft Excel 10.0.
  3. Στο διακομιστήΤο έργομενού, κάντε κλικ στο κουμπίΙδιότητες Project1. Αλλαγή τουΌνομα έργουToExcelRTD, και στη συνέχεια κάντε κλικ στο κουμπίOk.
  4. Αλλαγή τουNAMEη ιδιότητα της λειτουργικής μονάδας κλάσηςClass1ToRTDFunctions. Προσθέστε τον παρακάτω κώδικα στο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. Στο διακομιστήFILEμενού, κάντε κλικ στο κουμπίΔημιουργία 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)
    Η αρχική τιμή επιστροφής είναι "BBB: 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 σε ένα κελί). Ωστόσο, δεν καλούν ExcelDisconnectDataσε κάθε θέμα για τη συνάρτηση RTD διακομιστή, όταν το βιβλίο εργασίας είναι κλειστό ή το Excel κλείνει, αντί για αυτό, το Excel καλεί μόνοServerTerminate. Κατά τη δημιουργία ενός διακομιστή RTD, θα πρέπει να κώδικα για οποιεσδήποτε απαραίτητες εκκαθάρισης των θεμάτων ή άλλων αντικειμένων κατά τηνServerTerminateΠυροδοτείται συμβάντων.

(c) Microsoft Corporation 2001, όλα τα δικαιώματα κάθε νόμιμου δικαιώματος. ΕΙΣΦΟΡΕΣ με Lori B. Turner, Microsoft Corporation.

Αναφορές

Για πρόσθετες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft (Knowledge Base):
284883Διακομιστή RTD δεν αποστολή ειδοποιήσεων ενημέρωση πολλαπλών εμφανίσεων του Excel

Ιδιότητες

Αναγν. άρθρου: 285339 - Τελευταία αναθεώρηση: Τρίτη, 28 Σεπτεμβρίου 2010 - Αναθεώρηση: 2.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Office Excel 2007
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Visual Basic 6.0 Professional Edition
Λέξεις-κλειδιά: 
kbexpertisebeginner kbautomation kbhowto kbmt KB285339 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:285339

Αποστολή σχολίων

 

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