VBA : Gérer les menus et les barres d’outils avec CommandBar

VBA : Gérer les menus et les barres d’outils avec CommandBar
Dernière mise à jour le 21/04/2024
Temps de lecture : 4 minutes

Pour gérer toutes les commandes de la barre d'outils et des menus en VBA, il faut passer par la collection CommandBar. Voici comment l'utiliser.

Gérer la collection CommandBar en VBA

La collection CommandBars du VBA représente l'ensemble des barres de menus et d'outils, chacune étant un objet CommandBar.

Pour travailler avec une barre, vous pouvez utiliser les syntaxes suivantes :

  • CommandBars(n) où n représente l'index de la barre . Difficile de savoir quel est l'index d'une barre précise.
  • CommandBars("nom de la barre") où "nom de la barre" représente son nom en anglais. Par exemple pour la barre d'outils Mise en forme, son nom est Formatting.

L'exemple suivant vous permet d'inscrire dans un classeur le nom des barres d'outils dans votre langue (NameLocal) et en anglais (Name), ainsi que son Index.

Sub ListeBarre()
    Dim cbar As CommandBar
    For Each cbar In Application.CommandBars 'pour chaque barre de l'application
          ActiveCell = cbar.Index                      'index de la barre dans la cellule active
          ActiveCell.Offset(0, 1) = cbar.NameLocal 'nom local de la barre dans la cellule située à droite de la cellule active
          ActiveCell.Offset(0, 2) = cbar.Name ' nom de la barre dans la cellule située à 2 colonnes à droite de la cellule active
          ActiveCell.Offset(1, 0).Select 'sélection de la cellule situé sous la cellule active
     Next
End Sub

Afficher/masquer un menu

Pour afficher, vous pouvez la rendre visible, pour la masquer, vous pouvez soit la rendre invisible, soit la rendre inactive.

' Pour visible le menu
Application.CommandBars("Dessin").Visible = True 
' Pour masquer le menu
Application.CommandBars("Dessin").Visible = False
' Pour griser le menu
Application.CommandBars("Dessin").Enabled = False
' Pour rendre actif le menu
Application.CommandBars("Dessin").Enabled = True 

Toutes les barres affichées puis faire réapparaître uniquement seulement qui était affichées comme dans les 2 exemples suivants

Sub MasqueBarre()
     Dim cbar As CommandBar
     For Each cbar In Application.CommandBars 'pour chaque barre de l'application
          cbar.Enabled = False                         'inactivation de la barre
     Next
End Sub

Sub AffichBarre()
     Dim cbar As CommandBar
     For Each cbar In Application.CommandBars 'pour chaque barre de l'application
          cbar.Enabled = True                          'activation de la barre
     Next
End Sub

Ajouter/Supprimer une barre

Pour ajouter une barre, il suffit d'utiliser la méthode Add ainsi :

Application.CommandBars.Add "nom de votre barre", [position], [MenuBar], [Temporary]

Les paramètres entre crochets ne sont pas obligatoires, si elles ne sont pas indiquées, la valeur par defaut est appliquée

  • position correspond à la position de la barre dans Excel : msoBarLeft (à gauche), msoBarTop (en haut), msoBarRight (à droite), msoBarBottom (en bas) , msoBarFloating (flottante), msoBarPopup (menu contextuel)Par défaut : msoBarFloating.
  • MenuBar doit être à True si vous voulez remplacer la barre d'outils active.  Par défaut : False
  • Temporary doit être à True pour que la barre soit temporaire, dans ce cas elle disparaît à la fermeture d'Excel. Par défaut : False

Pour ne pas supprimer une barre d'outils prédéfinis, il vous faut vérifier si la barre d'outils est une barre d'outils personnalisée ou prédéfinie, la propriété BuiltIn est False dans le cas d'une barre d'outils personnalisées.

L'exemple suivant, supprime toutes les barres personnalisées que vous avez créées dans Excel :

Sub SupprBarrePerso()
     Dim cbar As CommandBar     For Each cbar In Application.CommandBars
          If Not cbar.BuiltIn Then cbar.Delete 'si non prédéfinie alors suppression
     Next
End Sub

Ajouter/supprimer un contrôle

Pour ajouter un contrôle, il faut d'abord faire référence à l'ensemble des contrôles de la barre (même si elle est vide), puis ajouter :

Application.CommandBars("Standard").Controls.Add [Type], [Id], [Parameter], [Before], [Temporary]

