DetailPage-MSS-KB

Base de connaissances

Numéro d'article: 285339 - Dernière mise à jour: jeudi 23 février 2006 - Version: 3.0

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 Explicit
    
    Implements IRtdServer  'Cet Interface permet à Excel de contacter ce serveur temps réel (RTD)
    
    Private m_colTopics As Collection
    
    Private 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", TopicID
    End Function
    
    Private 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", TopicID
    End Sub
    
    Private 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 Function
    
    Private 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 Function
    
    Private 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 Function
    
    Private 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 Explicit
    
    Private m_TopicID As Long
    Private m_TopicString As String
    Private m_Value As Variant
    Private m_IncrementVal As Long
    
    Private Sub Class_Initialize()
        m_Value = 0
        m_IncrementVal = 1
    End Sub
    
    Friend Property Let TopicID(ID As Long)
        m_TopicID = ID
    End Property
    
    Friend Property Get TopicID() As Long
        TopicID = m_TopicID
    End Property
    
    Friend 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 If
    End Property
    
    Friend 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_IncrementVal
    End Sub
    
    Friend 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 If
    End Sub
    
    Friend Property Get TopicValue() As Variant
        If Not (IsError(m_Value)) Then
            TopicValue = m_TopicString & ": " & m_Value
        Else
            TopicValue = m_Value
        End If
    End 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 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
  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.


Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Excel 2002
  • Microsoft Visual Basic 6.0 Édition professionnelle
Mots-clés : 
kbautomation kbexcel kbgrpdso kbhowto kbvbp600 KB285339
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.
Partager
Options de support supplémentaire
Forums du support Microsoft Community
Nous contacter directement
Trouver un partenaire Microsoft Certified Partner
Microsoft Store