VBA DoEvents

Table des matières

Le VBA FaireEvénements La fonction interrompt temporairement une macro en cours d'exécution, donnant à Excel la possibilité de traiter les pressions de touche, les clics de souris et d'autres messages du système d'exploitation.

Dans les macros de longue durée, Excel peut sembler se bloquer et ne plus répondre, et la macro peut être impossible à interrompre. Si DoEvents est inclus dans votre code, les utilisateurs peuvent être assurés que la macro est toujours en cours d'exécution et peuvent toujours interrompre l'exécution si nécessaire.

Exemple VBA DoEvents

Considérez le code suivant :

1234567891011 Sous-test public()Dim j'aussi longtempsPour i = 1 à 20000Plage ("A1").Valeur = iEnsuite jeFin du sous-marin

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 gourmande en processeur, la macro peut toujours être interrompue en appuyant sur ÉCHAP ou CTRL+PAUSE.

Si de nombreuses fonctions complexes et exigeantes étaient exécutées dans cette boucle, Excel prendrait plus de temps pour enregistrer un événement d'appui sur une touche - jusqu'à plusieurs minutes ou peut-être 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 :

123 Plage("A1").Valeur = iFaireEvénements

Si vous exécutez à nouveau ce code, vous verrez qu'Excel est désormais réactif - il peut être concentré et mis au premier plan. DoEvents est appelé à chaque fois dans la boucle, ce qui garantit que la macro est toujours exécutée afin qu'Excel puisse traiter tous les messages qui lui sont envoyés. Parce que cette macro s'exécute rapidement, il semble presque qu'elle s'exécute en arrière-plan (bien que ce ne soit pas le cas) - plus d'opérations à l'intérieur de la boucle exposeraient rapidement cette illusion.

DoEvents Dangers

Jetez un deuxième coup d'œil, cependant. Plus que de simplement permettre à Excel de se concentrer, vous pouvez réellement cliquer à l'intérieur des cellules et même changer d'onglet pendant l'exécution de la macro (essayez - vous verrez un comportement amusant). Cela montre l'un des dangers de DoEvents - cela peut être la cause de conséquences inattendues si votre macro n'est pas codée avec soin.

Un autre danger est que DoEvents peut servir de fenêtre pour que d'autres macros s'exécutent à l'intérieur. Essayez ceci : placez un bouton de commande ActiveX sur la feuille de calcul, double-cliquez dessus et ajoutez le code suivant à l'intérieur de l'événement CommandButton1_Click() :

1234567 Dim c As RangePour chaque c dans la plage ("B3:E8")c.Valeur = c.Valeur + 1c suivant

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 dans la feuille de calcul et sa macro associée s'exécutera dès que DoEvents donnera une pause à la macro Test().

Le danger ici est que la macro CommandButton modifie les données sur lesquelles la macro Test() travaille ou déclenche à nouveau la macro Test(). Vous pouvez vous retrouver avec des résultats extrêmement désordonnés si vous ne faites pas attention.

Enfin, vous devez savoir que DoEvents entraînera un impact sur les performances de votre macro lors de son appel. À l'intérieur d'une boucle, cet impact s'additionnera rapidement à moins que vous ne limitiez la fréquence d'appel de DoEvents. En vous référant à notre exemple Test(), essayez ceci :

1 Si je Mod 1000 = 0 alors 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. Envisagez d'ajouter DoEvents aux boucles de longue durée.

Une autre raison d'inclure DoEvents est de permettre les commentaires des utilisateurs. Par exemple, une macro peut mettre à jour les étiquettes d'un formulaire utilisateur avec des indicateurs de progression. Sans DoEvents, Excel peut ne pas recevoir les messages pour repeindre le formulaire utilisateur, donnant à l'utilisateur l'impression que la macro a cessé de fonctionner, en particulier si vous basculez vers un autre programme, puis essayez de revenir à Excel. Cependant, avec DoEvents, le formulaire utilisateur continuera à être repeint et les mises à jour de la progression de la macro continueront d'apparaître.

Pour la plupart, DoEvents n'est pas quelque chose que vous voudrez inclure beaucoup dans votre code, et peut souvent être omis. Si la réactivité est quelque chose dont votre macro a besoin, ne la comptez pas !

Vous contribuerez au développement du site, partager la page avec vos amis

wave wave wave wave wave