En tant que développeur VBA, vous avez sans doute déjà rencontré des situations où une macro semble figée ou "ne répond plus" pendant un traitement. La parade? La fonction DoEvents. Elle permet à Excel de rester réactif en traitant les événements en attente au cœur d’une boucle ou d’une tâche lourde.
Dans les lignes qui suivent, je vous montre quand l"utiliser, quand l"éviter, et surtout comment l"utiliser proprement (sans transformer votre code en usine à gaz).
Sommaire
- Syntaxe de la fonction VBA DoEvents
- Fonction DoEvents : comment ça marche (et à quoi ça sert)
- Exemples pratiques d'utilisation de DoEvents
- Problèmes courants et erreurs VBA avec DoEvents
- Conseils pratiques pour une utilisation optimale de DoEvents
- Vous avez encore des questions sur DoEvents?
- Conclusion : gardez la main sur vos macros VBA
- Pour aller plus loin en VBA
Syntaxe de la fonction VBA DoEvents
La fonction DoEvents est on ne peut plus simple : aucun argument.
DoEvents()
- Aucun argument : pas de paramètres à fournir.
Fonction DoEvents : comment ça marche (et à quoi ça sert)
DoEvents indique à Excel : "prends une micro-pause et traite ce qui traîne dans la file d'attente" (rafraîchissement d'écran, clic utilisateur, clavier, etc.).
Sans elle, une boucle longue peut donner l'impression qu'Excel a planté. Avec DoEvents, l'interface continue de répondre.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
'par Excel-Malin.com ( https://excel-malin.com/ ) Sub ExempleDoEvents() ' Initialisation des variables Dim i As Long Dim maxIterations As Long maxIterations = 10000 ' Nombre d'itérations pour la boucle ' Boucle pour simuler un processus long For i = 1 To maxIterations ' ... (Insérer le code de traitement ici) ' Laisse Excel respirer pour rester réactif DoEvents Next i ' Indication de fin MsgBox "Processus terminé !" End Sub |
Exemples pratiques d'utilisation de DoEvents
Passons au concret : quelques cas réalistes où DoEvents rend service.
N°1) Mettre à jour une barre de progression
Dans une macro longue, appelez DoEvents après la mise à jour visuelle pour éviter l’effet "Excel gelé".
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub MiseAJourBarreProgression() 'par Excel-Malin.com ( https://excel-malin.com/ ) Dim i As Long Dim maxIterations As Long maxIterations = 100 ' Tâche simulée For i = 1 To maxIterations ' Mise à jour de la barre de progression ' ... (Code pour mettre à jour la barre) ' Laisse l'UI réagir (curseur, clics, repaint) DoEvents Next i End Sub |
N°2) Permettre l'interruption par l'utilisateur
DoEvents autorise Excel à capter le clic sur un bouton "Stop" par exemple, puis à sortir proprement de la boucle.
Dans l'exemple, l'arrêt est géré par une condition (If ConditionArret Then
) que vous mettez à True
via votre UI (bouton, case, etc.).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub InterruptionUtilisateur() 'par Excel-Malin.com ( https://excel-malin.com/ ) Dim i As Long Dim continuer As Boolean continuer = True i = 0 While continuer i = i + 1 ' ... (Traitement) ' Surveille un signal d'arrêt (défini ailleurs) If ConditionArret Then continuer = False End If ' Donne la main à Excel pour traiter l'événement d'arrêt DoEvents Wend End Sub |
N°3) Traitement "quasi temps réel"
Pour des flux entrants (capteurs, fichiers déposés, socket, etc.), on peut garder une boucle ouverte tout en restant maître de l'UI.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub TraitementTempsReel() 'par Excel-Malin.com ( https://excel-malin.com/ ) Dim donnee As String ' Boucle volontairement longue (prévoir un moyen de sortie) Do While True ' Récupération et traitement des données ' ... (Code pour traiter les données) ' UI toujours réactive DoEvents ' Optionnel : petite pause si nécessaire pour ne pas sursolliciter CPU ' Application.Wait Now + TimeValue("0:00:01") Loop End Sub |
Problèmes courants et erreurs VBA avec DoEvents
Utilisée sans excès, la fonction DoEvents est pratique. Mal employée, elle peut agacer :
- Surcharge d’événements : l'invoquer à chaque tour d'une boucle ultra-rapide peut engorger la file d’attente et ralentir l'ensemble.
- Perfs en berne : trop d'appels dans une boucle critique = macro plus lente (paradoxal, mais classique).
- Synchronisation : si vous modifiez l'UI ou des structures partagées, attention aux états incohérents quand des événements se déclenchent entre deux lignes de code.
- Erreur VBA 13 – Type mismatch : pas causée par DoEvents directement, mais elle peut surgir si un événement intermédiaire change les types/états auxquels votre code s'attend.
Conseils pratiques pour une utilisation optimale de DoEvents
Quelques repères qui m'évitent des cheveux blancs :
- À bon escient : placez DoEvents aux points clés (tours de boucle "lourds", mises à jour d’UI), pas partout.
- Éviter les boucles ultra-rapides : dans les boucles très rapides, espacez les appels (ex. tous les 100 tours). Un simple compteur fait l’affaire.
- Gestion d’erreurs : gardez une gestion propre (journalisation,
On Error
adapté) pour comprendre ce qui se passe si un événement s'invite au mauvais moment. - Équilibre réactivité / vitesse : testez avec et sans DoEvents. Sur des gros classeurs, la différence peut être nette.
- Surveiller l’impact : si le CPU grimpe, réduisez la fréquence d'appel ou insérez une micro-pause contrôlée.
Quelques conseils d'expert
Du haut de mes années de développement en VBA, voici ce que j'applique en pratique :
- Utilisation sélective : DoEvents n'est pas un pansement universel. Évitez-la au milieu de calculs critiques ou de mises à jour sensibles (risque d’état intermédiaire bancal).
- Alternatives : pour les tâches longues, pensez au découpage (petits blocs) ou à un ordonnancement via
Application.OnTime
. On garde la main sans ouvrir grand la porte aux événements. - Sorties garanties : dans toute boucle potentiellement "sans fin", prévoyez un vrai garde-fou (flag, délai max, bouton Stop) pour ne pas dépendre d'une action qui n'arrivera peut-être jamais.
- Mesurer plutôt que supposer : un avant/après avec chronométrage parle mieux que des impressions. Ajustez la fréquence d'appel en fonction des chiffres.
- Erreurs visibles : l'association avec
On Error Resume Next
doit rester exceptionnelle. Privilégiez une gestion d'erreurs explicite pour ne pas masquer un vrai problème déclenché entre deux tours.
Vous avez encore des questions sur DoEvents?
Conclusion : gardez la main sur vos macros VBA
Bien placée, cette fonction améliore la sensation "pro" : Excel reste vivant pendant le traitement, l'utilisateur ne se demande plus si tout a planté. Le tout est de doser. Un appel ici ou là vaut mieux qu’un saupoudrage systématique.
Pour aller plus loin en VBA
Avant de vous éclipser, quelques lectures utiles :
- Fonction DoEvents sur le site de Microsoft
- Liste de toutes les fonctions disponibles en VBA
- … et la liste de tous les Événements (
Events
) que vous pouvez utiliser - Utiliser RECHERCHEV en VBA — oui, c’est possible ! [tutoriel]
- VBA : Gestion des fichiers (copie, suppression,…)
- Convertir le nom et le numéro de colonne Excel en VBA
Commentaire sur “Excel VBA DoEvents: rendre vos macros réactives”
Bonjour,
Tout à fait d'accord avec ce qui est écrit plus haut.
Je cherche à comprendre le comportement de doevents lorsque qu'une procédure (longue) est appelée alors qu'une précédente procédure (la même) n'est pas terminé.
D'après mes essais, dans ce cas, excel ne termine jamais la première procédure.
C'est contraire à ce que je lis partout.
Quelle est votre expérience sur ce sujet?
Cordialement