113 votes

Comment ajouter un onglet Ruban personnalisé en utilisant VBA ?

Je cherche un moyen d'ajouter un onglet personnalisé dans le ruban Excel qui contiendrait quelques boutons. J'ai trouvé quelques ressources à ce sujet via Google mais elles semblent toutes louches et outrageusement compliquées.

Quelle est la manière rapide et simple de le faire ? J'aimerais que le nouvel onglet se charge lorsque mon VBA se charge dans Excel..

MISE À JOUR : J'ai essayé cet exemple de ici mais j'obtiens une erreur "objet requis" sur la dernière instruction :

Public Sub AddHighlightRibbon()
Dim ribbonXml As String

ribbonXml = ""
ribbonXml = ribbonXml + "  "
ribbonXml = ribbonXml + "    "
ribbonXml = ribbonXml + "    "
ribbonXml = ribbonXml + "      "
ribbonXml = ribbonXml + "        "
ribbonXml = ribbonXml + "          "
ribbonXml = ribbonXml + "        "
ribbonXml = ribbonXml + "      "
ribbonXml = ribbonXml + "    "
ribbonXml = ribbonXml + "  "
ribbonXml = ribbonXml + ""

ActiveProject.SetCustomUI (ribbonXml)
End Sub

0 votes

Veuillez confirmer la version d'Excel que vous utilisez ?

0 votes

Cela est pour le Projet.

156voto

Siddharth Rout Points 63935

À ma connaissance, vous ne pouvez pas utiliser VBA Excel pour créer un onglet personnalisé dans le ruban Excel. Cependant, vous pouvez masquer/rendre visible un composant du ruban en utilisant VBA. De plus, le lien que vous avez mentionné ci-dessus est pour MS Project et non MS Excel.

Je crée des onglets pour mes applications/compléments Excel en utilisant cet utilitaire gratuit appelé Custom UI Editor.


Éditer : Pour répondre à la nouvelle demande de l'OP

Tutoriel

Voici un court tutoriel comme promis :

  1. Après avoir installé le Custom UI Editor (CUIE), ouvrez-le puis cliquez sur Fichier | Ouvrir et sélectionnez le fichier Excel pertinent. Assurez-vous que le fichier Excel est fermé avant de l'ouvrir via CUIE. Je vais utiliser une nouvelle feuille de calcul comme exemple.

saisissez la description de l'image ici

  1. Cliquez avec le bouton droit de la souris comme indiqué dans l'image ci-dessous et cliquez sur "Office 2007 Custom UI Part". Il insérera le "customUI.xml"

saisissez la description de l'image ici

  1. Ensuite, cliquez sur le menu Insertion | Exemple XML | Onglet personnalisé. Vous verrez que le code de base est automatiquement généré. Maintenant, vous êtes prêt à le modifier selon vos besoins.

saisissez la description de l'image ici

  1. Examinons le code

saisissez la description de l'image ici

label="Custom Tab" : Remplacez "Custom Tab" par le nom que vous souhaitez donner à votre onglet. Pour l'instant, appelons-le "Jerome".

La partie ci-dessous ajoute un bouton personnalisé.

Démonstration

Avec cela, créons 2 boutons et appelons-les "JG Button 1" et "JG Button 2". Gardons le visage souriant comme image du premier et gardons le "Soleil" pour le second. Le code modifié ressemble maintenant à ceci :

Supprimez tout le code qui a été généré dans CUIE, puis collez le code ci-dessus à la place. Enregistrez et fermez CUIE. Maintenant, lorsque vous ouvrez le fichier Excel, cela ressemblera à ceci :

saisissez la description de l'image ici

Maintenant la partie du code. Ouvrez l'Éditeur VBA, insérez un module et collez ce code :

Public Sub Callback1(control As IRibbonControl)

    MsgBox "Vous avez appuyé sur le visage souriant"

End Sub

Public Sub Callback2(control As IRibbonControl)

    MsgBox "Vous avez appuyé sur le Soleil"

End Sub

Enregistrez le fichier Excel en tant que fichier activé par macro. Maintenant, lorsque vous cliquez sur le Visage Souriant ou le Soleil, vous verrez la boîte de dialogue pertinente :

saisissez la description de l'image ici

0 votes

Vient de télécharger la chose. Recommandez-vous une page d'exemple ?

7 votes

Oui :) Ron a beaucoup d'exemples sur son site web. rondebruin.nl/ribbon.htm

0 votes

D'accord, j'ai un premier exemple en cours d'exécution. Mais le XML fourni doit être ajouté dans l'onglet "Accueil". Comment ajouter un onglet avec un nom choisi ? J'ai essayé de jouer avec ça mais je n'arrive pas à en faire apparaître un.

36voto

Roi-Kyi Bryant Points 472

