formateur informatique

Compteur de temps en VBA Excel, chronomètre

Accueil  >  Bureautique  >  Excel  >  Excel VBA  >  Compteur de temps en VBA Excel, chronomètre
Livres à télécharger


Pour partager cette vidéo sur les réseaux sociaux ou sur un site, voici son url :


Inscription Newsletter    Abonner à Youtube    Vidéos astuces Instagram
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.

Chronomètre en VBA Excel

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,
Faire défiler les secondes et minutes sur un chronomètre Excel

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.

Chronomètre en pause en VBA Excel

Et si vous cliquez de nouveau sur le bouton Pause, le chronomètre reprend sa course.

 
Sur Facebook
Sur Youtube
Les livres
Contact
Mentions légales



Abonnement à la chaîne Youtube
Partager la formation
Partager sur Facebook
Partager sur Twitter
Partager sur LinkedIn