🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Worksheet_BeforeDoubleClick dans Excel — transformer un double-clic en action (et supprimer le mode édition)

|

VBA Worksheet_BeforeDoubleClick dans Excel — transformer un double-clic en action (et supprimer le mode édition)

TL;DRWorksheet_BeforeDoubleClick est 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) et Cancel. Mettez Cancel = True et 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 avec Intersect.

' 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, Cancel en supprime le comportement par défaut
  • La règle qui compte le plus — oubliez Cancel = True et la cellule passe quand même en mode édition
  • Comment cibler l'événement sur une seule colonne avec Intersect pour 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