كيفية إنشاء ملقم RealTimeData ل Excel

ملخص

يوفر Microsoft Excel دالة ورقة عمل جديدة، الحق في التنمية، الذي يسمح لك بالاتصال بخادم التنفيذ تلقائي طراز كائن مكون (COM) لاسترداد بيانات الوقت الحقيقي. توضح هذه المقالة كيفية استخدام Visual Basic لإنشاء ملقم RealTimeData للاستخدام بواسطة الدالة RTD في Excel.

مزيد من المعلومات

دالة RTD ورقة العمل على بناء الجملة التالي:
= RTD (ProgID، ملقم، String1،[String2]،... )
الوسيطة الأولى 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، يجب تطبيق واجهة إيرتدسيرفير . يجب تطبيق الخادم كافة الطرق إيرتدسيرفير:

سيرفيرستارت
استدعاء عندما يطلب Excel الأول موضوع الحق في التنمية للخادم. يجب إرجاع سيرفيرستارت 1 على النجاح، وقيمة سالبة أو 0 عند الفشل. المعلمة الأولى للأسلوب سيرفيرستارت هو كائن رد اتصال التي يستخدمها ملقم RealTimeData إعلام Excel عند أنه ينبغي تجميع التحديثات من الملقم RealTimeData.
سيرفيرتيرميناتي
استدعاء عندما لم يعد يتطلب Excel مواضيع الحق في التنمية من الملقم RealTimeData.
كونيكتداتا
استدعاء عندما يطلب Excel جديد موضوع الحق في التنمية من الملقم RealTimeData.
ديسكونيكتداتا
استدعاء عندما لم يعد يتطلب Excel بموضوع معين.
نبض
استدعاء بواسطة Excel في حالة انقضاء فترة معينة منذ آخر مرة تم إعلام Excel تحديثات من ملقم RealTimeData.
ريفريشداتا
استدعاء عندما يطلب Excel تحديث على المواضيع. يسمى ريفريشداتا بعد أن الخادم يقوم بإعلام Excel التحديثات الموجودة، وتقوم بإرجاع عدد من المواضيع لتحديث جنبا إلى جنب مع معرف الموضوع وقيمة لكل موضوع.

إنشاء نموذج خادم RealTimeData

يوضح النموذج التالي كيفية إنشاء واستخدام ملقم RealTimeData مع Microsoft Excel 2002. يوفر هذا الملقم ببساطة عداد الذي يتم تحديثه كل 10 ثوان في ورقة عمل. يقبل الملقم حتى سلسلتين من الموضوع. يمكن أن تكون السلسلة الموضوع الأول AAA BBB ومجلس التعاون الجمركي؛ يعتبر أي سلسلة الموضوع غير صالحة والخادم بإرجاع #VALUE! دالة RTD. السلسلة الثانية هي قيمة رقمية التي تمثل كيفية زيادة مقدار القيمة التي يتم إرجاعها. إذا تم حذف السلسلة الثانية، يتخلف عن قيمة الزيادة 1. إذا كانت السلسلة الثانية غير رقمية، ترجع الملقم #NUM! دالة RTD.
  1. بدء مشروع ActiveX DLL جديد في Visual Basic.
  2. من القائمة المشروع انقر " مراجع" وحدد "مكتبة كائنات" لإصدار Excel وثم انقر فوق موافق. على سبيل المثال، حدد واحد مما يلي:
    • ل Microsoft Office Excel 2007، حدد كائن Microsoft Excel 12.0 مكتبة.
    • ل Microsoft Office Excel 2003، حدد مكتبة كائنات 11.0 Microsoft Excel.
    • لبرنامج Microsoft Excel 2002، حدد كائن Microsoft Excel 10.0 مكتبة.
  3. من القائمة مشروع ، انقر فوق خصائص مشروع 1. تغيير اسم المشروع إلى اكسسيلرتدومن ثم انقر فوق موافق.
  4. تغيير خاصية اسم فئة الوحدة النمطية Class1 إلى رتدفونكشنز. أضف التعليمات البرمجية التالية إلى رتدفونكشنز:
    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. من القائمة مشروع ، انقر فوق إضافة فئة وحدة نمطية. تغيير خاصية اسم الوحدة النمطية للفئة الموضوع وتغيير الخاصية إينستانسينج إلى القطاع الخاص. إضافة التعليمات البرمجية التالية إلى الوحدة النمطية للفئة الموضوع :
    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 من IDE Visual Basic.

لتشغيل في وضع التصحيح:
  1. إنهاء Microsoft Excel، وقم بالتبديل إلى المشروع في Visual Basic.
  2. اضغط F5 لتشغيل المكون. إذا ظهر مربع الحوار خصائص المشروع ، انقر فوق "موافق" لتحديد الخيار الافتراضي الانتظار للمكونات المراد إنشاؤه.
  3. تأكد من أنه يتم عرض الإطار الحالي في Visual Basic. إدخال الصيغ في الخلايا والخلايا التي يتم تحديثها، فحص محتويات الإطار الحالي في Visual Basic لمعرفة الإجراءات التي تتسبب في أحداث مختلفة.
ملاحظة بشأن الحدث ديسكونيكتداتا

عندما يكون Excel مشترك للخادم الحق في التنمية، فإنه يقوم بتشغيل الحدث ديسكونيكتداتا عندما لم يعد يحتاج موضوع (على سبيل المثال، عند حذف أو مسح صيغة RTD في خلية). ومع ذلك، Excel لا يدعو إلى ديسكونيكتداتا في كل موضوع الملقم RTD عند إغلاق المصنف أو إنهاء Excel؛ بدلاً من ذلك، يستدعي Excel فقط سيرفيرتيرميناتي. عندما تقوم بإنشاء خادم خاص بالحق في التنمية، يجب أن التعليمات البرمجية لأي الضرورة تنظيف المواضيع أو كائنات أخرى عندما وقع الحدث ServerTerminate .

(ج) Microsoft Corporation 2001، جميع الحقوق محفوظة. المساهمات المقدمة من وري ب. تيرنر، Microsoft Corporation.

المراجع

للحصول على معلومات إضافية، انقر فوق رقم المقالة التالي لعرضها في "قاعدة معارف Microsoft":

284883 RTD Server لا يرسل إعلامات تحديث لمثيلات متعددة من Excel

خصائص

رقم الموضوع: 285339 - آخر مراجعة: 22‏/01‏/2017 - المراجعة: 1

تعليقات