MS Office - Comment créer un ruban dans Excel
Guide pas à pas pour créer un ruban Excel personnalisé en VBA. Utilisez XML et VBA pour ajouter vos propres onglets, groupes, boutons et fonctionnalités à vos classeurs Excel.
Traduction automatique
Cet article fait partie de la série VBA et automatisation de MS Office :
- MS Office - Comment créer un ruban dans Excel
- MS Excel - Comment appeler un web service SOAP
- Comment optimiser une base de données MS Access existante
- VBS - Récupérer la liste des champs d'une base de données MS Access
- VBS - Script d'auto-mise à jour
- Microsoft Outlook - VBA - Enregistrer des emails en PDF
- VBS - Obtenir la liste des fichiers et générer un CSV
- MS Office - Charger une liste déroulante depuis une plage Excel
- Exporter les objets MS Access
- MS Excel - Obtenir la liste des références utilisées dans vos modules
Journal des modifications

Cet article montre comment construire un ruban Excel personnalisé avec l'outil gratuit CustomOfficeUIEditor et du XML écrit à la main (le manifeste customUI14.xml) : définir des onglets, des groupes et des contrôles comme des boutons ou des zones de saisie, relier leurs événements onAction/onChange à des subroutines VBA de callback, et trouver les identifiants d'icônes standard imageMso à utiliser sur les boutons.
Dans cet article, nous allons apprendre à créer un ruban (c'est-à-dire une barre d'outils) dans Microsoft Excel.
Nous allons créer notre ruban personnalisé pour un fichier Excel et l'enregistrer dans le fichier, afin que nos utilisateurs disposent d'une interface agréable et intuitive pour travailler avec notre feuille de calcul.
Un ruban n'est utile que si ses boutons font quelque chose d'intéressant. Pour un exemple concret, MS Excel - Se connecter à une base de données SQL Server, exécuter une query et récupérer les résultats vous donne le VBA derrière un bouton « Rafraîchir les données ».
Ce que nous allons construire
Voici le résultat final : notre propre onglet, dans Excel, avec un bouton et un champ de saisie.
Le bouton est relié à une subroutine VBA : cliquer dessus exécute votre code.
L'ensemble tient dans une quinzaine de lignes de XML stockées dans le classeur. Quiconque ouvre votre fichier .xlsm obtient le ruban ; il n'y a rien à installer sur sa machine.
Pourquoi ça fonctionne
- Un fichier
.xlsx/.xlsmn'est pas un blob binaire : c'est une archive ZIP contenant des fichiers et des dossiers. Vous pouvez en ouvrir un avec 7-Zip et regarder ce qu'il y a dedans. - Ajouter un ruban revient à ajouter un fichier à cette archive : un manifeste appelé
customUI14.xml, qui décrit en XML les onglets, les groupes et les contrôles. - Quand MS Office ouvre le classeur, il lit ce manifeste, dessine le ruban et, à chaque clic, appelle la subroutine VBA nommée dans l'attribut
onActiondu contrôle. Votre macro et votre interface sont donc stockées dans un seul et même fichier.
Téléchargez l'éditeur gratuitement
Pour pouvoir créer « facilement » un ruban dans MS Office (dans une interface qui n'est pas WYSIWYG), j'utilise un outil très ancien appelé CustomOfficeUIEditor. Jusqu'ici, je n'ai trouvé aucun autre outil gratuit pour faire ça.
L'outil peut être téléchargé depuis https://bettersolutions.com/vba/ribbon/custom-ui-editor-download.htm.
CustomOfficeUIEditor est un outil externe (en dehors de MS Office) qui peut ouvrir un fichier Office et y ajouter les fichiers nécessaires à la création d'un ruban. Il est possible de le faire sans éditeur, par exemple avec un logiciel comme 7-Zip, puisqu'un fichier .xlsx / .xlsm est une archive avec des fichiers et des dossiers.
Pour cet exercice, extrayez tous les fichiers et dossiers dans votre dossier C:\tmp\ribbon (créez-le).
Créez un fichier vide
Comme support pour cet article, créez un nouveau fichier vide dans Excel, appelé Ribbon.xlsm, dans votre dossier C:\tmp\ribbon (ou ailleurs).

Créez juste un fichier vide
Pour l'instant, rien d'autre à faire que Fichier - Nouveau - Enregistrer sous - Type de fichier - Classeur Excel (prenant en charge les macros).
Ajoutez un ruban dans MS Office
L'outil CustomOfficeUIEditor n'est pas très convivial : vous devrez taper vous-même le XML du ruban. Ce XML est aussi appelé le fichier manifeste.
Par défaut, un document MS Office standard ne contient aucun ruban. Donc, quand vous ouvrez un tel fichier avec l'outil CustomOfficeUIEditor, vous obtenez un document vide.
Outlook est l'exception : là, aucun XML n'est nécessaire puisque la boîte de dialogue intégrée Personnaliser le ruban peut héberger un bouton de macro, comme dans Microsoft Outlook - VBA - Enregistrer des emails en PDF.
Démarrez CustomOfficeUIEditor et ouvrez votre fichier Ribbon.xlsm :

Fermez-le d'abord s'il est encore ouvert dans Excel
Quand vous utilisez l'éditeur, le fichier ne peut pas être ouvert dans Excel en même temps ! Imaginez la situation suivante : le classeur est ouvert à la fois dans l'éditeur et dans Excel. Vous faites beaucoup de modifications dans Excel, passez à l'éditeur et changez le manifeste. En sauvegardant le fichier dans l'éditeur, vous perdrez toutes les modifications faites dans Excel donc... prudence.
La première fois, vous devrez ajouter un nouveau ruban : cliquez sur le menu Insert et sélectionnez Office 2010 Custom UI Part.
Vous obtiendrez alors un écran comme celui-ci :
Quand customUI14.xml est sélectionné (comme illustré ci-dessus), cliquez quelque part dans le volet de droite et commencez à écrire votre XML.
Maintenant, dans le volet de droite, copiez/collez simplement la source XML ci-dessous :
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"> <ribbon> <tabs> <tab id="customTab" insertAfterMso="TabView" label="Tab"> <group id="customGroup" label="Group"> <button id="customButton" label="Button" imageMso="HappyFace" size="large" onAction="OnButtonClicked" /> <editBox id="customEditBox" label="Edit Box" onChange="OnEditBoxTextChanged" /> </group> </tab> </tabs> </ribbon></customUI>Ce fichier XML définit une interface personnalisée pour le ruban Office, en ajoutant un onglet customisé nommé « Tab » après l'onglet View. Cet onglet contient un groupe avec un bouton qui affiche une icône smiley et une zone de texte modifiable, chacun connecté à des fonctions de rappel qui s'exécutent lors des interactions utilisateur.

Avant d'enregistrer votre fichier, n'oubliez pas de cliquer sur le bouton Validate : un contrôle est effectué pour vérifier la qualité du contenu.

Le ruban étant correct, enregistrez le fichier et ouvrez-le dans Excel. Si tout se passe bien, vous obtiendrez ceci :

Votre ruban a été créé
Félicitations, vous avez ajouté un ruban à votre classeur. Ce n'était pas trop difficile, je crois.
Sous le capot — le manifeste, balise par balise (sautez ceci si vous voulez juste un ruban)
Il est temps de comprendre ce qui s'est passé...
Le nœud racine customUI et le namespace
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">Ce fichier XML définit l'interface utilisateur personnalisée pour une application Microsoft Office. Il utilise l'espace de noms customUI pour décrire les éléments d'interface que tu veux ajouter ou modifier dans le ruban Office.
Le manifeste est un contenu XML et doit être valide. Vous devez définir votre contenu dans un nœud <customUI> (obligatoire) et spécifier l'attribut xmlns (pour namespace) (obligatoire).
Le fichier de namespace définit quels attributs existent, obligatoires ou non, pour chaque type de nœud. L'URL référencée est la Document Type Definition (aussi appelée DTD).
Par exemple, quand l'utilisateur cliquera sur le bouton de votre ruban, vous voudrez pouvoir capter le clic et démarrer une subroutine que vous avez codée en VBA. L'« événement on click » doit être défini dans l'attribut onAction, comme prévu par la DTD. Microsoft maintient la documentation ici : https://msdn.microsoft.com/en-us/library/dd909370(v=office.12).aspx.
Donc, si vous savez que l'attribut est onAction, vous pouvez ajouter votre propre subroutine en écrivant quelque chose comme onAction="OnButtonClicked".
Le rôle de la DTD est de s'assurer que la syntaxe de votre manifeste est correcte ; l'attribut xmlns="http://schemas.microsoft.com/office/2009/07/customui" est donc bel et bien obligatoire.
Définir le ruban
Le ruban doit être défini dans le nœud <ribbon>, mais pas immédiatement, car un ruban est en fait toujours défini dans un onglet.
Ci-dessous, on voit le ruban standard d'Excel avec beaucoup d'onglets : Fichier, Insertion, Mise en page, Formules, Données, Révision, Affichage, ...

Chaque onglet propose des fonctionnalités (boutons, cases à cocher, ...). Pour l'onglet Insertion, nous avons d'abord un groupe de trois boutons dans un groupe appelé Tableaux :
Donc, pour un ruban, il faut :
- Le définir dans un onglet (le vôtre ou un onglet existant)
- Ajouter des fonctionnalités dans un ou plusieurs groupes (vos groupes ou des groupes existants)
Voici notre manifeste à présent, avec la définition du ruban.
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"> <!-- highlight-next-line --> <ribbon> <!-- highlight-next-line --> <tabs> <!-- highlight-next-line --> <tab id="customTab" insertAfterMso="TabView" label="Tab"> <!-- highlight-next-line --> <group id="customGroup" label="Group"> <!-- highlight-next-line --> YOUR FEATURES HERE <!-- highlight-next-line --> </group> <!-- highlight-next-line --> </tab> <!-- highlight-next-line --> </tabs> <!-- highlight-next-line --> </ribbon></customUI>Ce fichier XML définit une interface utilisateur personnalisée pour Microsoft Office en créant un nouvel onglet dans le ruban (ribbon). L'onglet s'insère après l'onglet View existant et contient un groupe vide où tu peux ajouter tes propres contrôles et fonctionnalités.
Définir l'onglet
Vous devez donner un identifiant à l'onglet (dans l'attribut id) : votre propre code pour un nouvel onglet ou l'id d'un onglet existant.
Les noms standard sont :
TabHomeTabInsertTabPageLayoutExcelTabFormulasTabDataTabReviewTabViewTabDeveloper
Donc, si vous voulez ajouter un bouton à l'onglet Accueil, utilisez simplement TabHome comme valeur de id, par exemple :
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"> <ribbon> <tabs> <!-- highlight-next-line --> <tab id="TabHome"> <!-- highlight-next-line --> ADD A BUTTON TO TabHome <!-- highlight-next-line --> </tab> </tabs> </ribbon></customUI>Ce fichier XML définit une interface utilisateur personnalisée pour Office en utilisant le schéma customUI. Il crée un ruban avec un onglet nommé TabHome, où on peut ajouter des boutons et d'autres contrôles pour étendre les fonctionnalités de l'application Office.
Le XML ci-dessous va, en une ligne :
- Créer un nouvel onglet puisque l'id
customTabn'est pas un id existant, - Placer le nouvel onglet après l'onglet
Affichageexistant (utilisezinsertBeforeMsopour l'ajouter avant), - Et lui donner
Tabcomme libellé.
<tab id="customTab" insertAfterMso="TabView" label="Tab">Cet extrait définit un élément XML pour un onglet personnalisé nommé customTab. L'onglet sera inséré après TabView dans l'interface et porte le label « Tab » qui s'affichera à l'utilisateur.
Voici notre onglet ajouté :
Implémenter notre ruban
Dans la déclaration <tab>, vous devez définir au moins un <group>. Et ici aussi, vous devrez définir l'identifiant : un identifiant existant pour, par exemple, ajouter un bouton dans un groupe existant, ou un nouveau pour créer un nouveau groupe.
Le XML ci-dessous va :
- Créer un nouveau groupe puisque l'id est nouveau (
customGroup), - Et lui donner
Groupcomme nom.
<group id="customGroup" label="Group">Cet extrait définit un élément XML nommé group avec un identifiant unique customGroup et un libellé affiché Group. C'est probablement la déclaration d'un conteneur ou d'une catégorie dans une structure de configuration ou d'interface utilisateur.
Notre onglet avec son groupe :
Comme vous le voyez ci-dessus, ajouter un groupe ne suffit pas : vous devez définir quelles fonctionnalités (boutons, cases à cocher, ...) doivent être ajoutées dans le groupe.
Ajouter des fonctionnalités
Le XML ci-dessous va ajouter deux choses : un bouton et une zone de saisie.
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"> <ribbon> <tabs> <tab id="customTab" insertAfterMso="TabView" label="Tab"> <group id="customGroup" label="Group"> <!-- highlight-next-line --> <button <!-- highlight-next-line --> id="customButton" <!-- highlight-next-line --> label="Button" <!-- highlight-next-line --> imageMso="HappyFace" <!-- highlight-next-line --> size="large" <!-- highlight-next-line --> onAction="OnButtonClicked" /> <!-- highlight-next-line --> <editBox <!-- highlight-next-line --> id="customEditBox" <!-- highlight-next-line --> label="Edit Box" <!-- highlight-next-line --> onChange="OnEditBoxTextChanged" /> </group> </tab> </tabs> </ribbon></customUI>Ce fichier XML configure l'interface personnalisée du ruban Office, en ajoutant un nouvel onglet appelé 'Tab' après l'onglet View qui contient un groupe avec un bouton et une zone de texte. Chaque élément est configuré avec des identifiants, des étiquettes visibles et des fonctions de rappel qui seront exécutées quand l'utilisateur interagit avec ces contrôles.
Le XML ci-dessous va créer un bouton :
- Avec un
idinitialisé àcustomButton, - Son libellé (le texte affiché sous le bouton) défini à
Button, - Utilisant l'image standard
HappyFace(imageMsoest en effet la manière de réutiliser une image standard, tandis queimagevous permet de définir la vôtre), - La taille du bouton sera
large(un grand bouton), - L'action assignée sera la fonction VBA appelée
OnButtonClicked.
<button id="customButton" label="Button" imageMso="HappyFace" size="large" onAction="OnButtonClicked" />Ce snippet définit un bouton personnalisé pour une interface utilisateur, probablement dans un contexte de ruban Office ou similaire. Le bouton affiche une étiquette « Button » avec une icône souriante, occupe l'espace large, et déclenche la fonction OnButtonClicked quand l'utilisateur clique dessus.
Ce qui donne ceci :

