CathyAstuce

VBA

GEMCCAP CONSEIL INFORMATIQUE BUREAUTIQUE
Formation - Conception Sites Internet
Applications Informatiques Personnalisées
Communauté partenaire Microsoft

LES CONTRÔLES DES BARRES D'OUTILS

La collection Ajouter/supprimer une barre Modifer un contrôle Une zone de texte Une liste déroulante

Remonter I. La collection

Vous avez enfin ajouté une barre d'outils personnalisées, mais sans boutons ou autres contrôles, elle est bien inutile. En général, vous ajoutez un bouton, mais vous pouvez également ajouter une zone de liste modifiable, une zone de texte ou un sous-menu personnalisé.
L'ensemble de ces contrôles est désigné par la collection CommandBarControls.

Remonter II. 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

     Set MaBarre = CommandBars.Add("BarrePerso") 'ajoute une barre d'outils
     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 couper à la barre
     Set NouvBtn = MaBarre.Controls.Add(msoControlButton, Application.CommandBars("Standard").Controls("Coller").ID)  'ajoute le bouton coller à la barre
     MaBarre.Visible = True 'affiche la barre
End Sub

Pour supprimer un contrôle :

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

Remonter III. Modifier un contrôle

Après avoir ajouté un bouton personnalisé, il vous faut également indiquer son étiquette (caption), son image, son état (enfoncé ou relevé), son style, une référence pour le retrouver ensuite et surtout la procédure qui devra s'exécuter lorsque l'on clique dessus. Dans ce cas vous devez lors de la création du contrôle l'affecter à une variable ainsi :

     Dim MaBarre As CommandBar
     Dim NouvBtn As CommandBarButton

     Set MaBarre = CommandBars.Add("BarrePerso") 'ajoute une barre d'outils
     Set NouvBtn = MaBarre.Controls.Add

Maintenant vous pouvez affecter les différentes propriétés que vous voulez :

     With NouvBtn
          .Caption = "Mon bouton"                       'texte affiché sur le bouton
          .FaceId = 59                                      ' n° de l'image
          .OnAction = "Ma_macro"                       ' macro lancé au moment du clic sur le bouton
          .State = msoButtonUp                         ' le bouton est relevé
          .Style = msoButtonIconAndCaptionBelow 'le texte s'affiche sous l'icône
          .Tag = "btn1"                                     'paramètre qui sert à retrouver ensuite le bouton dans le code
          .TooltipText = "ceci est la bulle d'aide"   'texte de la bulle d'aide
     End With

Ce qui nous donne cette procédure :

Sub NouvBarre()
     Dim MaBarre As CommandBar
     Dim NouvBtn As CommandBarButton

     Set MaBarre = CommandBars.Add("BarrePerso")
     Set NouvBtn = MaBarre.Controls.Add
     With NouvBtn
          .Caption = "Mon bouton"
          .FaceId = 59
          .OnAction = "Ma_macro"
          .State = msoButtonUp
          .Style = msoButtonIconAndCaptionBelow
          .Tag = "btn1"
          .TooltipText = "ceci est la bulle d'aide"
     End With
     MaBarre.Visible = True 'affiche la barre
End Sub

Sub Ma_macro()
     Dim MonBtn As CommandBarButton

     'ici vous mettez vos instructions
     ' et ces lignes met le bouton dans l'état inverse

     Set MonBtn = CommandBars("BarrePerso").FindControl(, , "btn1") 'le tag nous permet alors de retrouver le bouton, c'est le seul moyen pour un bouton personnalisé
     MonBtn.State = Not MonBtn.State
End Sub

Pour affecter une image à un bouton, vous pouvez :

  • copier l'image depuis un autre bouton puis lui coller
    Sub ChangeFace()
         Dim MonBtn As CommandBarButton, BtnCopie As CommandBarButton

         Set BtnCopie = CommandBars("Standard").FindControl(, CommandBars("Standard").Controls("Couper").ID)
         Set MonBtn = CommandBars("BarrePerso").FindControl(, , "btn1")
         BtnCopie.CopyFace   
    'copie de l'image du bouton
         MonBtn.PasteFace    
    'on colle sur le bouton
    End Sub
  • copier une image de 16x16 situé sur une feuille puis lui coller
    Sub ChangeFace()
         Dim MonBtn As CommandBarButton

         Set MonBtn = CommandBars("BarrePerso").FindControl(, , "btn1")
         ActiveSheet.Shapes(1).Copy
    'copie de l'image
         MonBtn.PasteFace              
    'on colle sur le bouton
    End Sub
  • attribuer un numéro d'image prédéfini. L'exemple suivant affiche sur une feuille toutes les images à votre disposition et leur numéro.
    Sub ChangeFace(iNo As Integer, strTag as String)
         Dim MonBtn As CommandBarButton

         Set MonBtn = CommandBars("BarrePerso").FindControl(, , strTag )
         MonBtn.FaceId = iNo
    End Sub

    Sub Essai()
         ChangeFace 1000, "btn1"
    End Sub

Remonter IV. 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 Sub

Sub 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

Remonter V. 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

AccueilDébut de la page