PROCÉDURE : Procédure pour créer un serveur RealTimeData pour Excel 2002

Ancien nº de publication de cet article : F285339
Résumé
Microsoft Excel 2002 fournit une nouvelle fonction de feuille de calcul, RTD, qui vous permet d'appeler un serveur Automation COM (Component Object Model) pour récupérer les données en temps réel. Cet article décrit la façon d'utiliser Visual Basic pour créer un serveur RealTimeData à utiliser avec la fonction RTD de Microsoft Excel.
Plus d'informations
La fonction de feuille de calcul RTD présente la syntaxe suivante :
=RTD(ProgID, Serveur, Chaîne1,[Chaîne2],...)
Le premier argument, ProgID, représente le nom de classe (ProgID) du serveur RealTimeData. L'argument Serveur indique le nom de la machine sur laquelle le serveur RealTimeData est exécuté ; cet argument peut être une chaîne nulle ou omise si le serveur RealTimeData doit s'exécuter en local. Les arguments restants représentent simplement les paramètres à envoyer au serveur RealTimeData ; chaque combinaison unique de ces paramètres représente une " rubrique ", qui a un " nom de rubrique ". Les paramètres respectent la casse. Par exemple, l'exemple suivant illustre des appels vers le serveur RTD qui aboutissent à trois noms de rubriques séparés :
=RTD("ExcelRTD.RTDFunctions",,"AAA", "10")

=RTD("ExcelRTD.RTDFunctions",,"AAA", "5")

=RTD("ExcelRTD.RTDFunctions",,"aaa", "5")
Pour qu'un serveur Automation COM soit un serveur RealTimeData à utiliser avec la fonction RTD de Microsoft Excel, il doit implémenter l'interface IRTDServer. Le serveur doit implémenter toutes les méthodes de IRTDServer :

ServerStart
Appelé lorsque Microsoft Excel demande la première rubrique RTD pour le serveur. ServerStart doit retourner la valeur 1 en cas de succès, et une valeur négative ou 0 en cas d'échec. Le premier paramètre de la méthode ServerStart est un objet de rappel que le serveur RealTimeData utilise pour avertir Microsoft Excel lorsqu'il doit rassembler les mises à jour à partir du serveur RealTimeData.
ServerTerminate
Appelé lorsque Microsoft Excel ne demande plus de rubriques RTD à partir du serveur RealTimeData.
ConnectData
Appelé à chaque fois que Microsoft Excel demande une nouvelle rubrique RTD à partir du serveur RealTimeData.
DisconnectData
Appelé à chaque fois que Microsoft Excel ne demande plus une rubrique spécifique.
HeartBeat
Appelé par Microsoft Excel si un intervalle donné s'est écoulé depuis la dernière fois que Microsoft Excel a été averti des mises à jour à partir du serveur RealTimeData.
RefreshData
Appelé lorsque Microsoft Excel demande une actualisation des rubriques. RefreshData est appelé une fois que le serveur a informé Microsoft Excel que ces mises à jour existent, il retourne un compte des rubriques à mettre à jour avec le nom de la rubrique et la valeur pour chaque rubrique.

Créez un serveur RealTimeData exemple

