Utilisation d'une minuterie dans les macros Office VBA

Coder une macro VBA pour ajouter une minuterie à votre logiciel

Chronomètre apparaissant hors de l

Dimitri Otis/Vision numérique/Getty Images





Pour ceux d'entre nous qui ont l'esprit profondément VB.NET , le voyage de retour à VB6 peut être un voyage déroutant. L'utilisation d'une minuterie dans VB6 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

Codageune macro Word VBA pour chronométrer automatiquement un test écrit dans Word est une raison typique pour l'utilisation d'une minuterie. Une autre raison courante est de voir combien de temps est pris par 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 inactif, ce qui peut poser 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 sa syntaxe diffère selon celle que vous utilisez. La syntaxe pour Word est :

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



La syntaxe pour 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 indiquée dans le premier paramètre est atteinte. En effet, coder cette instruction revient à créer une sous-routine d'événement en termes VB6 ou VB.NET. L'événement atteint l'heure du 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 se trouver 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 mettez dans un autre module, Microsoft recommande d'utiliser le chemin 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énement au cas où une boîte de dialogue ou un autre processus l'empêcherait 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 le temps de 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 ('Avant OnTime : ' & Maintenant)
alertTime = Maintenant + TimeValue('00:00:10')
Application.OnTime alertTime, 'EventMacro'
Debug.Print ('Après OnTime : ' & Maintenant)
Sous-titre de fin
Sub EventMacro()
Debug.Print ('Exécution de la macro d'événement : ' & maintenant)
Sous-titre de fin

Cela se traduit par 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énement : 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 écoulées depuis minuit sur votre PC et fait vos propres calculs, ou vous pouvez utiliser les appels d'API Windows. L'utilisation des appels d'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) As Long
Fonction de déclaration privée getTickCount Lib 'kernel32' _
Alias ​​'QueryPerformanceCounter' (cyTickCount As Currency) As Long
Sous TestTimeAPICalls()
Dim dTime As Double
dTime = MicroTimer
Dim StartTime As Single
Heure de début = Heures
Pour i = 1 à 10000000
Dim j As Double
j = Carré(i)
Prochain
Debug.Print ('MicroTimer Time pris était : ' & MicroTimer - dTime)
Sous-titre de fin

Fonction MicroTimer() As Double
'
' Renvoie les secondes.
'
Dim cyTicks1 comme devise
CyFréquence statique en tant que devise
'
MicroTimer = 0
' Obtenir la fréquence.
Si cyFrequency = 0 Alors getFrequency cyFrequency
' Attrapez des tiques.
getTickCount cyTicks1
' Secondes
Si cyFrequency Alors MicroTimer = cyTicks1 / cyFrequency
Fonction de fin