Chaque fois qu’un contrôle est ajouté à une barre de menus via le code, l’onglet Compléments devient visible et la nouvelle commande apparaît dans le groupe Commande de menu. Peu importe où la commande a été placée dans les anciennes versions d’Excel. Toutes les commandes ajoutées sont affichées dans l’ordre dans lequel elles ont été créées, de haut en bas et de gauche à droite.
En plus des applications existantes des versions antérieures d’Excel, il est toujours possible dans Excel de fournir à l’utilisateur des commandes définies par l’utilisateur via l’objet COMMANDBAR. Cette méthode nécessite uniquement que le fichier soit dans un format de fichier prenant en charge les macros (*xlam) sont enregistrés, car le code est toujours transporté avec le classeur.
Dans Excel, il n’y a plus de véritables barres de menus. Toutes les commandes créées sur différentes barres de menus sont placées dans le même groupe Commande de menu. Lors de la suppression de commandes individuelles, les références exactes lors de la création des contrôles individuels doivent être strictement respectées. Afin d’éviter d’éventuelles erreurs, il est conseillé de ne pas spécifier de barre de menu spéciale, mais de se référer à la barre de menu active à la fois lors de la création et de la suppression.
Application.CommandBars.ActiveMenuBar
Lors de la création d’un nouveau bouton, la valeur de l’argument temporaire facultatif doit être définie sur True pour créer temporairement le nouveau contrôle. Jusqu’à Excel inclus, les champs temporaires sont automatiquement supprimés à la fermeture de l’application Excel. Les contrôles non temporaires restent visibles après le redémarrage de l’application Excel jusqu’à ce qu’ils soient supprimés manuellement ou par code.
Public Sub AjouterCommandeMenu() Dim cmdBar As CommandBar Dim ctl As CommandBarButton Dim strCaption As String ' Barre de menus active Set cmdBar = Application.CommandBars.ActiveMenuBar ' Composer le nom et la désignation des boutons strCaption = "Bouton sur le " & cmdBar.Name ' Supprimer tout élément existant du même nom On Error Resume Next cmdBar.Controls(strCaption).Delete On Error GoTo 0 ' bouton d'insertion Set ctl = cmdBar.Controls.Add( _ Type:=msoControlButton, _ Temporary:=True) With ctl .Caption = strCaption .Style = msoButtonCaption .OnAction = "MaMacro" End With End Sub
Si l’utilisateur clique sur le bouton nouvellement créé, la procédure stockée dans la propriété OnAction est appelée.
Public Sub MaMacro() MsgBox "BONJOUR " & Application.UserName End Sub
La procédure ci-dessus affecte uniquement un texte de légende pour l’identification au nouveau bouton via la propriété Caption, ce qui rend les contrôles difficiles d’accès ultérieurement. Une identification plus simple des contrôles est obtenue en attribuant un texte unique à l’élément dans la propriété TAG. La commande de menu peut ensuite être référencée avec précision à l’aide de la méthode FindControl. Dans l’exemple suivant, la propriété de balise Mon Bouton est affectée au nouveau bouton. La propriété TAG permet l’utilisation de caractères spéciaux en plus des espaces.
Public Sub AjouterEtiqMenuCommande() Dim cmdBar As CommandBar Dim ctl As CommandBarControl Set cmdBar = Application.CommandBars.ActiveMenuBar ' Supprimer tout élément existant du même nom On Error Resume Next cmdBar.FindControl(Tag:="Mon Bouton").Delete On Error GoTo 0 ' bouton d'insertion Set ctl = cmdBar.Controls.Add( _ Type:=msoControlButton, _ Temporary:=True) With ctl .Tag = "Mon Bouton" .Caption = "Bouton avec étiquette" .Style = msoButtonCaption .OnAction = "MaMacro" End With End Sub