Icône de la ressource

Ajouter ou modifier les commandbar dans le VBE (épisode 1 le menu contextuel dans le codepane) 1.2

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.

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
Retour