Utilisation d'une minuterie dans les macros Office VBA

Pour ceux d'entre nous qui ont l'esprit profondément dans VB.NET, le voyage de retour vers VB6 peut être un voyage déroutant. Utiliser une minuterie dans VB6, c'est comme ça. Dans le même temps, l'ajout de processus temporisés à votre code n'est pas évident pour les nouveaux utilisateurs de macros VBA.

Minuteries pour les débutants

Le codage d'une macro Word VBA pour chronométrer automatiquement un test qui a été écrit dans Word est une raison typique pour l'utilisation d'une minuterie. Une autre raison courante est de voir combien de temps prend différentes parties de votre code afin que vous puissiez travailler sur l'optimisation des sections lentes. Parfois, vous voudrez peut-être voir si quelque chose se passe dans l'application lorsque l'ordinateur semble simplement rester inactif, ce qui peut être un problème de sécurité. Les minuteries peuvent le faire.

Démarrer une minuterie

Vous démarrez une minuterie en codant une instruction OnTime. Cette instruction est implémentée dans Word et Excel, mais elle a une syntaxe différente selon celle que vous utilisez. La syntaxe de Word est:

expression.OnTime (Quand, Nom, Tolérance)

La syntaxe d'Excel ressemble à ceci:

expression.OnTime (EarliestTime, Procedure, LatestTime, Schedule)

Les deux ont le premier et le deuxième paramètre en commun. Le deuxième paramètre est le nom d'une autre macro qui s'exécute lorsque l'heure du premier paramètre est atteinte. En effet, coder cette instruction revient à créer un sous-programme d'événement en termes VB6 ou VB.NET. L'événement atteint l'heure dans le premier paramètre. Le sous-programme d'événement est le deuxième paramètre.

Ceci est différent de la façon dont il est codé en VB6 ou VB.NET. D'une part, la macro nommée dans le deuxième paramètre peut être dans n'importe quel code accessible. Dans un document Word, Microsoft recommande de le placer dans le modèle de document Normal. Si vous le placez dans un autre module, Microsoft recommande d'utiliser le chemin d'accès complet: Project.Module.Macro.

L'expression est généralement l'objet Application. La documentation Word et Excel indique que le troisième paramètre peut annuler l'exécution de la macro d'événements dans le cas où une boîte de dialogue ou un autre processus l'empêche de s'exécuter dans un certain délai. Dans Excel, vous pouvez planifier une nouvelle heure au cas où cela se produirait.

Coder la macro d'événement temporel

Ce code dans Word est destiné à l'administrateur qui souhaite afficher une notification indiquant que la durée du test a expiré et imprimer le résultat du test.

Public Sub TestOnTime ()
Debug.Print "L'alarme se déclenchera dans 10 secondes!"
Debug.Print ("Before OnTime:" & Now)
alertTime = Now + TimeValue ("00:00:10")
Application.OnTime alertTime, "EventMacro"
Debug.Print ("After OnTime:" & Now)
End Sub
Sub EventMacro ()
Debug.Print ("Exécution de la macro d'événement:" et maintenant)
End Sub

Il en résulte le contenu suivant dans la fenêtre immédiate:

L'alarme se déclenchera dans 10 secondes!
Avant OnTime: 25/12/2000 19:41:23
Après OnTime: 25/12/2000 19:41:23
Exécution de la macro d'événements: 27/02/2010 19:41:33

Option pour d'autres applications Office

Les autres applications Office n'implémentent pas OnTime. Pour ceux-là, vous avez plusieurs choix. Tout d'abord, vous pouvez utiliser la fonction Timer, qui renvoie simplement le nombre de secondes depuis minuit sur votre PC, et fait vos propres calculs, ou vous pouvez utiliser les appels de l'API Windows. L'utilisation des appels API Windows a l'avantage d'être plus précise que Timer. Voici une routine suggérée par Microsoft qui fait l'affaire:

Fonction de déclaration privée getFrequency Lib "kernel32" _
Alias ​​"QueryPerformanceFrequency" (cyFrequency As Currency) aussi long
Fonction de déclaration privée getTickCount Lib "kernel32" _
Alias ​​"QueryPerformanceCounter" (cyTickCount As Currency) aussi long
Sub TestTimeAPICalls ()
Dim dTime As Double
dTime = MicroTimer
Dim StartTime As Single
StartTime = Timer
Pour i = 1 à 10000000
Dim j As Double
j = Sqr (i)
Prochain
Debug.Print ("MicroTimer Time pris était:" & MicroTimer - dTime)
End Sub
Fonction MicroTimer () As Double
"
'Renvoie secondes.
"
Dim cyTicks1 comme devise
CyFréquence statique comme devise
"
MicroTimer = 0
«Obtenez la fréquence.
Si cyFrequency = 0 Alors getFrequency cyFrequency
«Obtenez des tiques.
getTickCount cyTicks1
«Secondes
Si cyFrequency Alors MicroTimer = cyTicks1 / cyFrequency
Fonction de fin