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
Chevalier
04/05/2024 @ 08:39
Bonjour
très bon tuto
j'essaye de créer une barre de menu personnalisée
voici le code
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
rien ne s'affiche
pouvez vous m'aider
Pierre
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