Comment modifier ou ajouter des commandes
dans le les commandbars "standard" et barre de menus" dans le vbe
dans le les commandbars "standard" et barre de menus" dans le vbe
1. Points importants à connaître
Les CommandBars du VBE ne dépendent pas de Application.CommandBars
Elles sont accessibles via Application.VBE.CommandBars(Application.CommandBars dans les userforms)
L’attribut .OnAction ne fonctionne pas dans le VBE
Les clics doivent être gérés via CommandBarEvents dans les modules classe ou userforms
2. Les menu ciblé : "Standard" ou "Barre De Menus"
ces deux barres se trouve en haut de la fenêtre VBE
3. Accéder à la CommandBar
VB:
Dim bar As CommandBar
Set bar = Application.VBE.CommandBars("Standard")
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:
Code:
Sub resetBar()
Application.VBE.CommandBars("Standard").Reset
End Sub
5. Principe général
Récupérer la CommandBar "Standard" ou "Barre de menus"
Ajouter un menu msoControlPopup(selon votre besoin)
Ajouter des boutons msoControlButton(²dans la barre ou le popup)
créer et Associer chaque bouton à un event dans une classe event(Car le onAction ne fonctionne pas en vbe)
VB:
6. Module standard – création du menu
Option Explicit
'cette méthode peut être appliquer exactement de la même manière à la commandbars "Barre de menus"en dessous la barre standard
Public cbevent As CommanbarsVbeEvent
Sub Add_Menu_Cmb_Standard()
Dim Bar
Dim bouton As CommandBarButton
Dim sep As CommandBarButton
Dim popup As CommandBarControl
Set cbevent = New CommanbarsVbeEvent ' on crée une seule instance puisque l'on gère 4 events dans la classe
Set Bar = Application.VBE.CommandBars("standard")
'Set Bar = Application.VBE.CommandBars("Barre de menus")
Bar.Reset
With Bar
'Comme les separateurs n'existent pas dans les commandbars fixe( VBE et Ruban)
'on place un bouton avec un symbole jouant le role de separateur
'facultatif!!
Set sep = .Controls.Add(Type:=msoControlButton)
sep.Caption = "|"
sep.Style = msoButtonCaption
'Ajoute un menu déroulant
Set popup = .Controls.Add(msoControlPopup)
popup.Caption = "Mon menu" 'Le texte du menu déroulantc'est un controls de type MsoControlPopup
'on ajoute les bouton dans le menu deroulant
'premier bouton
Set bouton = popup.Controls.Add(msoControlButton)
bouton.Caption = "Action 1" 'texte du bouton
bouton.Style = msoButtonIconAndCaption ' style de bouton voir commentaire en haut du module l'enumeration des style
'bouton.Visible = True
bouton.FaceId = 5687 'l'icone n'est pas obligatoire
'ici on instancie une gestion du click donc une instance de classe et on la GroupeClasseionne pour qu'elle dur pendant toute la durée ou le fichier est ouvert
Set cbevent.BtnEvents = Application.VBE.Events.CommandBarEvents(bouton)
Set cbevent.CbmControl1 = bouton 'l'object CbmControl1 de la classe est le bouton(pratique si on utilise le tag pour transporter des paramètres
'2d bouton
Set bouton = popup.Controls.Add(msoControlButton)
bouton.Caption = "Action2"
bouton.Style = msoButtonIconAndCaption
'bouton.Visible = True
bouton.FaceId = 5687 'l'icone n'est pas obligatoire
'ici on instancie une gestion du click donc une instance de classe et on la GroupeClasseionne pour qu'elle dur pendant toute la durée ou le fichier est ouvert
Set cbevent.BtnEvents2 = Application.VBE.Events.CommandBarEvents(bouton)
Set cbevent.CbmControl2 = bouton
Set bouton = .Controls.Add(msoControlButton)
bouton.Caption = "BoutonX1"
bouton.Style = msoButtonIconAndCaption
'bouton.Visible = True
bouton.FaceId = 5687 'l'icone n'est pas obligatoire
'ici on instancie une gestion du click donc une instance de classe et on la GroupeClasseionne pour qu'elle dur pendant toute la durée ou le fichier est ouvert
Set cbevent.BtnEvents3 = Application.VBE.Events.CommandBarEvents(bouton)
Set cbevent.CbmControl3 = bouton 'l'object CbmControl2 de la classe est le bouton(pratique si on utilise le tag pour transporter des paramètres
Set bouton = .Controls.Add(msoControlButton)
bouton.Caption = "BoutonX2"
bouton.Style = msoButtonIconAndCaption
'bouton.Visible = True
bouton.FaceId = 5687 'l'icone n'est pas obligatoire
'ici on instancie une gestion du click donc une instance de classe et on la GroupeClasseionne pour qu'elle dur pendant toute la durée ou le fichier est ouvert
Set cbevent.BtnEvents4 = Application.VBE.Events.CommandBarEvents(bouton)
Set cbevent.CbmControl4 = bouton 'l'object CbmControl1 de la classe est le bouton(pratique si on utilise le tag pour transporter des paramètres
Set sep = .Controls.Add(Type:=msoControlButton)
sep.Caption = "|"
sep.Style = msoButtonCaption
End With
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 : CommanbarsVbeEvent
Référence requise : Microsoft Visual Basic for Applications Extensibility 5.3
VB:
Option Explicit
'les events des bouton separés dans la même classe
Public WithEvents BtnEvents As CommandBarEvents
Public WithEvents BtnEvents2 As CommandBarEvents
Public WithEvents BtnEvents3 As CommandBarEvents
Public WithEvents BtnEvents4 As CommandBarEvents
'les bouton en type commandbarbutton
Public CbmControl1 As CommandBarButton
Public CbmControl2 As CommandBarButton
Public CbmControl3 As CommandBarButton
Public CbmControl4 As CommandBarButton
Private Sub BtnEvents_Click(ByVal cbControl As Object, Handled As Boolean, CancelDefault As Boolean)
'Handled = True
CancelDefault = True
MsgBox CbmControl1.Caption
Add_Menu_Cmb_Standard
End Sub
Private Sub BtnEvents2_Click(ByVal cbControl As Object, Handled As Boolean, CancelDefault As Boolean)
'Handled = True
CancelDefault = True
MsgBox CbmControl2.Caption
End Sub
Private Sub BtnEvents3_Click(ByVal cbControl As Object, Handled As Boolean, CancelDefault As Boolean)
'Handled = True
CancelDefault = True
MsgBox CbmControl3.Caption
End Sub
Private Sub BtnEvents4_Click(ByVal cbControl As Object, Handled As Boolean, CancelDefault As Boolean)
'Handled = True
CancelDefault = True
MsgBox CbmControl4.Caption
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
11. Recréation du menu après action( si l'action fait des modifications dans le code du module actif )
Toute modification du code peut réinitialiser les variables globales.Il est donc recommandé de recréer le menu après une action.
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 des boutons en ne creant qu'un seul event dans la classe
mais chaque bouton enregistrés dans une instance de classe qui lui est propre
- Auteur
- patricktoulon
- Version
- 1.3