Servidor RTD não envia notificações de atualização para várias instâncias do Excel

Traduções deste artigo Traduções deste artigo
ID do artigo: 284883 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Quando você usa várias instâncias do Microsoft Office Excel juntamente com o servidor RTD (RealTimeData), poderá receber a seguinte mensagem:
O servidor de dados em tempo real 'servername.classname' não está respondendo. Deseja que o Microsoft Excel tente reiniciar o servidor?
Portanto, o servidor RTD está não é possível enviar notificações de atualização para várias instâncias do Excel.

Causa

Você pode receber essa mensagem se o servidor RTD for um EXE ActiveX que é criado para MultiUse instanciação, que é uma configuração padrão para projetos EXE ActiveX no Visual Basic. Um EXE ActiveX que é MultiUse pode ser compartilhado entre clientes. Instâncias separadas do Excel não podem compartilhar servidores RTD. Quando o Excel inicia um servidor RTD, o Excel chama o método de servidor RTD ServerStart e, em seguida, passa-lo uma referência para o objeto de retorno de chamada para essa instância do Excel. Portanto, se duas instâncias do Excel tentarem compartilhar o mesmo servidor RTD, a segunda instância substitui o objeto de retorno de chamada para a primeira instância. Esse comportamento invalida o objeto de retorno de chamada para a primeira instância.

Resolução

Use SingleUse instanciação de componentes de EXE ActiveX que irão atuar como servidores RTD para o Excel. Quando você cria EXE ActiveX componentes como SingleUse, cada instância do Excel tem sua própria instância do RTD servidor.

Outra solução é usar uma DLL ActiveX para o servidor RTD em vez de um EXE ActiveX. Carregar DLLs do ActiveX no mesmo espaço de processo como seus clientes e cada instância do Excel sempre tem sua própria instância do servidor RTD.

Mais Informações

Etapas para reproduzir o problema

  1. No Visual Basic, crie um EXE ActiveX novo projeto.
  2. No menu Project , clique em referências .
  3. Selecione a Biblioteca de objetos do Microsoft Excel 2002 e, em seguida, clique em OK .
  4. No menu Project , clique em Propriedades de Projeto1 .
  5. Alterar o nome do projeto para "RTDExe" e, em seguida, clique em OK .
  6. Altere a propriedade nome do módulo de classe Class1 para "Exemplo".
  7. Adicione o seguinte código ao módulo de classe.
    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. No menu Project , selecione Add Module .
  9. Adicione o seguinte código para o novo 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. No menu arquivo , clique em Criar RTDExe.exe para criar o componente.
  11. No Excel, crie uma nova pasta de trabalho.
  12. Na célula A1, digite a seguinte fórmula:
    =RTD("RTDExe.Example",,"X")
    A função retornará 0.
  13. Após cinco segundos, o valor em incrementos de A1 para indicar que o servidor é notificar Excel de atualizações.
  14. Iniciar outra instância do Excel e, em seguida, adicione uma nova pasta de trabalho.
  15. Na célula A1, digite a seguinte fórmula:
    =RTD("RTDExe.Example",,"X")
    A função retornará 0.
  16. O valor A1 da segunda instância do Excel continua a atualizar. Mas não o valor A1 da primeira instância. Após a pulsação intervalo tiver decorrido (15 segundos é o padrão), a primeira instância do Excel exibe a seguinte mensagem de erro:
    O servidor de dados em tempo real 'rtdexe.example' não está respondendo. Deseja que o Microsoft Excel tente reiniciar o servidor?
    Se você clicar em Sim , o servidor for reiniciado, e a primeira instância do Excel recebe atualização notificações do servidor. No entanto, depois que você reiniciar o servidor, a segunda instância do Excel, em seguida, gera a mesma mensagem após o intervalo de pulsação ter sido atingido.
Para corrigir o problema para que você não receber esse erro, alterne para o projeto em Visual Basic, altere a propriedade Instancing da classe de exemplo para SingleUse e, em seguida, recriar o servidor RTD.

Referências

Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
285339Como criar um servidor RealTimeData para Excel

Propriedades

ID do artigo: 284883 - Última revisão: segunda-feira, 14 de maio de 2007 - Revisão: 3.2
A informação contida neste artigo aplica-se a:
  • Microsoft Office Excel 2007
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Visual Basic 6.0 Professional Edition
Palavras-chave: 
kbmt kberrmsg kbpending kbprb KB284883 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 284883

Submeter comentários

 

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