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.

9voto

Joshua Daly Points 366

J'ai rencontré des difficultés avec la solution de Roi-Kyi Bryant lorsque multiple add-ins ont essayé de modifier le ruban. Je n'ai pas non plus d'accès administrateur sur mon ordinateur de bureau, ce qui exclut l'installation de l'outil de gestion de l'interface utilisateur. Custom UI Editor . Donc, si vous êtes dans le même bateau que moi, voici une alternative exemple de personnaliser le ruban en utilisant uniquement Excel. Remarque, ma solution est dérivée de la Guide Microsoft .


  1. Créez le ou les fichiers Excel dont vous souhaitez personnaliser les rubans. Dans mon cas, j'ai créé deux .xlam des fichiers, Chart Tools.xlam y Priveleged UDFs.xlam pour montrer comment plusieurs modules complémentaires peuvent interagir avec le ruban.
  2. Créez un dossier, avec n'importe quel nom de dossier, pour chaque que vous venez de créer.
  3. Dans chacun des dossiers que vous avez créés, ajoutez un fichier customUI y _rels dossier.
  4. A l'intérieur de chaque customUI créez un customUI.xml fichier. Le site customUI.xml détaille comment les fichiers Excel interagissent avec le ruban. Partie 2 du guide Microsoft couvre les éléments de la customUI.xml fichier.

Mon customUI.xml pour Chart Tools.xlam ressemble à ceci

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:x="sao">
  <ribbon>
    <tabs>
      <tab idQ="x:chartToolsTab" label="Chart Tools">
        <group id="relativeChartMovementGroup" label="Relative Chart Movement" >
            <button id="moveChartWithRelativeLinksButton" label="Copy and Move" imageMso="ResultsPaneStartFindAndReplace" onAction="MoveChartWithRelativeLinksCallBack" visible="true" size="normal"/>
            <button id="moveChartToManySheetsWithRelativeLinksButton" label="Copy and Distribute" imageMso="OutlineDemoteToBodyText" onAction="MoveChartToManySheetsWithRelativeLinksCallBack" visible="true" size="normal"/>
        </group >
        <group id="chartDeletionGroup" label="Chart Deletion">
            <button id="deleteAllChartsInWorkbookSharingAnAddressButton" label="Delete Charts" imageMso="CancelRequest" onAction="DeleteAllChartsInWorkbookSharingAnAddressCallBack" visible="true" size="normal"/>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

Mon customUI.xml pour Priveleged UDFs.xlam ressemble à ceci

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:x="sao">
  <ribbon>
    <tabs>
      <tab idQ="x:privelgedUDFsTab" label="Privelged UDFs">
        <group id="privelgedUDFsGroup" label="Toggle" >
            <button id="initialisePrivelegedUDFsButton" label="Activate" imageMso="TagMarkComplete" onAction="InitialisePrivelegedUDFsCallBack" visible="true" size="normal"/>
            <button id="deInitialisePrivelegedUDFsButton" label="De-Activate" imageMso="CancelRequest" onAction="DeInitialisePrivelegedUDFsCallBack" visible="true" size="normal"/>
        </group >
      </tab>
    </tabs>
  </ribbon>
</customUI>
  1. Para chaque que vous avez créé à l'étape 1, ajoutez un suffixe .zip à leur nom de fichier. Dans mon cas, j'ai renommé Chart Tools.xlam a Chart Tools.xlam.zip y Privelged UDFs.xlam a Priveleged UDFs.xlam.zip .
  2. Ouvrir chaque .zip et naviguez jusqu'au fichier _rels dossier. Copiez le .rels vers le fichier _rels que vous avez créé à l'étape 3. Modifiez chaque .rels avec un éditeur de texte. De la Guide Microsoft

Entre la finale <Relationship> et l'élément de fermeture <Relationships> ajoutez une ligne qui crée une relation entre le fichier document et le fichier de personnalisation. Assurez-vous que vous spécifiez correctement les noms de dossier et de fichier.

<Relationship Type="http://schemas.microsoft.com/office/2006/
  relationships/ui/extensibility" Target="/customUI/customUI.xml" 
  Id="customUIRelID" />

Mon .rels pour Chart Tools.xlam ressemble à ceci

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
        <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>
        <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>
        <Relationship Type="http://schemas.microsoft.com/office/2006/relationships/ui/extensibility" Target="/customUI/customUI.xml" Id="chartToolsCustomUIRel" />
    </Relationships>

Mon .rels pour Priveleged UDFs ressemble à ça.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
        <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>
        <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>
        <Relationship Type="http://schemas.microsoft.com/office/2006/relationships/ui/extensibility" Target="/customUI/customUI.xml" Id="privelegedUDFsCustomUIRel" />
    </Relationships>
  1. Remplacer le .rels dans chaque .zip avec le fichier .rels le(s) fichier(s) que vous avez modifié(s) à l'étape précédente.
  2. Copiez et collez le .customUI que vous avez créé dans le répertoire d'origine de l'utilisateur .zip fichier/files.
  3. Retirer le .zip l'extension de fichier des fichiers Excel que vous avez créés .
  4. Si vous avez créé .xlam de retour dans Excel, ajoutez-les à vos compléments Excel.
  5. Le cas échéant, créez rappels dans chacun de vos modules complémentaires. À l'étape 4, il y a onAction mots-clés dans mes boutons. Le site onAction indique que, lorsque l'élément contenant est déclenché, l'application Excel déclenchera la sous-routine placée entre guillemets directement après le mot-clé onAction mot-clé. C'est ce qu'on appelle un rappel . Dans mon .xlam j'ai un module appelé CallBacks où j'ai inclus mes sous-programmes de rappel.

