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

VBA Worksheet_BeforeRightClick dans Excel — remplacer le menu du clic droit (et pourquoi le désactiver n'est pas de la sécurité)

|

VBA Worksheet_BeforeRightClick dans Excel — remplacer le menu du clic droit (et pourquoi le désactiver n'est pas de la sécurité)

TL;DRWorksheet_BeforeRightClick est un événement qu'Excel déclenche à l'instant où vous faites un clic droit sur une cellule — avant que le menu contextuel n'apparaisse. Il vous remet Target (la cellule) et Cancel. Mettez Cancel = True et le menu du clic droit intégré d'Excel est supprimé, ce qui vous permet de mettre votre menu — ou une action directe — à sa place. Le piège que presque tout le monde rencontre, c'est la portée : un Cancel = True inconditionnel désactive Copier, Coller et Insérer pour toute la feuille, alors protégez-le avec Intersect. Et sachez-le d'emblée — désactiver le clic droit est un choix d'ergonomie, pas de sécurité.

' Réside dans le module de la feuille (double-cliquez « Sheet1 » sous Microsoft Excel Objets).
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    ' Ne détourner les clics droits qu'à l'intérieur de la colonne Status ; laisser le reste de la feuille tranquille.
    If Intersect(Target, Me.Range("C2:C100")) Is Nothing Then Exit Sub

    Cancel = True                       ' <-- supprimer le menu contextuel intégré
    Target.Value = Date                 ' le clic droit inscrit la date du jour à la place
End Sub

La plupart des macros attendent un bouton. Worksheet_BeforeRightClick attend un geste — un clic droit sur une cellule — et il s'exécute avant qu'Excel ne fasse ce qu'un clic droit fait normalement : afficher le menu contextuel. Ce « avant » est l'ouverture dont vous avez besoin. Vous pouvez supprimer le menu par défaut et lui substituer le vôtre, transformer un clic droit en commande d'un seul geste, ou ajouter quelques éléments personnalisés à ce qu'Excel propose déjà. C'est aussi l'événement vers lequel on se tourne pour « verrouiller » une feuille — et c'est là que se cache la leçon la plus importante.

Ce que vous allez apprendre

  • Le modèle mental — un clic droit est une demande de menu, et c'est à vous d'y répondre
  • La règle qui compte le plus — Cancel = True est ce qui supprime réellement le menu intégré
  • Pourquoi le ciblage avec Intersect n'est pas facultatif — la version non ciblée paralyse la feuille
  • Le choix de jugement — désactiver le clic droit relève de l'ergonomie, jamais de la protection
  • Niveau feuille vs niveau classeur, et où le code doit résider

Le modèle mental : une demande de menu à laquelle vous répondez

Un clic droit signifie déjà quelque chose pour Excel : « affiche-moi le menu contextuel de cette cellule ». Quand vous écrivez Worksheet_BeforeRightClick, Excel appelle d'abord votre code et attend — le menu n'est pas encore apparu. Vous recevez Target, la cellule sur laquelle on a fait un clic droit, et Cancel, un Boolean passé par référence. Laissez Cancel tel quel et Excel affiche son menu normal après l'exécution de votre code. Mettez Cancel = True et il ne le fait pas — vous avez répondu vous-même à la demande, et le clic droit signifie désormais ce que votre gestionnaire lui a fait signifier.

Cela recadre l'événement. Ce n'est pas « préviens-moi lors d'un clic droit ». C'est « laisse-moi décider ce qu'un clic droit propose ici ». Vous pouvez exécuter une action directement (inscrire une date, marquer une ligne, ouvrir un formulaire de détail), ou faire surgir votre propre menu construit avec CommandBars. Dans tous les cas, le menu intégré ne disparaît que lorsque vous le décidez, avec Cancel = True. Et comme tout événement de cette famille, celui-ci réside dans le module de code propre à la feuille — pas un Module standard, ni ThisWorkbook.

La règle qui compte le plus : Cancel = True supprime le menu intégré

Voici l'erreur. Vous voulez qu'un clic droit exécute votre propre commande, alors vous écrivez l'action et vous vous arrêtez là :

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    Target.Value = Date        ' inscrit la date... et le menu d'Excel surgit quand même
End Sub

La date s'inscrit — puis le menu contextuel complet apparaît malgré tout, parce que rien n'a touché à Cancel. L'utilisateur se retrouve avec à la fois votre action et le menu Couper/Copier/Coller d'Excel par-dessus. La règle : Cancel = True est la ligne qui remplace le menu. Mettez-le chaque fois que votre gestionnaire est censé être la réponse au clic droit :

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    Cancel = True              ' le menu intégré ne s'affiche jamais
    Target.Value = Date        ' votre commande constitue toute l'interaction
End Sub

Si au contraire vous voulez ajouter un élément plutôt que remplacer le menu, laissez Cancel tel quel et ajoutez votre contrôle à Application.CommandBars("Cell") — Excel affiche son menu avec votre élément supplémentaire. Supprimez (avec Cancel = True) quand vous remplacez ; étendez la CommandBar Cell quand vous ajoutez.

La règle qui garde la feuille utilisable : cibler avec Intersect

Cet événement punit un gestionnaire non ciblé plus durement que tout autre. Si votre code s'exécute à chaque clic droit et met Cancel = True, vous avez supprimé tout le menu du clic droit de la feuille entière — plus de Copier, plus de Coller, plus d'Insérer, plus de Filtrer, plus de Format de cellule, nulle part. Vous n'avez pas personnalisé la feuille ; vous l'avez cassée.

Ciblez les cellules censées avoir un comportement personnalisé, et laissez toutes les autres cellules conserver leur menu normal :

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    ' Comportement personnalisé uniquement dans la colonne Status ; menu normal partout ailleurs.
    If Intersect(Target, Me.Range("C2:C100")) Is Nothing Then Exit Sub

    Cancel = True
    Target.Value = Date
End Sub

Intersect(Target, Me.Range("C2:C100")) renvoie Nothing hors de votre plage cible, si bien qu'Exit Sub rend la main à Excel et le menu intégré apparaît comme d'habitude. C'est le même garde-fou Intersect qui garde un gestionnaire Worksheet_Change ciblé — ici, c'est la différence entre une feuille utile et une feuille inutilisable.

Le choix de jugement : désactiver le clic droit relève de l'ergonomie, pas de la sécurité

Les gens tombent sur cet événement en cherchant « comment désactiver le clic droit pour protéger ma feuille ». Alors disons-le clairement : un blocage du clic droit par Cancel = True ne protège rien. Il n'arrête qu'une seule voie de saisie — le menu de la souris. Tout le reste fonctionne encore : Ctrl+C et Ctrl+V, le ruban, la Zone Nom, une autre macro, et — l'argument qui clôt le débat — l'ouverture du fichier avec les macros désactivées, ce qui coupe entièrement votre événement. Si votre modèle de menace, c'est un utilisateur déterminé ou un acteur malveillant, BeforeRightClick n'y change rien.

Ce à quoi l'événement sert vraiment, c'est à façonner l'interaction : masquer un menu sans intérêt dans une zone de saisie, le remplacer par deux commandes qui collent réellement à la tâche, ou inscrire une valeur d'un geste. Servez-vous-en pour rendre la bonne action facile, pas pour rendre la mauvaise impossible. Si vous avez besoin d'une vraie protection, c'est la protection de la feuille, la protection de la structure du classeur, et le fait de ne pas se fier à un événement côté client — un tout autre outil.

La distinction qui décide où va le code : feuille vs classeur

Worksheet_BeforeRightClick est un événement au niveau feuille — il réside dans le module d'une seule feuille et ne se déclenche que sur cette feuille. Pour appliquer le même comportement partout, utilisez le jumeau au niveau classeur Workbook_SheetBeforeRightClick dans ThisWorkbook, qui ajoute un premier argument, Sh, pour la feuille concernée :

' Dans ThisWorkbook — se déclenche pour un clic droit sur N'IMPORTE QUELLE feuille.
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
    If Sh.Name <> "Log" Then Exit Sub
    If Intersect(Target, Sh.Range("C2:C100")) Is Nothing Then Exit Sub
    Cancel = True
    Target.Value = Date
End Sub

Le même choix 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. Et il forme une paire naturelle avec son frère gestuel Worksheet_BeforeDoubleClick, qui intercepte un double-clic avec la même forme Target plus Cancel.

Comment ExcelMaster aide

Un gestionnaire de clic droit, ce sont trois décisions faciles à rater : le garde-fou Intersect qui maintient Copier et Coller en vie hors de votre plage cible, le Cancel = True qui supprime réellement le menu, et le jugement honnête sur ce qu'un blocage protège et ne protège pas.

ExcelMaster vous laisse décrire le comportement à la place. Dites « un clic droit sur une cellule de la colonne Status doit inscrire la date du jour et ne pas afficher le menu normal, mais laisser le reste de la feuille tranquille », et il écrit un Worksheet_BeforeRightClick dans le bon module, le cible avec Intersect, et règle Cancel. Vous gardez le classeur et le code ; vous vous épargnez les tâtonnements — et on vous dit ce qu'il protège, on ne vous le vend pas.

Questions fréquentes

Comment exécuter une macro lors d'un clic droit dans Excel ?

Placez une procédure Worksheet_BeforeRightClick dans le module de code de la feuille : Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean). Excel l'appelle lorsqu'on fait un clic droit sur une cellule de cette feuille et passe Target. Ajoutez votre action, et mettez Cancel = True si vous voulez remplacer le menu intégré.

Comment désactiver le menu du clic droit en VBA ?

Mettez Cancel = True à l'intérieur de Worksheet_BeforeRightClick. Cela supprime le menu contextuel. Ciblez-le avec Intersect sauf si vous voulez vraiment le faire disparaître sur toute la feuille — un blocage inconditionnel supprime Copier, Coller et Insérer partout. Notez qu'il ne bloque que le menu de la souris ; ce n'est pas un contrôle de sécurité.

Désactiver le clic droit protège-t-il mes données ?

Non. Il ne supprime qu'une seule voie de saisie. Ctrl+C/Ctrl+V, le ruban, les autres macros et l'ouverture du fichier avec les macros désactivées le contournent tous. Servez-vous de BeforeRightClick pour fluidifier l'interaction, et utilisez la protection de feuille/classeur pour une protection réelle.

Comment ajouter un élément personnalisé au menu du clic droit au lieu de le remplacer ?

Laissez Cancel non défini et ajoutez un contrôle à Application.CommandBars("Cell") — Excel affiche son menu normal avec votre élément supplémentaire. Ne mettez Cancel = True que lorsque vous voulez remplacer le menu plutôt que l'étendre.

Où placer le code Worksheet_BeforeRightClick ?

Dans le module de code de la feuille concernée — double-cliquez sur la feuille sous « Microsoft Excel Objets » dans l'Explorateur de projets. Pour un clic droit sur n'importe quelle feuille, utilisez plutôt Workbook_SheetBeforeRightClick dans ThisWorkbook. Il ne se déclenche pas depuis un Module standard, et les macros doivent être activées.

Testé dans

Testé dans : Excel 365 (Windows 11), VBA 7.1 — dernière vérification le 06/08/2026.

Guides associés : VBA Worksheet_BeforeDoubleClick · VBA Workbook_BeforePrint · VBA Worksheet_Change · VBA Worksheet_Activate et Deactivate · VBA Range