Gérer la collection CommandBar
La collection CommandBars 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