TL;DR —
Application.EnableEvents = Falseempêche les écritures de votre macro de déclencher les gestionnaires d'événements —Worksheet_Change,Workbook_Openet les autres. Son rôle principal est de briser la boucle où un gestionnaireWorksheet_Changeécrit dans une cellule, ce qui déclencheWorksheet_Changede nouveau, sans fin. C'est un interrupteur de justesse, pas de vitesse. Et c'est celui pour lequel vous avez le plus besoin d'un gestionnaire d'erreurs, carEnableEventsest au niveau de l'application et ne se réinitialise pas tout seul — plantez en le laissant désactivé et tout événement dans Excel reste mort jusqu'au redémarrage :
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Me.Range("B:B")) Is Nothing Then Exit Sub
Application.EnableEvents = False ' notre ecriture ci-dessous ne doit PAS redeclencher ce gestionnaire
On Error GoTo CleanExit
Target.Offset(0, 1).Value = Now ' ecriture - declencherait sinon Worksheet_Change de nouveau
CleanExit:
Application.EnableEvents = True ' retablir, meme apres une erreur, sinon les evenements restent morts dans toute l'appli
End Sub
Les deux autres interrupteurs de ce cluster concernent la vitesse —
ScreenUpdating arrête les redessins,
Calculation arrête les recalculs. EnableEvents est différent. Il concerne
la justesse : empêcher vos propres écritures de ricocher à travers les gestionnaires d'événements
qui surveillent le classeur. Ce guide repose sur une seule idée — EnableEvents est l'interrupteur que
vous actionnez pour que vos modifications ne déclenchent pas le code qui réagit aux modifications. Vous
l'actionnez pour le contrôle, pas pour la vitesse — et parce qu'un plantage le laisse désactivé pour
toute l'application, le rétablir n'est pas facultatif.
Ce que vous allez apprendre
- Le modèle mental — écrire dans une cellule peut déclencher des gestionnaires d'événements, qui peuvent écrire d'autres cellules
- Le bug classique — un gestionnaire
Worksheet_Changequi se déclenche lui-même en boucle infinie - La règle qui compte le plus —
EnableEventsest au niveau de l'application et ne se réinitialise pas tout seul - Pourquoi « mes boutons ont cessé de fonctionner » est presque toujours un
EnableEvents = Falseresté bloqué - Le rétablissement
CleanExit, et pourquoi il compte davantage ici que pour les interrupteurs de vitesse - Comment cela s'associe à Worksheet_Change et Intersect
Le modèle mental : les écritures peuvent déclencher des événements
Les classeurs Excel peuvent porter des gestionnaires d'événements — des procédures qui s'exécutent
automatiquement quand quelque chose se produit. Worksheet_Change s'exécute quand une cellule change ;
Workbook_Open s'exécute quand le fichier s'ouvre ; Worksheet_SelectionChange s'exécute quand la
sélection se déplace. C'est ainsi qu'un classeur réagit à l'utilisateur.
Le hic : les actions de votre macro comptent, elles aussi, comme « quelque chose qui se produit ».
Quand votre code écrit dans une cellule, c'est une modification, donc Excel déclenche Worksheet_Change
— même si c'est votre macro, et non l'utilisateur, qui a fait la saisie. En général, vous ne voulez pas
que vos propres écritures automatisées réveillent les gestionnaires écrits pour répondre à un humain.
Application.EnableEvents = False désactive ce déclenchement. Tant qu'il est à False, les
modifications se produisent toujours, mais Excel n'exécute aucun gestionnaire d'événements en réponse.
Remettez-le à True et les événements reprennent.
Le bug classique : un gestionnaire qui se déclenche lui-même
La défaillance que cet interrupteur existe pour prévenir est le Worksheet_Change qui se déclenche
lui-même. Prenez un gestionnaire qui horodate chaque fois que la colonne B est modifiée — en écrivant
dans la colonne C :
' CASSE - recursion infinie :
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Me.Range("B:B")) Is Nothing Then Exit Sub
Target.Offset(0, 1).Value = Now ' ecrire dans C est lui-meme une modification...
End Sub ' ...qui declenche Worksheet_Change encore -> encore -> plantage
Écrire dans C est une modification, qui déclenche Worksheet_Change, qui écrit de nouveau dans C,
qui le redéclenche. En pratique, vous obtenez un dépassement de pile (error 28) ou Excel coincé dans
une boucle. Le correctif consiste à envelopper l'écriture pour qu'elle ne rentre pas de nouveau dans le
gestionnaire :
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Me.Range("B:B")) Is Nothing Then Exit Sub
Application.EnableEvents = False ' l'ecriture ci-dessous ne le redeclenchera pas
On Error GoTo CleanExit
Target.Offset(0, 1).Value = Now
CleanExit:
Application.EnableEvents = True
End Sub
La protection Intersect et la protection EnableEvents sont sœurs — un
gestionnaire Worksheet_Change qui réécrit quoi que ce soit dans la
feuille a besoin des deux, l'une pour cadrer le déclencheur, l'autre pour arrêter la récursion.
La règle qui compte le plus : il ne se réinitialise pas tout seul
C'est ici qu'EnableEvents gagne sa réputation d'interrupteur à manier avec soin. À la différence de
ScreenUpdating, qu'Excel rétablit parfois à la fin d'une macro,
EnableEvents ne se réinitialise jamais de lui-même. Et c'est une propriété d'Application,
pas propre à un classeur — elle s'applique donc à tous les classeurs ouverts à la fois.
Réunissez ces deux faits et vous obtenez l'état résiduel le plus pernicieux de VBA. Si une macro met
EnableEvents = False puis plante avant de le rétablir, les événements sont désormais désactivés
partout — dans ce classeur et dans tous les autres ouverts — et ils le restent jusqu'à ce que
l'utilisateur ferme et rouvre Excel. Aucun message d'erreur, aucun indice visuel. Le classeur cesse
simplement de réagir, en silence.
« Mes boutons ont cessé de fonctionner »
Cet état résiduel a une plainte caractéristique : « mes boutons de macro / mes listes déroulantes / ma
mise en forme automatique ont cessé de fonctionner, et je n'ai rien changé. » Neuf fois sur dix, une
macro antérieure a planté alors qu'EnableEvents = False était encore en vigueur, et voilà
Worksheet_Change, Workbook_Open et tous les autres gestionnaires désactivés en silence.
Le sauvetage en une ligne consiste à exécuter ceci depuis la fenêtre Exécution (ou n'importe quelle macro) :
Application.EnableEvents = True
Mais le vrai correctif est en amont : ne mettez jamais EnableEvents = False sans un gestionnaire
d'erreurs qui le rétablit. Parce que le dégât est à l'échelle de l'application et invisible, la
discipline CleanExit qui n'est qu'une bonne pratique pour les interrupteurs de vitesse est ici
véritablement obligatoire.
Sub BulkImport()
Application.EnableEvents = False
On Error GoTo CleanExit
' ... des ecritures qui declencheraient sinon Worksheet_Change a chaque ligne ...
CleanExit:
Application.EnableEvents = True ' non negociable
End Sub
Quand l'utiliser — et quand s'en abstenir
Saisissez EnableEvents = False quand votre code écrit dans des cellules surveillées par des
gestionnaires d'événements, ou pendant une opération de masse où vous ne voulez pas que des événements
se déclenchent des centaines de fois, ligne après ligne. Ne le saisissez pas comme astuce de
vitesse générale — si la feuille n'a aucun gestionnaire d'événements pertinent, désactiver les
événements ne change rien, et vous avez pris le risque du rétablissement sans aucun bénéfice. C'est un
outil de justesse ciblé : utilisez-le exactement là où vos écritures ricocheraient, et laissez-le
tranquille ailleurs.
Comment ExcelMaster aide
EnableEvents est d'un danger trompeur : il est à l'échelle de l'application, il ne se réinitialise
jamais, et un plantage en le laissant désactivé tue en silence tout événement dans Excel jusqu'à un
redémarrage. L'utiliser sans risque suppose de l'associer à une protection Intersect à l'intérieur
des gestionnaires d'événements, d'envelopper les écritures de masse pour qu'elles ne déclenchent pas
d'événements ligne par ligne, et de le rétablir dans un gestionnaire CleanExit à chaque fois, sans
exception.
ExcelMaster construit tout le
motif sûr à votre place. Demandez « inscris l'heure dans la colonne C quand la colonne B change », et il
écrit le gestionnaire Worksheet_Change avec la protection Intersect, la bascule
EnableEvents = False autour de l'écriture, et le rétablissement CleanExit — de sorte que le
gestionnaire ne boucle jamais sur lui-même et ne bloque jamais les événements pour le reste de la
session. Vous obtenez une automatisation de classeur qui réagit correctement, pas une qui casse en
silence après la première erreur.
Questions fréquentes
Que fait Application.EnableEvents = False en VBA ?
Cela empêche Excel d'exécuter les gestionnaires d'événements en réponse aux modifications que fait votre
code. Tant qu'il est à False, des actions comme l'écriture dans une cellule se produisent toujours,
mais elles ne déclenchent pas Worksheet_Change, Workbook_SheetChange ni d'autres procédures
d'événement. Remettez-le à True pour laisser de nouveau les événements se déclencher.
Comment empêcher un événement Worksheet_Change de se déclencher lui-même ?
Mettez Application.EnableEvents = False avant que votre gestionnaire n'écrive dans une cellule, puis
rétablissez-le à True ensuite. Sans cela, l'écriture du gestionnaire est elle-même une modification
qui déclenche Worksheet_Change de nouveau, en bouclant jusqu'à ce qu'Excel lève une erreur de
dépassement de pile. Associez-le à une protection Intersect pour que le gestionnaire ne s'exécute que
pour les cellules qui vous intéressent.
Pourquoi tous mes événements Excel ont-ils cessé de fonctionner ?
Parce qu'une macro a mis Application.EnableEvents = False sans jamais le rétablir — le plus souvent,
elle a planté avant la ligne de rétablissement. EnableEvents est au niveau de l'application et ne se
réinitialise pas de lui-même, si bien que les événements restent désactivés pour tous les classeurs
ouverts jusqu'à ce que vous mettiez Application.EnableEvents = True ou que vous redémarriez Excel.
EnableEvents se réinitialise-t-il automatiquement à la fin de la macro ?
Non. À la différence de ScreenUpdating, qu'Excel peut rétablir de lui-même, EnableEvents reste
exactement là où vous l'avez laissé — d'une macro à l'autre et même après la fin de la macro — jusqu'à
ce que vous le remettiez en place ou fermiez Excel. C'est pourquoi vous devez le rétablir dans un
gestionnaire d'erreurs plutôt que de compter sur une quelconque réinitialisation automatique.
EnableEvents est-il une optimisation de vitesse comme ScreenUpdating ?
Pas vraiment. ScreenUpdating et Calculation concernent la vitesse ; EnableEvents concerne la
justesse — empêcher vos écritures de déclencher les gestionnaires qui surveillent le classeur. Il peut
éviter d'exécuter le code d'événement des centaines de fois pendant une écriture de masse, mais son but
premier est de prévenir les boucles et les réactions indésirables, pas la vitesse brute.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 17/08/2026.
Guides associés : VBA ScreenUpdating · VBA Calculation · VBA Worksheet_Change · VBA Intersect · VBA On Error
