Comment modifier ou ajouter des commandes
dans le menu contextuel du Code Pane du VBE
comment enrichir le menu contextuel du Code Pane(zone de code) du VBE en ajoutant des commandes personnalisées, sans utiliser OnAction.dans le menu contextuel du Code Pane du VBE
1. Points importants à connaître
- Les CommandBars du VBE ne dépendent pas de Application.CommandBars
- Elles sont accessibles via Application.VBE.CommandBars
- L’attribut .OnAction ne fonctionne pas dans le VBE
- Les clics doivent être gérés via CommandBarEvents
2. Le menu ciblé : Code Pane
Le menu contextuel affiché lors d’un clic droit dans une fenêtre de codeest une CommandBarPopup nommée :"Code Window"3. Accéder à la CommandBar
VB:
Dim bar As CommandBar
Set bar = Application.VBE.CommandBars("Code Window")
4. Réinitialiser le menu
Avant toute modification, il est conseillé de remettre la barre dans son étatd’origine afin d’éviter les doublons.
Code:
Sub resetBar()
Application.VBE.CommandBars("Code Window").Reset
End Sub
5. Principe général
- Récupérer la CommandBar Code Window
- Ajouter un menu msoControlPopup
- Ajouter des boutons msoControlButton
- Associer chaque bouton à une classe événement
- Conserver les instances dans une Collection globale
6. Module standard – création du menu
Code:
Option Explicit
Public Collect As New Collection
Public Sub AddmenuVBE()
Dim bar As CommandBar
Dim Cpop1 As Object, bout As Object
Dim cbEvent As MenuContextEvents
Dim i As Long
If Collect.Count > 0 Then
For i = Collect.Count To 1 Step -1
Collect.Remove i
Next i
End If
resetBar
Set bar = Application.VBE.CommandBars("Code Window")
Set Cpop1 = bar.Controls.Add(msoControlPopup, , , , True)
Cpop1.Caption = "Mon menu dans le VBE"
Set bout = Cpop1.Controls.Add(msoControlButton, , , , True)
bout.Caption = "Action 1"
bout.FaceId = 462
Set cbEvent = New MenuContextEvents
Set cbEvent.objEvents = Application.VBE.Events.CommandBarEvents(bout)
Collect.Add cbEvent
End Sub
7. Pourquoi OnAction ne fonctionne pas
Dans le VBE, .OnAction ne déclenche aucune macro.Le lien est rompu par le système interne d’Excel.La seule solution fiable consiste à utiliser les événementsCommandBarEvents dans un module de classe.
8. Module de classe : MenuContextEvents
Référence requise : Microsoft Visual Basic for Applications Extensibility 5.3
Code:
Option Explicit
Public WithEvents objEvents As CommandBarEvents
Private Sub objEvents_Click(ByVal cbControl As Object, _
Handled As Boolean, _
CancelDefault As Boolean)
Action_1
CancelDefault = True
End Sub
9. Rôle de WithEvents
- Permet d’intercepter les clics du bouton
- Expose automatiquement les procédures _Click
- Indispensable pour les menus VBE
10. Importance de la Collection globale
Sans référence persistante, l’objet événement est détruitet les boutons deviennent inactifs.11. Recréation du menu après action
Toute modification du code peut réinitialiser les variables globales.Il est donc recommandé de recréer le menu après une action.
Code:
Sub Action_1()
MsgBox "Action 1"
AddmenuVBE
End Sub
12. Conclusion
Ce mécanisme permet d’enrichir durablement le VBE avec des outils personnalisés,en contournant proprement les limitations de OnAction.Les piliers de cette architecture sont :
- Application.VBE.CommandBars
- CommandBarEvents
- WithEvents
- Gestion stricte du cycle de vie des objets
derniere Astuce
Il est possible de mutualiser les événements et de router les actions viacbControl.Tag, Caption ou Idpour des menus dynamiques.voila vous avez un fichier demo
- Auteur
- Patrick
- Version
- 1.2