Serveur RTD n'envoie pas de notifications de mise à jour à plusieurs instances d'Excel

Traductions disponibles Traductions disponibles
Numéro d'article: 284883 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Symptômes

Lorsque vous utilisez avec votre serveur RTD plusieurs instances de Microsoft Office Excel, le message suivant s'affiche :
Le serveur de données temps réel " servername.classname " ne répond pas Voudrez vous que Microsoft Excel tente de redémarrer le serveur ?
Par conséquent votre serveur RTD est incapable d'envoyer des notifications de mise à jour à plusieurs instances d'Excel.

Cause

Vous pouvez recevoir ce message si votre serveur RTD est un ActiveX EXE construit pour MultiUse instancing qui est un paramètre par défaut pour les projets ActiveX EXE dans Visual Basic Un ActiveX EXE MultiUse peut être partagés par plusieurs clients Instances distinctes d'Excel ne peuvent pas partager des serveur RTD. Lorsque Excel démarre un serveur RTD, appelle la méthode ServerStart serveur RTD et Excel lui envoie ensuite une référence à l'objet CallBack pour l'instance de Microsoft Excel. Par conséquent si deux instances d'Excel essayent de partager le même serveur RTD, la seconde instance remplace l'objet CallBack pour la première instance. Ce comportement invalide l'objet CallBack pour la première instance.

Résolution

Utilisez SingleUse instancing pour les composants ActiveX EXE qui agiront comme des serveurs RTD pour Excel Lorsque vous construisez des composants ActiveX EXE en tant que SingleUse chaque instance de Microsoft Excel possède sa propre instance du serveur RTD

Une autre solution consiste à utiliser un DLL ActiveX pour votre serveur RTD au lieu d'un EXE ActiveX. Les DLL ActiveX chargent dans le même processus d'espace que leurs clients et chaque instance de Microsoft Excel possède toujours sa propre instance du serveur RTD

Plus d'informations

Étapes permettant de reproduire le problème

  1. Dans Visual Basic créez un nouveau projet ActiveX EXE
  2. Dans le menu Projet, cliquez sur Références.
  3. Sélectionnez Bibliothèque d'objets de Microsoft Excel 2002 et puis cliquez sur OK.
  4. Dans le menu Projet, cliquez sur Propriétés de Projet1.
  5. Modifiez le nom du projet en "RTDExe" et puis cliquez sur OK.
  6. Changez la propriété Nom du module de classe Class1 à "Exemple".
  7. Ajoutez le code suivant au module 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. Dans le menu Projet, sélectionnez Ajouter un module.
  9. Ajoutez le code suivant au nouveau module
    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. Dans le menu Fichier, cliquez sur Créer RTDExe.exe pour générer le composant.
  11. Dans Microsoft Excel créez un nouveau classeur
  12. Dans la cellule A1 tapez la formule suivante
    =RTD("RTDExe.Example",,"X")
    La valeur renvoyée par la fonction est 0
  13. Après cinq secondes la valeur dans A1 indique que Microsoft Excel reçoit du serveur les notifications de mises à jour
  14. Démarrez une autre instance d'Excel et puis ajoutez un nouveau classeur.
  15. Dans la cellule A1 tapez la formule suivante
    =RTD("RTDExe.Example",,"X")
    La valeur renvoyée par la fonction est 0
  16. La valeur dans A1 de la seconde instance de Microsoft Excel continue à mettre à jour. La valeur dans A1 de la première instance ne pas. Une fois que l'intervalle de pulsation s'est écoulé (la durée par défaut est de 15 secondes) la première instance de Microsoft Excel affiche le message d'erreur suivant
    Le serveur de données temps réel " rtdexe.example " ne répond pas Voudrez vous que Microsoft Excel tente de redémarrer le serveur ?
    Si vous cliquez sur Oui les redémarrages de serveur et si la première instance de Microsoft Excel reçoit des notifications du serveur de mise à jour. Cependant une fois que vous avez redémarré le serveur la seconde instance de Microsoft Excel génère alors le même message une fois que l'intervalle de pulsation a été atteint
Pour corriger le problème de sorte que vous ne recevez pas ce message d'erreur, basculez au projet dans Visual Basic, par exemple affectez Singleux à la propriété Instancing de la classe Exemple et puis reconstruisez le serveur RTD.

Références

Pour plus d'informations cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft
285339 Comment créer un serveur RealTimeData pour Excel

Propriétés

Numéro d'article: 284883 - Dernière mise à jour: lundi 14 mai 2007 - Version: 3.1
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Office Excel 2007
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Visual Basic 6.0 Professional Edition
Mots-clés : 
kberrmsg kbpending kbprb KB284883 KbMtfr kbmt
Traduction automatique
TRADUCTION AUTOMATIQUE : Cet article technique a été traduit par un système automatique, c'est-à-dire sans aucune intervention humaine. Microsoft propose ce type d?articles en complément de ceux traduits par des traducteurs professionnels. Ces articles sont destinés principalement aux utilisateurs ne comprenant pas l'anglais en leur proposant, en complément, une version française de l?information technique fournie dans la version américaine et originale de l?article. Pour plus de détails, veuillez consulter la page http://support.microsoft.com/gp/mtdetails. Attention : Il est possible que certaines parties de l?article ne soient pas traduites par le système automatique et qu?elles soient restées rédigées en anglais. Microsoft ne garantit pas la qualité linguistique des traductions et ne peut être tenu responsable d?aucun problème, direct ou indirect, dû à une quelconque erreur de traduction du contenu ou de son utilisation par les utilisateurs.
La version anglaise de cet article est la suivante: 284883
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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