J'ai pu accomplir ceci avec VBA dans Excel 2013. Aucun éditeur spécial n'est nécessaire. Tout ce dont vous avez besoin est l'éditeur de code Visual Basic qui peut être accédé dans l'onglet Développeur. L'onglet Développeur n'est pas visible par défaut donc il faut l'activer dans Fichier>Options>Personnaliser le ruban. Sur l'onglet Développeur, cliquez sur le bouton Visual Basic. L'éditeur de code va s'ouvrir. Faites un clic droit dans le volet Explorateur de projets sur la gauche. Cliquez sur le menu Insertion et choisissez module. Ajoutez les deux sous-programmes ci-dessous dans le nouveau module.

Sub LoadCustRibbon()

Dim hFile As Long
Dim path As String, fileName As String, ribbonXML As String, user As String

hFile = FreeFile
user = Environ("Username")
path = "C:\Users\" & user & "\AppData\Local\Microsoft\Office\"
fileName = "Excel.officeUI"

ribbonXML = "" & vbNewLine
ribbonXML = ribbonXML + "  " & vbNewLine
ribbonXML = ribbonXML + "    " & vbNewLine
ribbonXML = ribbonXML + "    " & vbNewLine
ribbonXML = ribbonXML + "      " & vbNewLine
ribbonXML = ribbonXML + "        " & vbNewLine
ribbonXML = ribbonXML + "          " & vbNewLine
ribbonXML = ribbonXML + "        " & vbNewLine
ribbonXML = ribbonXML + "      " & vbNewLine
ribbonXML = ribbonXML + "    " & vbNewLine
ribbonXML = ribbonXML + "  " & vbNewLine
ribbonXML = ribbonXML + ""