OnButtonClicked est le callback VBA : pour le faire fonctionner, ajoutez un module dans votre fichier Excel et créez une subroutine comme celle-ci :
Public Sub OnButtonClicked(control As IRibbonControl)
MsgBox "You've clicked on the button", vbInformation
End Sub
Pour ce faire, dans MS Excel, appuyez sur ALT-F11, puis dans l'Explorateur de projet, faites un clic droit sur l'entrée VBAProject (Ribbon.xlsm) (1), sélectionnez Insertion (2) puis Module (3).

Un Module1 sera ajouté et, dans le volet de droite, copiez/collez le code donné ci-dessus puis enregistrez le fichier.

Maintenant, vous pouvez fermer la fenêtre Microsoft Visual Basic for Application, revenir à la fenêtre Excel habituelle et cliquer sur le bouton smiley : vous obtiendrez la boîte de message montrée dans la deuxième capture d'écran en haut de cet article.
Et nous pouvons ajouter d'autres fonctionnalités, comme une zone de saisie :
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"> <ribbon> <tabs> <tab id="customTab" insertAfterMso="TabView" label="Tab"> <group id="customGroup" label="Group"> <button id="customButton" label="Button" imageMso="HappyFace" size="large" onAction="OnButtonClicked" /> <!-- highlight-next-line --> <editBox <!-- highlight-next-line --> id="customEditBox" <!-- highlight-next-line --> label="Edit Box" <!-- highlight-next-line --> onChange="OnEditBoxTextChanged" /> </group> </tab> </tabs> </ribbon></customUI>Ce fichier XML définit une interface de ruban personnalisée pour Microsoft Office. Il crée un onglet nommé « Tab » contenant un groupe avec un bouton et une zone de texte éditable, chacun configuré pour déclencher des actions spécifiques quand l'utilisateur interagit avec eux.
Enregistrez, réouvrez le fichier, et votre onglet ressemble maintenant à la toute première capture d'écran de cet article.
La liste des propriétés dépend du type : pour un bouton, nous avons un attribut onAction, alors que c'est onChange pour un editBox.
Liste des objets
Comme défini de manière exhaustive dans le namespace du ruban, voici la liste des objets valides :
box,button,buttonGroup,checkBox,control,comboBox,dropDown,dynamicMenu,editBox,gallery,labelControl,menu,splitButtonettoggleButton
Attention : le XML est sensible à la casse, editBox est la seule syntaxe valide, editbox ou EditBox ne le sont pas.
Chaque objet a ses propres attributs, certains obligatoires, les autres optionnels.
Trouver des images
En ajoutant un bouton par exemple, vous lui assignerez une image.
Vous utiliserez très probablement une image standard existante. C'est possible avec l'attribut imageMso, en indiquant à Office quelle image utiliser ; par exemple AddFolderToFavorites :
Le manifeste est celui-ci :
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"> <ribbon> <tabs> <tab idMso="TabHome" visible="false" /> <tab id="customTab" insertAfterMso="TabView" label="Tab"> <group id="customGroup" label="Group"> <button id="customButton" label="Button" <!-- highlight-next-line --> imageMso="AddFolderToFavorites" size="large" onAction="OnButtonClicked" /> </group> </tab> </tabs> </ribbon></customUI>Ce fichier XML définit une interface utilisateur personnalisée pour Office, en modifiant le ruban (ribbon). Il masque l'onglet Accueil standard, ajoute un nouvel onglet personnalisé après l'onglet Affichage, contenant un groupe avec un bouton qui déclenche une action quand on clique dessus.
Mais ... comment récupérer la liste des images ?
Microsoft maintient des fichiers Excel avec la liste des IDs existants utilisables comme icônes dans notre ruban. Les Office Fluent User Interface Control Identifiers sont maintenus sur le repository GitHub OfficeDev (versions actuelles pour toutes les éditions d'Office). Vous obtiendrez des fichiers Excel, un par application (Access, Excel, Outlook, ...).
Cela vous donnera la liste des IDs existants en texte brut, mais vous ne verrez pas les images associées.
Vous pouvez télécharger toutes les images (en PNG) pour MS Office depuis le repository GitHub ImageMso (8 899 icônes, avec un Add-In Excel intégré pour les parcourir).
Assigner des callbacks
Ce terme signifie : quel code (du VBA dans ce cas) doit être déclenché quand un événement est levé.
Quand l'utilisateur clique sur un bouton du ruban, quelle subroutine doit être appelée ?
Le code XML ci-dessous assigne la subroutine OnButtonClicked à l'événement onAction du bouton.
<button id="customButton" label="Button" imageMso="AddFolderToFavorites" size="large" onAction="OnButtonClicked" />Ce snippet définit un bouton personnalisé pour une interface utilisateur, probablement dans un contexte Office ou similaire. Le bouton affiche une icône intégrée, possède une taille large, et déclenche une action nommée OnButtonClicked quand on clique dessus.
Donc, si nous voulons capturer cet événement, nous devrons ajouter une subroutine publique dans notre fichier Excel. Cette subroutine peut être placée dans n'importe quel module, doit être publique et doit s'appeler OnButtonClicked.
Mais... selon les callbacks (click, change, toggle state, change, ...), la définition de la subroutine n'est pas la même.
Pour un bouton, le VBA ressemblera à ceci :
Public Sub OnButtonClicked(control As IRibbonControl)
' YOUR CODE
End Sub
Pour une zone de saisie et l'événement onChange, le callback est différent :
<editBox id="customEditBox" label="Edit Box" onChange="OnEditBoxTextChanged" />Cet élément XML définit une boîte de texte éditable avec un identifiant unique et un gestionnaire d'événement. Quand l'utilisateur modifie le texte, la fonction OnEditBoxTextChanged est appelée automatiquement.
Public Sub OnEditBoxTextChanged(control As IRibbonControl, sText As String)
' YOUR CODE
End Sub
La déclaration des callbacks se trouve sur le site officiel :
How can I determine the correct signatures for each callback procedure?. Faites attention aux colonnes Signatures ; vous devez chercher VBA.
Conclusion
Un classeur où il fallait auparavant « ouvrir l'éditeur VBA, trouver la macro, l'exécuter » a maintenant son propre onglet avec de vrais boutons ; et tout est stocké dans le fichier .xlsm, donc ça suit le classeur partout. Les deux choses à retenir : le manifeste est customUI14.xml dans l'archive, et chaque contrôle pointe vers une subroutine VBA publique via onAction (ou onChange).
Une fois votre ruban en place, une étape suivante fréquente consiste à alimenter un de ses contrôles (comme une liste déroulante) avec des données issues directement de votre feuille de calcul — voir MS Office - Charger une liste déroulante depuis une plage Excel. Et pour donner à vos boutons quelque chose qui vaille le clic, MS Excel - Connect to a SQL Server database est un bon endroit pour continuer.
Cet article fait partie de la série VBA et automatisation de MS Office :
- MS Office - Comment créer un ruban dans Excel
- MS Excel - Comment appeler un web service SOAP
- Comment optimiser une base de données MS Access existante
- VBS - Récupérer la liste des champs d'une base de données MS Access
- VBS - Script d'auto-mise à jour
- Microsoft Outlook - VBA - Enregistrer des emails en PDF
- VBS - Obtenir la liste des fichiers et générer un CSV
- MS Office - Charger une liste déroulante depuis une plage Excel
- Exporter les objets MS Access
- MS Excel - Obtenir la liste des références utilisées dans vos modules




