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.
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 :
ServerStartAppelé 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.
ServerTerminateAppelé lorsque Microsoft Excel ne demande plus de rubriques RTD à partir du serveur RealTimeData.
ConnectDataAppelé à chaque fois que Microsoft Excel demande une nouvelle rubrique RTD à partir du serveur RealTimeData.
DisconnectDataAppelé à chaque fois que Microsoft Excel ne demande plus une rubrique spécifique.
HeartBeatAppelé 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.
RefreshDataAppelé 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.
- Démarrez un nouveau projet DLL ActiveX dans Visual
Basic.
- Dans le menu Projet, cliquez sur Références, sélectionnez Bibliothèque d'objet Microsoft Excel 10.0 et cliquez sur OK.
- Dans le menu Projet, cliquez sur Propriétés Projet1. Modifiez le Nom du projet en ExcelRTD, et cliquez sur OK.
- 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
- 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 - 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 - Dans le menu Fichier, cliquez sur Créer ExcelRTD.dll pour construire le composant.
Utilisez le serveur RTD dans Excel
- Démarrez un nouveau classeur dans Microsoft
Excel.
- 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.
- 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.
- 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.
- 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 :
- Quittez Microsoft Excel et passez au projet dans Visual
Basic.
- 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.
- 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 DisconnectDataAlors 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.
Numéro d'article: 285339 - Dernière mise à jour: jeudi 23 février 2006 - Version: 3.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
- Microsoft Excel 2002
- Microsoft Visual Basic 6.0 Édition professionnelle
| 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.