Servidor RTD no envía notificaciones de actualización a varias instancias de Excel

Seleccione idioma Seleccione idioma
Id. de artículo: 284883 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

Cuando se utiliza varias instancias de Microsoft Office Excel junto con el servidor RealTimeData (RTD), puede recibir el mensaje siguiente:
El servidor de datos en tiempo real 'servername.classname' no responde. ¿Desea que Microsoft Excel intente reiniciar el servidor?
Por lo tanto, el servidor RTD es incapaz de enviar notificaciones de actualización a varias instancias de Excel.

Causa

Puede recibir este mensaje si el servidor RTD es un EXE de ActiveX se creó para MultiUse creación de instancias, que es un valor predeterminado para proyectos de EXE ActiveX en Visual Basic. Un EXE de ActiveX es MultiUse puede compartirse entre los clientes. Instancias independientes de Excel no pueden compartir servidores RTD. Cuando Excel inicia un servidor RTD, Excel llama al método ServerStart de servidor RTD y, a continuación, lo pasa una referencia al objeto CallBack para esa instancia de Excel. Por lo tanto, si dos instancias de Excel intentan compartir el mismo servidor RTD, la segunda instancia reemplaza el objeto CallBack para la primera instancia. Este comportamiento invalida el objeto CallBack para la primera instancia.

Solución

Utilice la creación de instancias SingleUse para componentes de ActiveX EXE que actuarán como servidores RTD para Excel. Al generar componentes ActiveX EXE como SingleUse, cada instancia de Excel tiene su propia instancia de la RTD servidor.

Otra solución es utilizar una DLL de ActiveX para el servidor RTD en lugar de un archivo EXE de ActiveX. Carga de DLL ActiveX en el mismo espacio de proceso que sus clientes y cada instancia de Excel siempre tiene su propia instancia del servidor RTD.

Más información

Pasos para reproducir el problema

  1. En Visual Basic, cree un EXE de ActiveX nuevo proyecto.
  2. En el menú proyecto , haga clic en referencias .
  3. Seleccione la Biblioteca de objetos de Microsoft Excel 2002 y, a continuación, haga clic en Aceptar .
  4. En el menú proyecto , haga clic en Propiedades de Project1 .
  5. Cambie el nombre del proyecto a "RTDExe" y, a continuación, haga clic en Aceptar .
  6. Cambie la propiedad nombre del módulo de clase Class1 a "Ejemplo".
  7. Agregue el código siguiente al módulo de clase.
    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. En el menú proyecto , seleccione Agregar módulo .
  9. Agregue el código siguiente al nuevo módulo.
    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. En el menú archivo , haga clic en Crear RTDExe.exe para crear el componente.
  11. En Excel, crear un nuevo libro.
  12. En la celda A1, escriba la fórmula siguiente:
    =RTD("RTDExe.Example",,"X")
    La función devuelve 0.
  13. Después de cinco segundos, el valor en incrementos de A1 para indicar que el servidor es notificar a Excel de las actualizaciones.
  14. Inicie otra instancia de Excel y, a continuación, agregue un nuevo libro.
  15. En la celda A1, escriba la fórmula siguiente:
    =RTD("RTDExe.Example",,"X")
    La función devuelve 0.
  16. El valor de A1 de la segunda instancia de Excel continuará actualizándose. Pero no el valor de A1 de la primera instancia. Tras el latido ha transcurrido el intervalo (15 segundos es el valor predeterminado), la primera instancia de Excel muestra el mensaje de error siguientes:
    El servidor de datos en tiempo real 'rtdexe.example' no responde. ¿Desea que Microsoft Excel intente reiniciar el servidor?
    Si hace clic en , se reiniciará el servidor y la primera instancia de Excel recibe actualización notificaciones desde el servidor. Sin embargo, después de reiniciar el servidor, la segunda instancia de Excel, a continuación, genera el mismo mensaje ha sido alcanza el intervalo de latidos.
Para corregir el problema, de modo que no reciban este error, cambie al proyecto en Visual Basic, cambie la propiedad Instancing de la clase example a SingleUse y, a continuación, reconstruya el servidor RTD.

Referencias

Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
285339Cómo crear un servidor RealTimeData para Excel

Propiedades

Id. de artículo: 284883 - Última revisión: lunes, 14 de mayo de 2007 - Versión: 3.2
La información de este artículo se refiere a:
  • Microsoft Office Excel 2007
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Visual Basic 6.0 Professional Edition
Palabras clave: 
kbmt kberrmsg kbpending kbprb KB284883 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 284883

Enviar comentarios

 

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