Les paramètres entre crochets ne sont pas obligatoires, si elles ne sont pas indiquées, la valeur par defaut est appliquée

  • Type indique le type de contrôle : msoControlButton (bouton), msoControlEdit (zone de texte), msoControlDropdown (zone de liste déroulante), msoControlComboBox (zone de liste modifiable) ou msoControlPopup (sous-menu). Par défaut :msoControlButton
  • Id est un nombre entier représentant un contrôle prédéfini. Chaque bouton des barres d'outils prédifinis a un ID propre. Par défaut, c'est un bouton vide.
  • Parameter, vous pouvez stocker dans ce paramètre les donnés que vous voulez (pour pouvoir les relire ensuite).
  • Before, position du nouveau contrôle, il se placera alors devant le contrôle dont la position est le numéro indiqué. Par défaut : à la fin de le barre de commande
  • Temporary doit être à True pour que le contrôle soit temporaire, dans ce cas il disparaît à la fermeture d'Excel. Par défaut : False.

Exemple créant une barre d'outils et y ajoute les boutons couper,copier, coller :

Sub NouvBarre()
     Dim MaBarre As CommandBar
     Dim NouvBtn As CommandBarButton
     'ajoute une barre d'outils
     Set MaBarre = CommandBars.Add("BarrePerso")
    'ajoute le bouton couper à la barre
     Set NouvBtn = MaBarre.Controls.Add(msoControlButton,CommandBars("Standard").Controls("Couper").ID)
     'ajoute le bouton couper à la barre
     Set NouvBtn = MaBarre.Controls.Add(msoControlButton, Application.CommandBars("Standard").Controls("Copier").ID)
     'ajoute le bouton coller à la barre
     Set NouvBtn = MaBarre.Controls.Add(msoControlButton, Application.CommandBars("Standard").Controls("Coller").ID)
     'affiche la barre 
     MaBarre.Visible = True 
End Sub

Pour supprimer un contrôle

CommandBars("BarrePerso").Controls(3).Delete

Une zone de texte

Pour lancer une procédure ayant besoin d'une indication, vous pouvez utiliser une zone de texte comme dans l'exemple suivant, la macro "Ma_macro" se lance dès que l'utilisateur appuie sur la touche Entrée après avoir tapé son texte :

Sub AjoutZoneTexte()
     Dim MaBarre As CommandBar
     Dim MonTxt As CommandBarComboBox ' une zone de texte est de ce type     Set MaBarre = CommandBars("BarrePerso")
     Set MonTxt = MaBarre.Controls.Add(msoControlEdit) 'ajoute une zone de texte
     MonTxt.OnAction = "Ma_macro"
     MonTxt.Tag = "txt1"
End SubSub Ma_macro()
     Dim MonBtn As CommandBarComboBox, strTxt As String     Set MonBtn = CommandBars("BarrePerso").FindControl(, , "txt1")
     strTxt = MonBtn.Text
     'ici vous mettez vos instructions, exemple :
     MsgBox strTxt
End Sub

Une zone de liste déroulante

Vous donnez un choix à l'utilisateur, dès que celui-ci sélectionne l'un d'entre eux, la procédure attachée se lance (ici Ma_macro).

Sub AjoutZoneTexte()
     Dim MaBarre As CommandBar
     Dim MonTxt As CommandBarComboBox
     
     Set MaBarre = CommandBars("BarrePerso")
     Set MonTxt = MaBarre.Controls.Add(msoControlDropdown) 'ajoute une liste déroulante
     With MonTxt
          .OnAction = "Ma_macro"
          .Tag = "lst1"
          .AddItem "Choix 1" 'ajoute une ligne à la liste
          .AddItem "Choix 2"
          .AddItem "Choix 3"
          .AddItem "Choix 4"
     End With
End Sub

Sub Ma_macro()
     Dim MonBtn As CommandBarComboBox, strTxt As String
     Set MonBtn = CommandBars("BarrePerso").FindControl(, , "lst1")
     strTxt = MonBtn.Text
     'ici vous mettez vos instructions, exemple :
     MsgBox strTxt
End Sub

Articles liés

1 Comment

  1. LECORNEC
    13/12/2022 @ 19:11

    Bonjour,
    Merci beaucoup pour cet outil très utile.
    Cependant, puis-je me permettre de vous demander si il est possible de modifier la police de caractère d'un msoControlButton ?
    Je vous remercie par avance pour votre réponse
    Meilleures salutations

    Reply

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

