RTD 伺服器並不會將更新通知傳送至多個 Excel 執行個體

文章翻譯 文章翻譯
文章編號: 284883 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

徵狀

當您使用 Microsoft Office Excel 的多個執行個體一起 RealTimeData (RTD) 伺服器時,可能會收到下列訊息:
即時資料伺服器 'servername.classname' 沒有回應。您要 Microsoft Excel 將嘗試重新啟動伺服器嗎?
因此,RTD 伺服器就無法傳送更新通知給多個 Excel 執行個體。

發生的原因

如果您的 RTD 伺服器是針對 MultiUse 具現化,Visual Basic 中的 ActiveX 執行檔專案的預設設定是建立一個 ActiveX 執行檔,可能會收到這個訊息。可在用戶端之間共用是 MultiUse ActiveX 執行檔。不同的 Excel 執行個體無法共用的 RTD 伺服器。Excel 啟動 RTD 伺服器時, Excel 呼叫 RTD 伺服器 ServerStart 方法並再傳遞它 回呼 物件的參照的 Excel 該執行個體。因此,如果兩個執行個體的 Excel 試著共用相同的 RTD 伺服器,第二個執行個體將會取代第一個執行個體之 回呼 物件。這種行為會使第一個執行個體之 回呼 物件失效。

解決方案

使用 SingleUse 將作為 Excel 的 RTD 伺服器的 ActiveX EXE 元件的執行個體。當您建置 ActiveX EXE 元件為 SingleUse 時,Excel 的每個執行個體都有自己的執行個體的 [RTD 伺服器。

另一個解決方法是用於您的 RTD 伺服器,而非 ActiveX 執行檔的 ActiveX DLL。ActiveX DLL 載入相同的處理序空間做為他們的用戶端與 Excel 的每個執行個體永遠都有自己的 RTD 伺服器執行個體。

其他相關資訊

如果要重現問題的步驟

  1. 在 Visual Basic 中建立新的 ActiveX 執行檔的專案。
  2. 按一下 [專案] 功能表 引用項目
  3. 選取 [Microsoft Excel 2002 物件程式庫,然後按一下 [確定]
  4. 按一下 [專案] 功能表 Project1 內容
  5. 變更專案名稱為"RTDExe 」,然後按一下 [確定]
  6. 類別 1 類別模組的 [名稱] 屬性變更為 「 範例 」。
  7. 將下列程式碼加入至類別模組。
    Option Explicit
    
    Implements IRtdServer  'Interface allows Excel to contact this RealTimeData server.
    
    Dim nCounter As Long
    
    Private Function IRtdServer_ConnectData(ByVal TopicID As Long, Strings() As Variant, _
       GetNewValues As Boolean) As Variant
        IRtdServer_ConnectData = nCounter
    End Function
    
    Private Sub IRtdServer_DisconnectData(ByVal TopicID As Long)
        nCounter = 0
    End Sub
    
    Private Function IRtdServer_Heartbeat() As Long
        'Do nothing.
    End Function
    
    Private Function IRtdServer_RefreshData(TopicCount As Long) As Variant()
        Dim aUpdates(0 To 1, 0 To 0) As Variant
        nCounter = nCounter + 1
        aUpdates(0, 0) = 0   'For this sample, we only refresh topic id = 0
        aUpdates(1, 0) = nCounter
        TopicCount = 1
        IRtdServer_RefreshData = aUpdates
    End Function
    
    Private Function IRtdServer_ServerStart(ByVal CallbackObject As Excel.IRTDUpdateEvent) As Long
        nCounter = 0
        Set oCallBack = CallbackObject
        g_TimerID = SetTimer(0, 0, TIMER_INTERVAL, AddressOf TimerCallback)
        If g_TimerID > 0 Then IRtdServer_ServerStart = 1       'Any value <1 indicates failure.
    End Function
    
    Private Sub IRtdServer_ServerTerminate()
        KillTimer 0, g_TimerID
    End Sub
    					
  8. 在 [專案] 功能表上, 選取 [加入模組]。
  9. 將下列程式碼加入至新的模組。
    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
    					
  10. 按一下 [檔案] 功能表 建立 RTDExe.exe 來建置元件。
  11. 在 Excel 中, 建立新的活頁簿。
  12. 儲存格 A1 中輸入下列公式:
    =RTD("RTDExe.Example",,"X")
    函式會傳回 0。
  13. 之後五秒中,表示伺服器通知更新 Excel A1 增量值。
  14. 啟動 Excel 的另一個執行個體,然後再新增新的活頁簿。
  15. 儲存格 A1 中輸入下列公式:
    =RTD("RTDExe.Example",,"X")
    函式會傳回 0。
  16. 中 A1 Excel 第二個執行個體的值會繼續更新。但在 A1 第一個執行個體的值不會。之後在活動訊號間隔已耗用 (15 秒為預設值) 第一個執行個體的 Excel 會顯示下列的錯誤訊息:
    即時資料伺服器 'rtdexe.example' 沒有回應。您要 Microsoft Excel 將嘗試重新啟動伺服器嗎?
    如果您按一下 [是],在伺服器重新啟動,且第一個執行個體的 Excel 接收更新從伺服器的通知。但是,您重新啟動伺服器 Excel 的第二個執行個體之後接著會產生相同的訊息到達活動訊號間隔後。
若要更正此問題,這樣您就不會收到這個錯誤,切換至 Visual Basic 中的專案、 將 範例 類別的 [Instancing 屬性變更為 SingleUse,而且然後重新建立 RTD 伺服器。

?考

如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
285339如何建立的 Excel RealTimeData 伺服器

屬性

文章編號: 284883 - 上次校閱: 2007年5月14日 - 版次: 3.2
這篇文章中的資訊適用於:
  • Microsoft Office Excel 2007
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Visual Basic 6.0 Professional Edition
關鍵字:?
kbmt kberrmsg kbpending kbprb KB284883 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:284883
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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