Comment faire une pause en VBA sur Excel ?
Pour ce nouveau chapitre de la formation dédiée à la découverte de VBA sur Excel nous allons découvrir comment interrompre le déroulement d’une macro VBA afin d’effectuer une pause.
Téléchargement
Vous pouvez télécharger le fichier d'exemple de cet article en cliquant sur le lien suivant :
Tutoriel Vidéo
1. Présentation
Comme nous venons de le voir dans l’introduction, je vais vous montrer dans ce tutoriel comment réaliser une pause en VBA.
Au premier abord, il peut sembler curieux de vouloir insérer une pause dans une macro-commande, et donc vouloir augmenter le temps d’exécution de celle-ci.
Mais les raisons peuvent être assez variées :
- Attendre qu’une autre tâche ait le temps de s’exécuter,
- Laisser à l’utilisateur le temps de la réflexion,
- Rendre visible l’exécution d’une tâche qui serait bien trop rapidement exécutée pour qu’elle soit visible, …
2. Compter dix secondes
Pour illustrer ce tutoriel, nous allons partir d’une toute petite macro-commande qui se contente d’énumérer les nombres de 1 à dix dans une cellule lorsque nous cliquons sur un bouton :
Cette macro est volontairement très simple, et consiste tout simplement à lancer une boucle For… Next dix fois de suite pour y afficher la valeur de i :
Sub compter()
Dim i As Integer
For i = 1 To 10
[_cellule] = i
Next
End Sub
Pour simplifier la rédaction de la procédure, la cellule de destination est identifiée avec un nom (« _celllule ») :
Lorsque nous lançons la macro en cliquant sur le bouton, nous pouvons nous rendre compte que celle-ci s’exécute extrêmement rapidement.
Bien entendu, cette vitesse pourra fortement variée en fonction de la puissance du poste sur laquelle celle-ci est exécutée.
Maintenant, imaginons que nous voulions que le décompte corresponde à l’écoulement de dix secondes.
Nous devrons alors attendre une seconde entre chaque itération de la boucle.
Pour cela nous allons créer une macro dédiée, que nous allons appeler pause :
La méthode la plus simple pour effectuer une pause avec VBA consiste à utiliser la méthode Application.Wait() qui permet d’interrompre le déroulement de la macro jusqu’à ce qu’une certaine heure soit atteinte.
Par exemple pour arrêter le programme jusqu’à 18 heures, nous utiliserons :
Sub pause()
Application.Wait "18:00:00"
End Sub
Bien entendu, ce qui nous intéressera ici ne sera pas d’attendre une heure donnée, mais qu’un intervalle de temps soit écoulé.
Pour cela, nous partirons simplement de l’heure actuelle (à laquelle la macro a été lancée, que nous récupérons avec la fonction Now()) à laquelle nous ajouterons la durée souhaitée de la pause :
Sub pause()
Application.Wait Now() + TimeValue("00:00:01")
End Sub
Notre macro étant maintenant terminé, nous pouvons l’appeler depuis la macro principale :
Sub compter()
Dim i As Integer
For i = 1 To 10
[_cellule] = i
pause
Next
End Sub
Puis l’exécuter à nouveau pour constater que chaque nouveau nombre correspond effectivement à une seconde.
En revanche, l’inconvénient de cette méthode, c’est qu’il n’est pas possible d’effectuer de pause inférieure à une seconde.
3. Effectuer une pause de moins d’une seconde
Maintenant, plutôt que d’attendre une seconde entre chaque dénombrement, nous allons souhaiter réduire ce délai par deux, soit ½ seconde.
Pour cela, nous allons devoir utiliser une autre méthode : nous allons utiliser une boucle Do While… Loop, qui se répètera tant que le délai souhaité ne sera pas atteint.
Pour cela, nous allons commencer par créer une nouvelle variable, que nous allons typer en tant que Single, c’est-à-dire un nombre à virgule et qui va permettre d’enregistrer l’heure de fin de la pause.
Pour définir la valeur de cette variable, nous allons utiliser la fonction Timer() qui permet d’obtenir le nombre de secondes écoulées au cours de la journée (depuis minuit).
Il suffit ensuite d’ajouter la durée souhaitée :
Dim finPause As Single
finPause = Timer() + 0.5
Ensuite, nous pouvons lancer une boucle pour attendre que la fonction Timer() renvoie une valeur au moins égale à la valeur de cette fonction finPause :
Do While Timer < finPause
Loop
Nous pouvons tester le programme et constater que maintenant celui-ci s’exécute deux fois plus vite.
4. Continuer de travailler pendant la pause
L’inconvénient des méthodes que nous venons de découvrir juste avant, et qui est d’ailleurs commun à la plupart des macro-commandes, c’est que dès lors que la macro est démarrée, la main est transférée à Excel et qu’il n’est plus possible d’utiliser Excel.
La solution pour résoudre ce problème consiste simplement à ajouter l’instruction DoEvents dans la boucle Do While :
For i = 1 To 10
[_cellule] = i
pause
DoEvents
Next
La commande DoEvents permet de céder le contrôle au système d’exploitation le temps que VBA puisse exécuter une commande donnée.
Celui-ci reprend automatiquement le contrôle lorsque la tâche est terminée.
Attention toutefois, certaines actions auront pour effet d’interrompre le déroulement de la macro, comme le fait de se saisir du contenu dans une cellule !