Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :
Sujets que vous pourriez aussi aimer :Chronomètre en VBA Excel
Dans ce nouveau volet, nous allons apprendre à créer un
chronomètre en VBA Excel. Cette nouvelle astuce est surtout un prétexte pour savoir gérer les
intervalles de temps par le code. Grâce à eux, il devient alors possible de créer des
animations, de générer des
actions périodiques comme le ferait par exemple un
gestionnaire de tâches.
Sur l'exemple illustré par la capture, lorsque l'utilisateur clique sur le
bouton vert de lecture, la
boucle de temps s'initialise à l'intérieur du chronomètre et les secondes défilent. S'il clique sur le
bouton orange de pause, une temporisation est observée et le décompte se fige jusqu'à ce qu'il clique de nouveau sur le même bouton. S'il clique sur le
bouton rouge de stop, la boucle de temps et le chronomètre sont réinitialisés.
Classeur Excel à télécharger
Pour apprendre à générer et gérer ces
événements de temps, nous suggérons d'appuyer l'étude sur un
classeur offrant déjà ce
chronomètre et ces
boutons.
Nous retrouvons bien le
chronomètre et ses trois boutons. Mais ils ne sont bien entendu pas encore opérationnels à ce stade. Nous devons développer les
codes VBA associés.
- Réaliser le raccourci clavier ALT + F11 pour basculer dans l'éditeur VBA Excel,
- Dans l'explorateur de projet sur la gauche, double cliquer sur l'élément Module1,
Nous affichons ainsi sa
feuille de code au centre de l'écran. Hormis la présence de l'
instruction Option Explicit, elle est vierge de code. Comme vous le savez, cette instruction impose de
déclarer les variables qui sont utilisées.
Les variables publiques
Pour générer cette
horloge digitale, nous allons avoir besoin de créer une
boucle de temps. Et pour que les
variables soient mémorisées d'une procédure à une autre, notamment après le clic sur le bouton de Pause, nous devons les déclarer dans la
partie publique, soit en dehors de toute procédure. Ainsi, elles ne seront pas détruites à chaque fin de procédure.
- Après l'instruction Option Explicit, ajouter les déclarations de variables suivantes :
Dim tempsPlus As Date, temps As Date, laPause As Date, tempo As Boolean
Nous déclarons les trois premières variables comme des
variables de type Date. La première (tempsPlus) doit servir à faire progresser le
compteur de temps d'une seconde et de façon régulière. La deuxième (temps) doit prélever le
temps qu'il est à la seconde près lorsque l'utilisateur lance le
chronomètre. La troisième ensuite doit mémoriser le
temps de Pause, si l'utilisateur clique sur le bouton dédié. C'est ainsi que l'
écart avec le temps progressant, pourra être réajusté de manière à reprendre l'
évolution du chronomètre à la suite. Enfin, la
variable booléenne tempo doit servir de test pour savoir si l'utilisateur a effectivement cliqué sur le
bouton de Pause.
Les procédures de code
Maintenant, nous proposons de construire le squelette de la solution avec les
procédures de code. Trois doivent être déclenchées aux
clics sur les boutons respectifs de la
feuille Excel. Une procédure supplémentaire doit être créée pour générer ce
traitement récursif au fil des secondes qui passent.
- Après les variables publiques, créer les quatre procédures VBA suivantes :
Sub depart()
End Sub
Sub debuter()
End Sub
Sub pause()
End Sub
Sub fin()
End Sub
Bien que ces procédures n'existaient pas encore, les associations étaient déjà réalisées par anticipation sur ces noms précis. C'est ainsi que le premier bouton déclenche la
procédure depart. Les deux autres boutons exécutent respectivement les procédures nommées
pause et
fin. A toutes fins utiles, sachez que ces associations se font par clic droit sur le bouton de feuille puis en choisissant la commande
Affecter une macro, dans le menu contextuel qui se déclenche.
Démarrer l'horloge
Maintenant, au clic sur le premier bouton, nous devons initialiser certaines variables. Nous devons notamment commencer par
prélever le temps qu'il est précisément, au moment de la demande. Puis, nous devons appeler la
procédure du traitement récursif, qui restera encore à concevoir.
- Dans les bornes de la procédure depart, ajouter les instructions VBA suivantes :
...
temps = Time
tempo = False
laPause = 0
debuter
...
La
fonction VBA Time renvoie le temps qu'il est à la
seconde près. Nous stockons cette information dans la
variable temps. Nous calons ensuite le booléen sur la
valeur false. Cet indicateur précise pour l'instant que l'utilisateur n'a pas encore cliqué sur le
bouton de Pause. Donc, nous initialisons le
temps de pause à 0 et nous appelons la
procédure debuter.
Lancer le décompte des secondes
C'est précisément cette
procédure debuter qui doit s'appeler elle-même récursivement pour faire progresser les incréments de temps. Dès lors, la progression chiffrée devra être affichée dans la cellule située au centre du chronomètre.
- Dans les bornes de la procédure debuter, ajouter les instructions VBA suivantes :
...
If tempo = False Then
tempsPlus = Time - laPause + TimeValue("00:00:01")
Range("D8").Value = Format(tempsPlus - (temps + TimeValue("00:00:01")), "hh:mm:ss")
Application.OnTime Time + TimeValue("00:00:01"), "debuter"
End If
...
Bien entendu, ce traitement n'est entrepris que dans la mesure où l'utilisateur n'a pas cliqué sur le
bouton de Pause. C'est donc une
instruction conditionnelle qui se charge tout d'abord de vérifier l'état de la variable booléenne. Dès lors, nous prélevons de nouveau le temps qu'il est grâce à la
fonction Time. Mais nous lui ajoutons une seconde (TimeValue("00:00:01")) pour faire progresser le
chronomètre. La
fonction TimeValue permet de formater correctement une information de type heure. Nous prenons aussi soin de soustraire le décalage observé à l'occasion d'une précédente pause (- laPause). Au premier lancement, cette valeur est nulle forcément.
Ensuite, nous inscrivons la valeur du décompte dans la
cellule D8. C'est elle qui est placée au centre du chronomètre. Mais pour que ce décompte parte de zéro, et suive son incrémentation par paliers d'une seconde, nous soustrayons le temps qu'il était (temps) au temps qu'il est désormais. Cette information de temps, nous la formatons correctement grâce à la
fonction VBA Format.
Enfin et c'est là que réside l'astuce principale, nous exploitons un fabuleux
gestionnaire d'événements de l'
objet VBA Application. Il permet d'exécuter des actions précises à échéances précises. Ces actions ne sont autres que celles que nous venons d'écrire puisque c'est ainsi que la
fonction debuter est appelée en boucle. A chaque occasion, cette fonction est rappelée une seconde plus tard (Time + TimeValue("00:00:01")). C'est ainsi que nous donnons vie au défilement des secondes sur l'horloge digitale.
Stopper la boucle de temps
Avant de tester le code, nous proposons de
stopper la boucle de temps en neutralisant l'événement,
au clic sur le bouton de Stop. Pour cela, il suffit de renseigner un paramètre supplémentaire de ce
gestionnaire OnTime.
- Dans la procédure fin, ajouter les deux instructions VBA suivantes :
...
Application.OnTime Time + TimeValue("00:00:01"), "debuter", Schedule:=False
Range("D8").Value = Format(TimeValue("00:00:00"), "hh:mm:ss")
...
C'est en réalité le quatrième paramètre du gestionnaire que nous réglons à false et que nous atteignons directement sans renseigner le troisième, en le préfixant de son intitulé (Schedule:=). Dans le même temps, nous réinitialisons l'information de temps dans le chronomètre en cellule D8. La gestion d'anomalie On Error est exploitée dans le cas où l'heure fixée pour saborder le gestionnaire, est dépassée.
- Enregistrer les modifications (CTRL + S) et basculer sur la feuille Excel (ALT + Tab),
- Puis, cliquer sur le bouton de lecture,
Comme vous pouvez l'apprécier, les secondes défilent effectivement. Et si vous cliquez sur le
bouton Stop, le compteur est remis à zéro, comme nous l'avons programmé.
Le bouton Pause
Concernant le dernier bouton, sa vocation est simple. Il doit basculer l'état de la
variable booléenne tempo pour suspendre le chronomètre ou reprendre l'incrémentation des secondes. Mais si le défilement du chronomètre était suspendu jusqu'alors, avant de reprendre, son code doit estimer le
temps qui s'est écoulé depuis la mise en pause. C'est seulement sous cette condition que le
défilement du temps pourra reprendre là où il s'était arrêté (tempsPlus = Time - laPause + TimeValue("00:00:01")).
- Revenir dans l'éditeur VBA Excel,
- Dans les bornes de la procédure Pause, créer le code VBA suivant :
...
If tempo = False Then
tempo = True
Else
tempo = False
laPause = Time - tempsPlus
debuter
End If
...
Si le booléen vaut False, nous basculons son état à True. Comme un test est réalisé sur sa valeur dans la
procédure debuter, nous suspendons ainsi l'incrémentation des secondes du chronomètre. Dans le cas contraire, nous le réinitialisons à False pour reprendre l'incrémentation. Mais avant cela, nous calculons le
temps de pause qui s'est écoulé (laPause = Time - tempsPlus). Souvenez-vous, cette
variable publique est utilisée dans la
procédure debuter pour recalibrer le comptage. Et précisément, cette
procédure récursive est appelée à redémarrer dans l'enchaînement.
- Enregistrer les modifications (CTRL + S) et revenir sur la feuille Excel (Alt + Tab),
- Cliquer sur le bouton de lecture et patienter quelques secondes,
- Dès lors, cliquer sur le bouton Pause,
Comme vous pouvez le voir, la boucle est effectivement neutralisée puisque le temps se fige dans le chronomètre.
Et si vous cliquez de nouveau sur le bouton Pause, le chronomètre reprend sa course.