CallBacks Module

Mon CallBacks module pour Chart Tools.xlam ressemble à

Option Explicit

Public Sub MoveChartWithRelativeLinksCallBack(ByRef control As IRibbonControl)
  MoveChartWithRelativeLinks
End Sub

Public Sub MoveChartToManySheetsWithRelativeLinksCallBack(ByRef control As IRibbonControl)
  MoveChartToManySheetsWithRelativeLinks
End Sub

Public Sub DeleteAllChartsInWorkbookSharingAnAddressCallBack(ByRef control As IRibbonControl)
  DeleteAllChartsInWorkbookSharingAnAddress
End Sub

Mon CallBacks module pour Priveleged UDFs.xlam ressemble à

Option explicite

Public Sub InitialisePrivelegedUDFsCallBack(ByRef control As IRibbonControl)
  ThisWorkbook.InitialisePrivelegedUDFs
End Sub

Public Sub DeInitialisePrivelegedUDFsCallBack(ByRef control As IRibbonControl)
  ThisWorkbook.DeInitialisePrivelegedUDFs
End Sub

Les différents éléments ont une signature de sous-routine de rappel différente. Pour les boutons, le paramètre de sous-routine requis est ByRef control As IRibbonControl . Si vous ne vous conformez pas à la signature de callback requise, vous recevrez une erreur lors de la compilation de votre/vos projet(s) VBA. Partie 3 du guide Microsoft définit toutes les signatures de rappel.


Voici à quoi ressemble mon exemple fini

Finished Product


Quelques conseils de clôture

  1. Si vous souhaitez que les modules complémentaires partagent des éléments du ruban, utilisez l'option idQ y xlmns: mot-clé. Dans mon exemple, le Chart Tools.xlam y Priveleged UDFs.xlam tous deux ont accès aux éléments avec idQ est égal à x:chartToolsTab y x:privelgedUDFsTab . Pour que cela fonctionne, le x: est nécessaire, et j'ai défini son espace de noms dans la première ligne de mon fichier customUI.xml fichier, <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:x="sao"> . La section Deux façons de personnaliser l'interface utilisateur de Fluent dans le Guide Microsoft donne quelques détails supplémentaires.
  2. Si vous souhaitez que les add-ins accèdent aux éléments du ruban livrés avec Excel, utilisez l'option isMSO mot-clé. La section Deux façons de personnaliser l'interface utilisateur de Fluent dans le Guide Microsoft donne quelques détails supplémentaires.

2voto

John Korchok Points 3380

Une autre approche serait de télécharger le module de classe Open XML gratuit de Jan Karel Pieterse sur cette page : Modifier les éléments dans un fichier OpenXML en utilisant VBA

Avec cela ajouté à votre projet VBA, vous pouvez décompresser le fichier Excel, utiliser VBA pour modifier le XML, puis utiliser la classe pour recompresser les fichiers.

0 votes

Je suis content d'avoir fait défiler jusqu'au bas de cette discussion. C'est exactement ce que je cherchais! Merci, John :-)

2voto

user10186832 Points 9

Ceci est une solution simple qui fonctionne dans Excel 365.

Entrez ce code dans un classeur vide d'abord.

Option Explicit

Sub sbHelloWorld()
 MsgBox "Bonjour le monde!"
End Sub

Il s'agit du XML pour un ruban personnalisé de base. J'ai utilisé le Bloc-notes pour coller ce XML dans un fichier appelé "rb_HelloWorld.txt" puis l'ai enregistré et copié dans le dossier - "C:\Users\david\AppData\Local\Microsoft\Office" Ce dossier était caché au départ donc il faut le rendre visible.

Voici les deux routines utilisées pour copier le nouveau ruban en place et ensuite le supprimer lorsque le classeur se ferme.

Sub sbCopyFile()
 Dim sOfficeUIDir As String
 Dim sHWFile As String
 Dim sUIFile As String
 Dim sTest As String
 sOfficeUIDir = "C:\Users\david\AppData\Local\Microsoft\Office\"
 sHWFile = sOfficeUIDir & "rb_HelloWorld.txt"
 sUIFile = sOfficeUIDir & "Excel.officeUI"
 sTest = Dir(sHWFile)
 If Not sTest = "" Then
  FileCopy sHWFile, sUIFile
 End If
End Sub

Sub sbDeleteFile()
 Dim sOfficeUIDir As String
 Dim sUIFile As String
 Dim sTest As String
 sOfficeUIDir = "C:\Users\david\AppData\Local\Microsoft\Office\"
 sUIFile = sOfficeUIDir & "Excel.officeUI"
 sTest = Dir(sUIFile)
 If Not sTest = "" Then
  Kill (sUIFile)
 End If
End Sub

Le ruban personnalisé peut être ajouté et supprimé en utilisant les procédures intégrées Workbook_Activate et Workbook_Deactivate.

Private Sub Workbook_Activate()
 Call sbCopyFile
End Sub

Private Sub Workbook_Deactivate()
 Call sbDeleteFile
End Sub

La routine sbHelloWorld() est appelée à partir du bouton sur le ruban personnalisé.

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