VBA : Gérer les menus et les barres d’outils avec CommandBar

Reading time: 4 minutes
Dernière mise à jour le 21/04/2024

Pour gérer toutes les commandes de la barre d'outils et des menus en VBA, il faut passer par la collection CommandBar. Voici comment l'utiliser.

Gérer la collection CommandBar en VBA

La collection CommandBars du VBA représente l'ensemble des barres de menus et d'outils, chacune étant un objet CommandBar.

Pour travailler avec une barre, vous pouvez utiliser les syntaxes suivantes :

  • CommandBars(n) où n représente l'index de la barre . Difficile de savoir quel est l'index d'une barre précise.
  • CommandBars("nom de la barre") où "nom de la barre" représente son nom en anglais. Par exemple pour la barre d'outils Mise en forme, son nom est Formatting.

L'exemple suivant vous permet d'inscrire dans un classeur le nom des barres d'outils dans votre langue (NameLocal) et en anglais (Name), ainsi que son Index.

Sub ListeBarre()
    Dim cbar As CommandBar
    For Each cbar In Application.CommandBars 'pour chaque barre de l'application
          ActiveCell = cbar.Index                      'index de la barre dans la cellule active
          ActiveCell.Offset(0, 1) = cbar.NameLocal 'nom local de la barre dans la cellule située à droite de la cellule active
          ActiveCell.Offset(0, 2) = cbar.Name ' nom de la barre dans la cellule située à 2 colonnes à droite de la cellule active
          ActiveCell.Offset(1, 0).Select 'sélection de la cellule situé sous la cellule active
     Next
End Sub

Afficher/masquer un menu

Pour afficher, vous pouvez la rendre visible, pour la masquer, vous pouvez soit la rendre invisible, soit la rendre inactive.

' Pour visible le menu
Application.CommandBars("Dessin").Visible = True 
' Pour masquer le menu
Application.CommandBars("Dessin").Visible = False
' Pour griser le menu
Application.CommandBars("Dessin").Enabled = False
' Pour rendre actif le menu
Application.CommandBars("Dessin").Enabled = True 

Toutes les barres affichées puis faire réapparaître uniquement seulement qui était affichées comme dans les 2 exemples suivants

Sub MasqueBarre()
     Dim cbar As CommandBar
     For Each cbar In Application.CommandBars 'pour chaque barre de l'application
          cbar.Enabled = False                         'inactivation de la barre
     Next
End Sub

Sub AffichBarre()
     Dim cbar As CommandBar
     For Each cbar In Application.CommandBars 'pour chaque barre de l'application
          cbar.Enabled = True                          'activation de la barre
     Next
End Sub

Ajouter/Supprimer une barre

Pour ajouter une barre, il suffit d'utiliser la méthode Add ainsi :

Application.CommandBars.Add "nom de votre barre", [position], [MenuBar], [Temporary]

Les paramètres entre crochets ne sont pas obligatoires, si elles ne sont pas indiquées, la valeur par defaut est appliquée

  • position correspond à la position de la barre dans Excel : msoBarLeft (à gauche), msoBarTop (en haut), msoBarRight (à droite), msoBarBottom (en bas) , msoBarFloating (flottante), msoBarPopup (menu contextuel)Par défaut : msoBarFloating.
  • MenuBar doit être à True si vous voulez remplacer la barre d'outils active.  Par défaut : False
  • Temporary doit être à True pour que la barre soit temporaire, dans ce cas elle disparaît à la fermeture d'Excel. Par défaut : False

Pour ne pas supprimer une barre d'outils prédéfinis, il vous faut vérifier si la barre d'outils est une barre d'outils personnalisée ou prédéfinie, la propriété BuiltIn est False dans le cas d'une barre d'outils personnalisées.

L'exemple suivant, supprime toutes les barres personnalisées que vous avez créées dans Excel :

Sub SupprBarrePerso()
     Dim cbar As CommandBar     For Each cbar In Application.CommandBars
          If Not cbar.BuiltIn Then cbar.Delete 'si non prédéfinie alors suppression
     Next
End Sub

Ajouter/supprimer un contrôle

Pour ajouter un contrôle, il faut d'abord faire référence à l'ensemble des contrôles de la barre (même si elle est vide), puis ajouter :

Application.CommandBars("Standard").Controls.Add [Type], [Id], [Parameter], [Before], [Temporary]

