Server RTD non invia le notifiche di aggiornamento a più istanze di Excel

Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell’utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell’utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.

284883
Questo articolo è stato archiviato. L’articolo, quindi, viene offerto “così come è” e non verrà più aggiornato.
Sintomi
Quando si utilizzano più istanze di Microsoft Office Excel con il server RealTimeData (RTD), si potrebbe essere visualizzato il messaggio seguente:
Il server di dati in tempo reale 'servername.classname' non risponde. Si desidera tentare di riavviare il server di Microsoft Excel?
Di conseguenza, il server di DATITEMPOREALE è Impossibile inviare le notifiche di aggiornamento a più istanze di Excel.
Cause
Puoi ricevere questo messaggio se il server RTD è un eseguibile ActiveX creato per multiuso istanze, ovvero l'impostazione predefinita per i progetti EXE ActiveX in Visual Basic. Un file EXE ActiveX che è multiuso possono essere condivise tra i client. Istanze separate di Excel non possono condividere server RTD. Quando si avvia un server RTD per Excel, Excel chiama il metodo server RTD ServerStart e quindi passa un riferimento all'oggetto CallBack per l'istanza di Excel. Di conseguenza, se due istanze di Excel tentano di condividere lo stesso server RTD, la funzione della seconda istanza sostituisce l'oggetto CallBack per la prima istanza. Questo comportamento invalida l'oggetto di CallBack per la prima istanza.
Risoluzione
Utilizzare SingleUse istanze per componenti di EXE ActiveX che fungerà da server RTD per Excel. Quando si genera EXE ActiveX componenti come SingleUse, ciascuna istanza di Excel dispone di una propria istanza di RTD il server.

Un'altra soluzione consiste nell'utilizzare una DLL ActiveX per il server RTD invece di un file EXE ActiveX. DLL ActiveX caricate nello stesso spazio processo come i client e ogni istanza di Excel include sempre la propria istanza del server RTD.
Informazioni

Procedura per riprodurre il problema

  1. In Visual Basic, creare un EXE ActiveX nuovo progetto.
  2. Scegliere riferimenti dal menu progetto .
  3. Selezionare la Libreria di oggetti di Microsoft Excel 2002 e quindi fare clic su OK .
  4. Dal menu progetto , scegliere Proprietà Progetto1 .
  5. Modificare il nome del progetto per "RTDExe" e quindi fare clic su OK .
  6. Modificare la proprietà di nome del modulo di classe Class1 in "Esempio".
  7. Aggiungere il seguente codice al modulo di classe.
    Option ExplicitImplements IRtdServer  'Interface allows Excel to contact this RealTimeData server.Dim nCounter As LongPrivate Function IRtdServer_ConnectData(ByVal TopicID As Long, Strings() As Variant, _   GetNewValues As Boolean) As Variant    IRtdServer_ConnectData = nCounterEnd FunctionPrivate Sub IRtdServer_DisconnectData(ByVal TopicID As Long)    nCounter = 0End SubPrivate Function IRtdServer_Heartbeat() As Long    'Do nothing.End FunctionPrivate 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 = aUpdatesEnd FunctionPrivate 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 FunctionPrivate Sub IRtdServer_ServerTerminate()    KillTimer 0, g_TimerIDEnd Sub					
  8. Nel menu progetto , selezionare Aggiungi modulo .
  9. Aggiungere il codice riportato di seguito al nuovo modulo.
    Public Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, _   ByVal uElapse As Long, ByVal lpTimerFunc As Long) As LongPublic Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As LongPublic Const TIMER_INTERVAL = 5000Public oCallBack As Excel.IRTDUpdateEventPublic g_TimerID As LongPublic Sub TimerCallback(ByVal hWnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, _   ByVal dwTime As Long)    oCallBack.UpdateNotifyEnd Sub					
  10. Nel menu file , fare clic su Crea RTDExe.exe per creare il componente.
  11. In Excel, creare una nuova cartella di lavoro.
  12. Nella cella A1 digitare la formula seguente:
    =RTD("RTDExe.Example",,"X")
    La funzione restituisce 0.
  13. Dopo cinque secondi, il valore in incrementi di A1 per indicare che il server è notifica Excel degli aggiornamenti.
  14. Avviare un'altra istanza di Excel e quindi aggiungere una nuova cartella di lavoro.
  15. Nella cella A1 digitare la formula seguente:
    =RTD("RTDExe.Example",,"X")
    La funzione restituisce 0.
  16. Il valore di A1 della seconda istanza di Excel continuerà a essere aggiornato. Ma non il valore di A1 della prima istanza. Dopo l'heartbeat è trascorso l'intervallo (15 secondi è il valore predefinito), la prima istanza di Excel viene visualizzato il seguente messaggio di errore:
    Il server di dati in tempo reale 'rtdexe.example' non risponde. Si desidera tentare di riavviare il server di Microsoft Excel?
    Se si sceglie , il riavvio del server, e la prima istanza di Excel riceve un aggiornamento notifica dal server di. Tuttavia, dopo il riavvio del server, la seconda istanza di Excel genera quindi lo stesso messaggio raggiunto l'intervallo di heartbeat.
Per risolvere il problema in modo da non ricevere questo errore, passare al progetto in Visual Basic, impostare la proprietà di Instancing della classe example su SingleUse e quindi rigenerare il server RTD.
Riferimenti
Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
285339Come creare un Server RealTimeData per Excel
rtdserver realtimedata tempo reale dati server rtd in tempo reale prb XL2002 XL2002 XL2003 XL2007

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 284883 - Ultima revisione: 01/12/2015 17:24:08 - Revisione: 3.2

  • Microsoft Office Excel 2007
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • kbnosurvey kbarchive kbmt kberrmsg kbpending kbprb KB284883 KbMtit
Feedback