Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.
Icône de la ressource

Ajouter des boutons dans les commandbar dans le VBE (épisode 2 la Standard et barres de menus) 1.3

Comment modifier ou ajouter des commandes
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
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…