ribbonXML = Replace(ribbonXML, """", "")

Open path & fileName For Output Access Write As hFile
Print #hFile, ribbonXML
Close hFile

End Sub

Sub ClearCustRibbon()

Dim hFile As Long
Dim path As String, fileName As String, ribbonXML As String, user As String

hFile = FreeFile
user = Environ("Username")
path = "C:\Users\" & user & "\AppData\Local\Microsoft\Office\"
fileName = "Excel.officeUI"

ribbonXML = "" & _
""

Open path & fileName For Output Access Write As hFile
Print #hFile, ribbonXML
Close hFile

End Sub

Appelez le sous-programme LoadCustRibbon dans l'événement Ouvrir le classeur et appelez le sous-programme ClearCustRibbon dans l'événement Avant_fermer du fichier de code ThisWorkbook.

0 votes

Cela a fonctionné pour moi mais avec seulement quelques problèmes mineurs rencontrés. 1) Si je gardais l'événement Before_Close, le nouveau ruban ne se chargeait pas. 2) Lorsque j'ai réussi à faire fonctionner le ruban en supprimant l'événement Before_Close, j'ai dû recharger Excel avant qu'il n'apparaisse. Si vous pouviez me conseiller sur la raison de ce problème, ce serait génial!

0 votes

Le code est-il exactement le même? Pouvez-vous le poster? L'idée est qu'Excel doit modifier le fichier standard du ruban avant que le ruban ne soit chargé et le réinitialiser avant la fermeture du classeur. La réinitialisation du ruban est nécessaire pour qu'il ne s'affiche pas dans d'autres classeurs.

4 votes

Ce code écrase toutes les personnalisation du ruban que l'utilisateur a pu faire précédemment.

29voto

Jan Wijninckx Points 71

J'ai lutté comme un fou, mais c'est en réalité la bonne réponse. Pour ce que cela vaut, ce que j'ai manqué était ceci :

  1. Comme d'autres le disent, on ne peut pas créer le ruban CustomUI avec VBA, cependant, vous n'en avez pas besoin !
  2. L'idée est que vous créez votre code Ribbon xml en utilisant Personnaliser le ruban dans Fichier > Options d'Excel, puis exportez le Ruban vers un fichier .customUI (c'est juste un fichier txt, avec xml dedans)
  3. Arrive alors le tour de magie : vous pouvez inclure le code .customUI dans votre fichier .xlsm en utilisant l'outil MS auquel ils font référence ici, en copiant le code du fichier .customUI
  4. Une fois inclus dans le fichier .xlsm, chaque fois que vous l'ouvrez, le ruban que vous avez défini est ajouté au ruban de l'utilisateur - mais utilisez sinon vous perdez le reste du ruban. En quittant le classeur, le ruban est supprimé.
  5. À partir de là, c'est simple, créez votre ruban, copiez le code xml spécifique à votre ruban du fichier .customUI, et placez-le dans un wrapper comme indiqué ci-dessus (...votre xml

Soit dit en passant, la page qui l'explique sur le site de Ron est maintenant à http://www.rondebruin.nl/win/s2/win002.htm

Et voici son exemple sur comment activer/désactiver des boutons sur le Ruban http://www.rondebruin.nl/win/s2/win013.htm

Pour d'autres exemples de rubans en xml, veuillez également consulter http://msdn.microsoft.com/en-us/library/office/aa338202%28v=office.12%29.aspx

4 votes

Encore (5 ans plus tard) la meilleure réponse à mon avis et peut-être que @BuZz aimerait rafraîchir la publication originale, au moins en pointant vers cette réponse(?). Je l'ai à peine trouvée car elle se trouvait au bas d'une liste plutôt longue de réponses.

21voto

Jomtung Points 28

Les réponses ici sont spécifiques à l'utilisation de l'Éditeur d'interface utilisateur personnalisé. J'ai passé du temps à créer l'interface sans ce merveilleux programme, donc je documente la solution ici pour aider quiconque à décider s'il a besoin ou non de cet éditeur d'interface utilisateur personnalisé.

J'ai trouvé la page d'aide Microsoft suivante - https://msdn.microsoft.com/en-us/library/office/ff861787.aspx. Cela montre comment configurer l'interface manuellement, mais j'ai eu quelques problèmes lorsque je pointais vers mon code complémentaire personnalisé.

Pour que les boutons fonctionnent avec vos macros personnalisées, configurez la macro dans vos sous-dossiers .xlam à appeler comme décrit dans cette réponse SO - Appeler une macro Excel depuis le ruban. Fondamentalement, vous devrez ajouter ce paramètre "control As IRibbonControl" à n'importe quel module pointé depuis votre xml de ruban. De plus, votre xml de ruban doit avoir la syntaxe onAction="myaddin!mymodule.mysub" pour appeler correctement tous les modules chargés par le complément.

En suivant ces instructions, j'ai pu créer un complément Excel (.xlam) qui a un onglet personnalisé chargé lorsque mon VBA est chargé dans Excel avec le complément. Les boutons exécutent du code à partir du complément et l'onglet personnalisé se désinstalle lorsque je supprime le complément.

1 votes

Cela fonctionne pour ceux d'entre nous qui n'ont pas tous les outils de développement. Merci pour la solution "simple"

2 votes

J'avais l'habitude d'enseigner cette méthode à mes étudiants en programmation de deuxième année, mais j'ai finalement trouvé que l'utilisation de l'outil CustomUI est tout simplement moins compliquée si vous pouvez y accéder.

10voto

Erikas Points 746

En plus de la réponse de Roi-Kyi Bryant, ce code fonctionne parfaitement dans Excel 2010. Appuyez sur ALT + F11 et l'éditeur VBA apparaîtra. Double-cliquez sur ThisWorkbook sur le côté gauche, puis collez ce code:

Private Sub Workbook_Activate()

Dim hFile As Long
Dim path As String, fileName As String, ribbonXML As String, user As String

hFile = FreeFile
user = Environ("Username")
path = "C:\Users\" & user & "\AppData\Local\Microsoft\Office\"
fileName = "Excel.officeUI"

ribbonXML = "" & vbNewLine
ribbonXML = ribbonXML + "  " & vbNewLine
ribbonXML = ribbonXML + "    " & vbNewLine
ribbonXML = ribbonXML + "    " & vbNewLine
ribbonXML = ribbonXML + "      " & vbNewLine
ribbonXML = ribbonXML + "        " & vbNewLine
ribbonXML = ribbonXML + "          " & vbNewLine
ribbonXML = ribbonXML + "        " & vbNewLine
ribbonXML = ribbonXML + "      " & vbNewLine
ribbonXML = ribbonXML + "    " & vbNewLine
ribbonXML = ribbonXML + "  " & vbNewLine
ribbonXML = ribbonXML + ""

ribbonXML = Replace(ribbonXML, """", "")

Open path & fileName For Output Access Write As hFile
Print #hFile, ribbonXML
Close hFile

End Sub

Private Sub Workbook_Deactivate()

Dim hFile As Long
Dim path As String, fileName As String, ribbonXML As String, user As String

hFile = FreeFile
user = Environ("Username")
path = "C:\Users\" & user & "\AppData\Local\Microsoft\Office\"
fileName = "Excel.officeUI"

ribbonXML = "" & _
""

Open path & fileName For Output Access Write As hFile
Print #hFile, ribbonXML
Close hFile

End Sub

N'oubliez pas de sauvegarder et de rouvrir le classeur. J'espère que cela vous aidera!

0 votes

Comment passer des arguments avec ceci ? J'ai utilisé ceci, mais je ne trouve pas de moyen de passer des arguments.

0 votes

En utilisant ma réponse, vous ajouteriez une liste d'arguments à chaque sous-routine. Quelque chose comme LoadCustomRibbon (tabName as String, groupName as String, btnName as String). Ensuite, appelez ces sous-routines à l'endroit approprié comme @Erikas l'a souligné.

0 votes

Cette solution fonctionne telle quelle dans Microsoft 365 Excel. +1 @erikas

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X