Les paramètres entre crochets ne sont pas obligatoires, si elles ne sont pas indiquées, la valeur par defaut est appliquée

  • Type indique le type de contrôle : msoControlButton (bouton), msoControlEdit (zone de texte), msoControlDropdown (zone de liste déroulante), msoControlComboBox (zone de liste modifiable) ou msoControlPopup (sous-menu). Par défaut :msoControlButton
  • Id est un nombre entier représentant un contrôle prédéfini. Chaque bouton des barres d'outils prédifinis a un ID propre. Par défaut, c'est un bouton vide.
  • Parameter, vous pouvez stocker dans ce paramètre les donnés que vous voulez (pour pouvoir les relire ensuite).
  • Before, position du nouveau contrôle, il se placera alors devant le contrôle dont la position est le numéro indiqué. Par défaut : à la fin de le barre de commande
  • Temporary doit être à True pour que le contrôle soit temporaire, dans ce cas il disparaît à la fermeture d'Excel. Par défaut : False.

Exemple créant une barre d'outils et y ajoute les boutons couper,copier, coller :

Sub NouvBarre()
     Dim MaBarre As CommandBar
     Dim NouvBtn As CommandBarButton
     'ajoute une barre d'outils
     Set MaBarre = CommandBars.Add("BarrePerso")
    'ajoute le bouton couper à la barre
     Set NouvBtn = MaBarre.Controls.Add(msoControlButton,CommandBars("Standard").Controls("Couper").ID)
     'ajoute le bouton couper à la barre
     Set NouvBtn = MaBarre.Controls.Add(msoControlButton, Application.CommandBars("Standard").Controls("Copier").ID)
     'ajoute le bouton coller à la barre
     Set NouvBtn = MaBarre.Controls.Add(msoControlButton, Application.CommandBars("Standard").Controls("Coller").ID)
     'affiche la barre 
     MaBarre.Visible = True 
End Sub

Pour supprimer un contrôle

CommandBars("BarrePerso").Controls(3).Delete

Une zone de texte

Pour lancer une procédure ayant besoin d'une indication, vous pouvez utiliser une zone de texte comme dans l'exemple suivant, la macro "Ma_macro" se lance dès que l'utilisateur appuie sur la touche Entrée après avoir tapé son texte :

Sub AjoutZoneTexte()
     Dim MaBarre As CommandBar
     Dim MonTxt As CommandBarComboBox ' une zone de texte est de ce type     Set MaBarre = CommandBars("BarrePerso")
     Set MonTxt = MaBarre.Controls.Add(msoControlEdit) 'ajoute une zone de texte
     MonTxt.OnAction = "Ma_macro"
     MonTxt.Tag = "txt1"
End SubSub Ma_macro()
     Dim MonBtn As CommandBarComboBox, strTxt As String     Set MonBtn = CommandBars("BarrePerso").FindControl(, , "txt1")
     strTxt = MonBtn.Text
     'ici vous mettez vos instructions, exemple :
     MsgBox strTxt
End Sub

Une zone de liste déroulante

Vous donnez un choix à l'utilisateur, dès que celui-ci sélectionne l'un d'entre eux, la procédure attachée se lance (ici Ma_macro).

Sub AjoutZoneTexte()
     Dim MaBarre As CommandBar
     Dim MonTxt As CommandBarComboBox
     
     Set MaBarre = CommandBars("BarrePerso")
     Set MonTxt = MaBarre.Controls.Add(msoControlDropdown) 'ajoute une liste déroulante
     With MonTxt
          .OnAction = "Ma_macro"
          .Tag = "lst1"
          .AddItem "Choix 1" 'ajoute une ligne à la liste
          .AddItem "Choix 2"
          .AddItem "Choix 3"
          .AddItem "Choix 4"
     End With
End Sub

Sub Ma_macro()
     Dim MonBtn As CommandBarComboBox, strTxt As String
     Set MonBtn = CommandBars("BarrePerso").FindControl(, , "lst1")
     strTxt = MonBtn.Text
     'ici vous mettez vos instructions, exemple :
     MsgBox strTxt
End Sub

Articles liés

1 Comment

  1. LECORNEC
    13/12/2022 @ 19:11

    Bonjour,
    Merci beaucoup pour cet outil très utile.
    Cependant, puis-je me permettre de vous demander si il est possible de modifier la police de caractère d'un msoControlButton ?
    Je vous remercie par avance pour votre réponse
    Meilleures salutations

    Reply

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.