VBA – DoEvents
Ce tutoriel explique comment utiliser la commande DoEvents en VBA.
La fonction VBA DoEvents met temporairement en pause une macro en cours d’exécution, ce qui permet à Excel de traiter les pressions sur les touches, les clics de souris et d’autres messages du système d’exploitation.
Dans les macros qui s’exécutent depuis longtemps, Excel peut sembler se bloquer et ne plus répondre, et il peut être impossible d’interrompre la macro. Si DoEvents est inclus dans votre code, les utilisateurs peuvent être assurés que la macro est toujours en cours d’exécution, et qu’ils peuvent toujours en interrompre l’exécution si nécessaire.
Exemple de DoEvents en VBA
Considérons le code suivant :
Public Sub Test()
Dim i As Long
For i = 1 To 20000
Range("A1").Value = i
Next i
End Sub
Lorsque vous essayez ce code, vous remarquerez qu’il est impossible d’interagir avec la fenêtre Excel. Cependant, comme elle n’est pas très exigeante pour le processeur, la macro peut toujours être interrompue en appuyant sur ESC ou CTRL+BREAK.
Si de nombreuses fonctions complexes et exigeantes étaient exécutées dans cette boucle, Excel mettrait plus de temps à enregistrer un évènement de pression de touche – jusqu’à plusieurs minutes, voire pas du tout, surtout si l’ordinateur exécute d’autres programmes en même temps.
Ajoutez maintenant une seule ligne avec DoEvents sous l’affectation Range :
Range("A1").Value = i
DoEvents
Si vous exécutez à nouveau ce code, vous verrez qu’Excel est maintenant réactif – il peut être focalisé et mis au premier plan. DoEvents est appelé à chaque fois dans la boucle, ce qui garantit que la macro est toujours en cours d’exécution et qu’Excel peut traiter tous les messages qui lui sont envoyés. Comme cette macro s’exécute rapidement, on a presque l’impression qu’elle s’exécute en arrière-plan (alors que ce n’est pas le cas) – d’autres opérations à l’intérieur de la boucle révéleraient rapidement cette illusion.
Dangers de DoEvents
Mais regardez de plus près. En plus de permettre à Excel d’être mis au point, vous pouvez cliquer à l’intérieur des cellules et même changer d’onglet pendant que la macro est en cours d’exécution (essayez – vous verrez un drôle de comportement). Cela montre l’un des dangers des DoEvents – ils peuvent être à l’origine de conséquences inattendues si votre macro n’est pas codée avec soin.
Un autre danger est que les DoEvents peuvent servir de fenêtre à l’intérieur de laquelle d’autres macros peuvent s’exécuter. Essayez ceci : placez un bouton de commande ActiveX sur la feuille de calcul, double-cliquez dessus et ajoutez le code suivant dans l’événement CommandButton1_Click() :
Dim c As Range
For each c in Range("B3:E8")
c.Value = c.Value + 1
Next c
Désactivez le mode Conception dans Excel, puis exécutez la macro Test() que vous avez ajoutée précédemment. Pendant l’exécution de la macro Test, vous pouvez cliquer sur le bouton de commande de la feuille de calcul, et la macro qui lui est associée s’exécutera dès que DoEvents donnera une pause à la macro Test().
Le risque est que la macro CommandButton modifie les données sur lesquelles la macro Test() est en train de travailler, ou qu’elle déclenche à nouveau la macro Test(). Si vous ne faites pas attention, vous pouvez obtenir des résultats très désordonnés.
Enfin, vous devez savoir que les DoEvents ont un impact sur les performances de votre macro lorsqu’ils sont appelés. À l’intérieur d’une boucle, cet impact s’accumule rapidement, à moins que vous ne limitiez la fréquence d’appel de DoEvents. En vous référant à notre exemple Test(), essayez ceci :
If i Mod 1000 = 0 Then DoEvents
Cela réduit visiblement la réactivité d’Excel, mais l’impact sur les performances sera moindre.
Quand Utiliser DoEvents
Malgré ces dangers, DoEvents est une fonction pratique qui facilite les tests et le débogage. Pensez à ajouter la fonction DoEvents aux boucles de longue durée.
Une autre raison d’inclure DoEvents est de permettre le retour d’information de l’utilisateur. Par exemple, une macro peut mettre à jour les étiquettes d’un UserForm avec des indicateurs de progression. Sans DoEvents, Excel peut ne pas recevoir les messages pour repeindre le UserForm, ce qui donne à l’utilisateur l’impression que la macro a cessé de fonctionner – surtout si vous passez à un autre programme et essayez ensuite de revenir à Excel. En revanche, avec DoEvents, le UserForm continuera à être repeint et des mises à jour de la progression de la macro continueront à apparaître.
Dans la plupart des cas, DoEvents n’est pas quelque chose que vous voudrez inclure souvent dans votre code, et peut souvent être omis. Cependant, si votre macro a besoin de réactivité, ne l’excluez pas!
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro - A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!Learn More!