TL;DR —
Worksheet_BeforeDoubleClickest un événement qu'Excel déclenche à l'instant où vous double-cliquez une cellule — avant que la cellule ne bascule en mode édition. Il vous remet deux choses :Target(la cellule cliquée) etCancel. MettezCancel = Trueet la réaction par défaut d'Excel — l'entrée en mode édition — est supprimée, si bien que votre action est la seule chose qui se produit. Cela transforme un double-clic en bouton d'un seul geste : cocher une case, marquer une ligne comme faite, sauter au détail. Le code réside dans le module propre à la feuille, et vous voudrez presque toujours le cibler sur une seule colonne avecIntersect.
' Réside dans le module de la feuille (double-cliquez « Sheet1 » sous Microsoft Excel Objets).
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
' N'agir qu'à l'intérieur de la colonne B ; laisser toutes les autres cellules éditables normalement.
If Intersect(Target, Me.Columns("B")) Is Nothing Then Exit Sub
Cancel = True ' <-- supprimer le mode édition
Target.Value = IIf(Target.Value = "x", "", "x") ' le double-clic fait basculer une marque
End Sub
La plupart des macros attendent un bouton. Worksheet_BeforeDoubleClick attend un geste —
un double-clic sur une cellule — et, surtout, il s'exécute avant qu'Excel ne fasse ce
qu'un double-clic fait normalement (mettre la cellule en mode édition). Ce « avant » est tout
l'enjeu : vous pouvez intercepter le geste, décider de ce qu'il doit signifier sur votre
feuille, et annuler le comportement par défaut. C'est l'événement derrière les listes de
tâches à cocher d'un clic, les descentes d'une synthèse vers ses lignes sources, et les
bascules déplier/replier — et c'est l'événement que l'on câble sans la seule ligne qui le
rend agréable.
Ce que vous allez apprendre
- Le modèle mental — un double-clic est un geste que vous pouvez détourner,
Cancelen supprime le comportement par défaut - La règle qui compte le plus — oubliez
Cancel = Trueet la cellule passe quand même en mode édition - Comment cibler l'événement sur une seule colonne avec
Intersectpour que le reste de la feuille reste éditable - Le piège de la réécriture — faire basculer une cellule déclenche
Worksheet_Change, alors protégez-le - Niveau feuille vs niveau classeur, et où le code doit résider
Le modèle mental : un geste que vous pouvez détourner, pas un clic que vous observez
Un double-clic signifie déjà quelque chose pour Excel : « mettre cette cellule en mode
édition ». Quand vous écrivez Worksheet_BeforeDoubleClick, Excel appelle d'abord votre code
et attend — il n'est pas encore entré en mode édition. Vous recevez Target, la cellule
exacte qui a été double-cliquée, et Cancel, un Boolean passé par référence. Laissez
Cancel tel quel et, une fois votre code exécuté, Excel poursuit et entre en mode édition.
Mettez Cancel = True et il ne le fait pas — la signification par défaut du double-clic
est jetée et remplacée par ce que votre gestionnaire a fait.
Le gestionnaire n'est donc pas « préviens-moi quand une cellule est double-cliquée ». C'est
« laisse-moi redéfinir ce que fait un double-clic ici ». Ce recadrage est ce qui rend
l'événement puissant : un double-clic devient une petite commande native à la souris — pas de
bouton, pas de ruban, juste pointer et double-cliquer. Et comme tout événement de cette
famille, il réside à un endroit précis. Celui-ci va dans le module de code propre à la
feuille (double-cliquez sur la feuille sous « Microsoft Excel Objets » dans l'Explorateur de
projets) — pas un Module standard, ni ThisWorkbook.
La règle qui compte le plus : sans Cancel = True, la cellule passe quand même en édition
Voici le bug qui donne l'impression qu'une feuille à bascule d'un clic est cassée. Vous écrivez la bascule mais oubliez la seule ligne qui compte :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Target.Value = IIf(Target.Value = "x", "", "x") ' bascule... puis Excel passe la cellule en édition
End Sub
La marque bascule — puis la cellule passe en mode édition, curseur clignotant et tout le
reste, parce que rien n'a touché à Cancel. L'utilisateur a double-cliqué pour marquer une
tâche comme faite et s'est retrouvé avec une cellule en édition qu'il doit maintenant quitter
avec Échap. Votre action s'est exécutée, mais le comportement par défaut d'Excel aussi, juste
par-dessus. La règle : quand votre gestionnaire remplace la signification du double-clic,
mettez Cancel = True pour que le comportement par défaut ne se déclenche pas sous vos
pieds.
Cancel = True ' supprimer d'abord le mode édition
Target.Value = IIf(Target.Value = "x", "", "x")
Cet unique indicateur fait toute la différence entre « une bascule fluide d'un seul clic » et « une bascule qui, en prime, ouvre agaçamment la cellule en édition ». Mettez-le chaque fois que le double-clic est votre commande, et non une véritable modification.
La règle qui garde la feuille utilisable : cibler avec Intersect
Un gestionnaire non ciblé est pire que pas de gestionnaire du tout. Si votre code s'exécute à
chaque double-clic et met Cancel = True, vous venez de désactiver l'édition par
double-clic pour la feuille entière — l'utilisateur ne pourra plus jamais double-cliquer une
cellule pour la modifier. C'est un effet de bord hostile que personne n'a demandé.
Le correctif consiste à n'agir qu'à l'intérieur de la plage censée être cliquable, et à sortir partout ailleurs :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
' Garde-fou : ne rien faire sauf si le clic est dans la colonne « Done » (B2:B100).
If Intersect(Target, Me.Range("B2:B100")) Is Nothing Then Exit Sub
Cancel = True
Target.Value = IIf(Target.Value = "x", "", "x")
End Sub
Intersect(Target, Me.Range("B2:B100")) renvoie Nothing quand la cellule double-cliquée est
hors de votre plage cible, si bien qu'Exit Sub laisse le reste de la feuille se comporter
normalement — double-cliquez ailleurs et cela édite comme d'habitude. C'est le même garde-fou
Intersect qui empêche un gestionnaire Worksheet_Change de se
déclencher à chaque modification, et c'est ce qui distingue une commodité ciblée d'une prise de
contrôle de toute la feuille.
Le piège qui finit par se retourner contre vous : votre écriture déclenche un autre événement
Dès que votre gestionnaire écrit dans une cellule — et faire basculer une marque, c'est
exactement cela — il déclenche Worksheet_Change, parce que vous avez modifié la valeur d'une
cellule. La plupart du temps, c'est sans conséquence. Mais si la même feuille possède un
gestionnaire Worksheet_Change qui écrit lui aussi (un horodatage, un journal, un total
recalculé), les deux peuvent s'enchaîner, et dans le pire des cas l'écriture réentre dans votre
propre logique. La parade est la règle d'or de la famille d'événements : encadrez l'écriture
pour qu'elle ne puisse pas actionner la mécanique.
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, Me.Range("B2:B100")) Is Nothing Then Exit Sub
Cancel = True
Application.EnableEvents = False ' mon écriture ne déclenchera pas Worksheet_Change
Target.Value = IIf(Target.Value = "x", "", "x")
Application.EnableEvents = True
End Sub
Si votre gestionnaire fait plus qu'une écriture triviale, placez aussi le
EnableEvents = True dans un gestionnaire d'erreurs, pour qu'un plantage en cours de route ne
puisse pas laisser les événements désactivés pour toute la session — la même discipline que
celle décrite dans Worksheet_Change.
La distinction qui décide où va le code : feuille vs classeur
Worksheet_BeforeDoubleClick est un événement au niveau feuille — il réside dans le module
d'une seule feuille et ne se déclenche que pour les double-clics sur cette feuille. Si vous
voulez le même comportement sur chaque feuille, ne collez pas le gestionnaire dans douze
modules de feuille. Utilisez le jumeau au niveau classeur, Workbook_SheetBeforeDoubleClick,
qui réside dans ThisWorkbook et vous remet un premier argument supplémentaire, Sh, qui vous
indique quelle feuille a été cliquée :
' Dans ThisWorkbook — se déclenche pour un double-clic sur N'IMPORTE QUELLE feuille.
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
If Sh.Name <> "Tasks" Then Exit Sub
If Intersect(Target, Sh.Range("B2:B100")) Is Nothing Then Exit Sub
Cancel = True
Target.Value = IIf(Target.Value = "x", "", "x")
End Sub
C'est le même choix feuille vs classeur que celui que vous faites avec
Worksheet_Activate vs Workbook_SheetActivate : une seule
feuille → le module de la feuille ; n'importe quelle feuille → le module du classeur avec
l'argument Sh.
Comment ExcelMaster aide
Un bon gestionnaire de double-clic, ce sont trois petites décisions faciles à rater
subtilement : le garde-fou Intersect qui garde le reste de la feuille éditable, le
Cancel = True qui empêche la cellule d'entrer en mode édition, et le verrou EnableEvents
autour de toute écriture. Ratez-en une et la fonctionnalité semble cassée d'une manière
difficile à diagnostiquer.
ExcelMaster
vous laisse décrire le comportement à la place. Dites « un double-clic sur une cellule de la
colonne B doit faire basculer une coche et ne pas ouvrir la cellule en édition », et il écrit un
Worksheet_BeforeDoubleClick dans le bon module de feuille, le cible avec Intersect, règle
Cancel, et protège l'écriture. Vous gardez le classeur et le code ; vous vous épargnez les
tâtonnements pour apprendre quelle ligne fait quoi.
Questions fréquentes
Comment exécuter une macro quand une cellule est double-cliquée dans Excel ?
Placez une procédure Worksheet_BeforeDoubleClick dans le module de code de la feuille :
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean). Excel
l'appelle chaque fois qu'une cellule de cette feuille est double-cliquée et passe Target
(la cellule). Ajoutez-y votre action. Pour toutes les feuilles, utilisez
Workbook_SheetBeforeDoubleClick dans ThisWorkbook.
Comment empêcher la cellule d'entrer en mode édition au double-clic ?
Mettez Cancel = True à l'intérieur du gestionnaire. Excel vérifie Cancel après l'exécution
de votre code ; True supprime la réaction par défaut (l'entrée en mode édition), si bien que
seule votre action se produit. Sans cela, la cellule bascule et s'ouvre en édition.
Comment faire en sorte que le double-clic ne fonctionne que dans une seule colonne ?
Protégez avec Intersect :
If Intersect(Target, Me.Columns("B")) Is Nothing Then Exit Sub en tête du gestionnaire.
Intersect renvoie Nothing quand la cellule double-cliquée est hors de votre plage, si bien
que le reste de la feuille continue de s'éditer normalement au double-clic.
Pourquoi un double-clic sur une cellule la met-il en mode édition au lieu d'exécuter mon code ?
Soit le code n'est pas dans le module propre à la feuille, soit les macros sont désactivées,
soit votre gestionnaire s'exécute mais ne met jamais Cancel = True — et le comportement par
défaut d'Excel (le mode édition) se déclenche donc après votre code. Vérifiez que la procédure
se trouve dans le bon module de feuille et ajoutez Cancel = True.
Quelle est la différence entre BeforeDoubleClick et BeforeRightClick ?
Worksheet_BeforeDoubleClick intercepte un double-clic (réaction par défaut : entrer en mode
édition) ; Worksheet_BeforeRightClick intercepte un
clic droit (réaction par défaut : afficher le menu contextuel). Tous deux vous remettent
Target et un indicateur Cancel que vous mettez à True pour supprimer le comportement par
défaut.
Testé dans
Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 06/08/2026.
Guides associés : VBA Worksheet_BeforeRightClick · VBA Workbook_BeforePrint · VBA Worksheet_Change · VBA Worksheet_Activate et Deactivate · VBA Range