L'exemple suivant explique la procédure à suivre pour créer et utiliser un serveur RealTimeData avec Microsoft Excel 2002. Ce server fournit simplement un compteur mis à jour toutes les 10 secondes sur une feuille de calcul. Le serveur accepte jusqu'à deux chaînes de rubrique. La première chaîne de rubrique peut être AAA, BBB et CCC ; aucune autre chaîne de rubrique n'est considérée comme valide et le serveur renvoie #VALUE! à la fonction RTD. La deuxième chaîne est une valeur numérique qui représente la façon dont la valeur renvoyée doit être incrémentée. Si la deuxième chaîne est omise, la valeur d'incrémentation par défaut est 1. Si la deuxième chaîne n'est pas numérique, le serveur renvoie #NUM! à la fonction RTD.
  1. Démarrez un nouveau projet DLL ActiveX dans Visual Basic.
  2. Dans le menu Projet, cliquez sur Références, sélectionnez Bibliothèque d'objet Microsoft Excel 10.0 et cliquez sur OK.
  3. Dans le menu Projet, cliquez sur Propriétés Projet1. Modifiez le Nom du projet en ExcelRTD, et cliquez sur OK.
  4. Modifiez la propriété Nom du module de classe Classe1 en FonctionsRTD. Ajoutez le code suivant à FonctionsRTD :
    Option ExplicitImplements IRtdServer  'Cet Interface permet à Excel de contacter ce serveur temps réel (RTD)Private m_colTopics As CollectionPrivate Function IRtdServer_ConnectData(ByVal TopicID As Long, Strings() As Variant, GetNewValues As Boolean) As Variant    '** ConnectData est appelé à chaque fois qu'une nouvelle rubrique RTD est demandée    'Créez une nouvelle classe de rubrique avec le nom de rubrique et la chaîne donnés et ajoutez-la à    'm_colTopics collection    Dim oTopic As New Topic    m_colTopics.Add oTopic, CStr(TopicID)    oTopic.TopicID = TopicID    oTopic.TopicString = Strings(0)    If UBound(Strings) >= 1 Then oTopic.SetIncrement Strings(1)    'Pour cet exemple, la valeur initiale pour une nouvelle rubrique est toujours 0    IRtdServer_ConnectData = oTopic.TopicValue    Debug.Print "ConnectData", TopicIDEnd FunctionPrivate Sub IRtdServer_DisconnectData(ByVal TopicID As Long)   '** DisconnectData est appelé à chaque fois qu'une rubrique spécifique n'est plus nécessaire    'Supprimez la rubrique de la collection    m_colTopics.Remove CStr(TopicID)      Debug.Print "DisconnectData", TopicIDEnd SubPrivate Function IRtdServer_Heartbeat() As Long    '** Appelé par Microsoft Excel si l'intervalle de pulsation s'est écoulé depuis la dernière fois    '   Excel a été appelé avec UpdateNotify.    Debug.Print "HeartBeat"End FunctionPrivate Function IRtdServer_RefreshData(TopicCount As Long) As Variant()    '** Appelé lorsque Microsoft Excel demande une actualisation des données sur les rubriques. RefreshData sera appelé    '   après que UpdateNotify ait été émis par le serveur. Cet événement doit :    '   - fournir une valeur à TopicCount (nombre de rubriques à mettre à jour)    '   - renvoyer un tableau de variantes bi-dimensionnelles contenant le nom    '     de la rubrique et les nouvelles valeurs pour chacune d'elle.    Dim oTopic As Topic, n As Integer    ReDim aUpdates(0 To 1, 0 To m_colTopics.Count - 1) As Variant    For Each oTopic In m_colTopics        oTopic.Update        aUpdates(0, n) = oTopic.TopicID        aUpdates(1, n) = oTopic.TopicValue        n = n + 1    Next    TopicCount = m_colTopics.Count    IRtdServer_RefreshData = aUpdates      Debug.Print "RefreshData", TopicCount & " topics updated"End FunctionPrivate Function IRtdServer_ServerStart(ByVal CallbackObject As Excel.IRTDUpdateEvent) As Long    '** ServerStart est appelé lorsque la première rubrique RTD est demandée        Set oCallBack = CallbackObject    Set m_colTopics = New Collection    g_TimerID = SetTimer(0, 0, TIMER_INTERVAL, AddressOf TimerCallback)    If g_TimerID > 0 Then IRtdServer_ServerStart = 1       'Any value <1 indique l'échec.        Debug.Print "ServerStart"End FunctionPrivate Sub IRtdServer_ServerTerminate()    '** ServerTerminate est appelé lorsque Microsoft Excel n'a plus besoin de rubrique.        KillTimer 0, g_TimerID    '** Nettoyez toutes les rubriques restantes. Cela s'effectue ici puisque     '   IRtdServer_DisconnectData n'est appelé que si une rubrique est déconnectée     '   alors que le classeur est ouvert. Les éléments laissés dans la collection lorsque vous avez terminé     '   sont ces rubriques laissées en cours de fonctionnement lorsque le classeur était fermé.    Dim oTopic As Topic    For Each oTopic In m_colTopics        m_colTopics.Remove CStr(oTopic.TopicID)        Set oTopic = Nothing    Next    Debug.Print "ServerTerminate"  End Sub
  5. Dans le menu Projet menu, cliquez sur Ajouter un module de classe. Modifiez la propriété Nom du module de classe en Rubrique et la propriété Instancing en Privé. Ajoutez le code suivant au module de classe Rubrique :
    Option ExplicitPrivate m_TopicID As LongPrivate m_TopicString As StringPrivate m_Value As VariantPrivate m_IncrementVal As LongPrivate Sub Class_Initialize()    m_Value = 0    m_IncrementVal = 1End SubFriend Property Let TopicID(ID As Long)    m_TopicID = IDEnd PropertyFriend Property Get TopicID() As Long    TopicID = m_TopicIDEnd PropertyFriend Property Let TopicString(s As String)    s = UCase(s)    If s = "AAA" Or s = "BBB" Or s = "CCC" Then        m_TopicString = s    Else        m_Value = CVErr(xlErrValue) 'Renvoie la valeur #VALUE si ce n'est pas l'une des rubriques listées    End IfEnd PropertyFriend Sub Update()    On Error Resume Next 'the next operation will fail if m_Value is an error (like #NUM or #VALUE)    m_Value = m_Value + m_IncrementValEnd SubFriend Sub SetIncrement(v As Variant)    On Error Resume Next    m_IncrementVal = CLng(v)    If Err <> 0 Then        m_Value = CVErr(xlErrNum) 'Renvoie la valeur #NUM si la valeur d'incrément n'est pas numérique    End IfEnd SubFriend Property Get TopicValue() As Variant    If Not (IsError(m_Value)) Then        TopicValue = m_TopicString & ": " & m_Value    Else        TopicValue = m_Value    End IfEnd Property
  6. Dans le menu Projet menu, sélectionnez Ajouter un module. 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 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
  7. Dans le menu Fichier, cliquez sur Créer ExcelRTD.dll pour construire le composant.

Utilisez le serveur RTD dans Excel

  1. Démarrez un nouveau classeur dans Microsoft Excel.
  2. Dans la cellule A1, entrez la formule suivante et appuyez sur la touche ENTRÉE :
    =RTD("ExcelRTD.FonctionsRTD",,"AAA", 5)
    La valeur renvoyée initiale est " AAA : 0 ". Au bout de cinq secondes, la valeur se met à jour en " AAA : 10 " et 10 secondes après, la valeur se met à jour en " AAA:15 ", etc.

  3. La valeur renvoyée initiale est " AAA : 0 ". Au bout de cinq secondes, la valeur se met à jour en " AAA : 10 " et 10 secondes après, la valeur se met à jour en " AAA:15 ", etc. Dans la cellule A2, entrez la formule suivante et appuyez sur la touche ENTRÉE :
    =RTD("ExcelRTD.FonctionsRTD",,"BBB", 3)
    La valeur renvoyée initiale est " BBB : 0 ". Toutes les cinq secondes, la valeur de la cellule augmente de 3.

  4. La valeur renvoyée initiale est " AAA : 0 ". Au bout de cinq secondes, la valeur se met à jour en " AAA : 10 " et 10 secondes après, la valeur se met à jour en " AAA:15 ", etc. Dans la cellule A3, entrez la formule suivante et appuyez sur la touche ENTRÉE :
    =RTD("ExcelRTD.FonctionsRTD",,"AAA", 5)
    La valeur renvoyée initiale correspond au contenu de la cellule A1 car il s'agit de la même " rubrique " utilisée dans A1.

  5. La valeur renvoyée initiale est " AAA : 0 ". Au bout de cinq secondes, la valeur se met à jour en " AAA : 10 " et 10 secondes après, la valeur se met à jour en " AAA:15 ", etc. Dans la cellule A4, entrez la formule suivante et appuyez sur la touche ENTRÉE :
    =RTD("ExcelRTD.FonctionsRTD",,"AAA", 10)
    La valeur renvoyée initiale est " AAA : 0 ". Toutes les cinq secondes, la valeur de la cellule augmente comme le font les autres cellules. Notez que la valeur renvoyée ne correspond pas au contenu de la cellule A1 ou A3 car la combinaison des paramètres transmis au serveur est différente.
Pour cet exemple, le serveur RTD a été compilé et Excel a utilisé la version d'exécution du composant. Pour les problèmes de débogage, les serveurs RTD peuvent être exécutés à partir de Visual Basic IDE.

Pour effectuer une exécution en mode débogage :
  1. Quittez Microsoft Excel et passez au projet dans Visual Basic.
  2. Appuyez sur F5 pour démarrer le composant. Si la boîte de dialogue Propriétés du projet s'affiche, cliquez sur OK pour sélectionner l'option par défaut de Attendre la création de composants.
  3. Assurez-vous que la fenêtre Exécution dans Visual Basic est affichée. Dès que vous entrez les formules dans les cellules et dès que les cellules sont mises à jour, examinez le contenu de la fenêtre Exécution dans Visual Basic pour voir quelles actions déclenchent les différents événements.
Remarque concernant l'événement DisconnectData

Alors que Microsoft Excel est un abonné à votre serveur RTD, il déclenche l'événement DisconnectData lorsqu'il n'a plus besoin d'une rubrique (par exemple, lorsque vous supprimez ou effacez une formule RTD dans une cellule). Cependant, Excel n'appelle pas DisconnectData sur chaque rubrique du serveur RTD lorsque le classeur est fermé ou Microsoft Excel se ferme ; au lieu de cela, Excel appelle seulement ServerTerminate. Lorsque vous créez un serveur RTD, vous devez ajouter du code au cas où un nettoyage des rubriques ou des autres objets soit nécessaire lorsque l'événement ServerTerminate se déclenche.

(c) Microsoft Corporation 2001, Tous droits réservés. Contributions de Lori B. Turner, Microsoft Corporation.

Propriétés

ID d'article : 285339 - Dernière mise à jour : 02/23/2006 10:22:31 - Révision : 3.0

Microsoft Excel 2002, Microsoft Visual Basic 6.0 Édition professionnelle

  • kbautomation kbexcel kbgrpdso kbhowto kbvbp600 KB285339
Commentaires