web-dev-qa-db-fra.com

Comment ajouter un onglet de ruban personnalisé à l'aide de VBA?

Je cherche un moyen d’ajouter un onglet personnalisé dans le ruban Excel contenant quelques boutons. Je suis tombé par hasard sur certaines ressources qui y répondent via Google, mais toutes ont l'air lugubres et outrageusement compliquées.

Quel est un moyen simple et rapide de le faire? J'aimerais que le nouvel onglet soit chargé lorsque mon VBA est chargé dans Excel.

UPDATE: J'ai essayé cet exemple de ici mais j'ai une erreur "object required" lors de la dernière instruction:

Public Sub AddHighlightRibbon()
Dim ribbonXml As String

ribbonXml = "<mso:customUI xmlns:mso=""http://schemas.Microsoft.com/office/2009/07/customui"">"
ribbonXml = ribbonXml + "  <mso:ribbon>"
ribbonXml = ribbonXml + "    <mso:qat/>"
ribbonXml = ribbonXml + "    <mso:tabs>"
ribbonXml = ribbonXml + "      <mso:tab id=""highlightTab"" label=""Highlight"" insertBeforeQ=""mso:TabFormat"">"
ribbonXml = ribbonXml + "        <mso:group id=""testGroup"" label=""Test"" autoScale=""true"">"
ribbonXml = ribbonXml + "          <mso:button id=""highlightManualTasks"" label=""Toggle Manual Task Color"" "
ribbonXml = ribbonXml + "imageMso=""DiagramTargetInsertClassic"" onAction=""ToggleManualTasksColor""/>"
ribbonXml = ribbonXml + "        </mso:group>"
ribbonXml = ribbonXml + "      </mso:tab>"
ribbonXml = ribbonXml + "    </mso:tabs>"
ribbonXml = ribbonXml + "  </mso:ribbon>"
ribbonXml = ribbonXml + "</mso:customUI>"

ActiveProject.SetCustomUI (ribbonXml)
End Sub
93
BuZz

Autant que je sache, vous ne pouvez pas utiliser VBA Excel pour créer un onglet personnalisé dans le ruban Excel. Vous pouvez toutefois masquer/rendre visible un composant du ruban à l'aide de VBA. En outre, le lien que vous avez mentionné ci-dessus concerne MS Project et non MS Excel.

Je crée des onglets pour mes applications/compléments Excel à l'aide de cet utilitaire gratuit appelé éditeur d'interface utilisateur personnalisée .


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

Didacticiel

Voici un court tutoriel comme promis:

  1. Après avoir installé l’éditeur d’interface utilisateur personnalisée (CUIE), ouvrez-le puis cliquez sur Fichier | Ouvrez et sélectionnez le fichier Excel correspondant. Veuillez vous assurer que le fichier Excel est fermé avant de l'ouvrir via CUIE. J'utilise une toute nouvelle feuille de calcul à titre d'exemple.

    enter image description here

  2. Cliquez avec le bouton droit de la souris, comme indiqué dans l'image ci-dessous, puis cliquez sur "Partie de l'interface utilisateur personnalisée Office 2007". Il va insérer le "customUI.xml"

    enter image description here

  3. Suivant Cliquez sur le menu Insérer | Exemple de XML | Onglet personnalisé. Vous remarquerez que le code de base est généré automatiquement. Vous êtes maintenant prêt à l'éditer selon vos besoins.

    enter image description here

  4. Inspectons le code

    enter image description here

    label="Custom Tab": Remplacez "Onglet personnalisé" par le nom que vous souhaitez donner à votre onglet. Pour le moment, appelons cela "Jérôme".

    La partie ci-dessous ajoute un bouton personnalisé.

    <button id="customButton" label="Custom Button" imageMso="HappyFace" size="large" onAction="Callback" />
    

    imageMso: C'est l'image qui s'affichera sur le bouton. "HappyFace" est ce que vous verrez pour le moment. Vous pouvez télécharger plus d'ID d'image ici .

    onAction="Callback": "Callback" est le nom de la procédure qui s'exécute lorsque vous cliquez sur le bouton.

Démo

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

<customUI xmlns="http://schemas.Microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="MyCustomTab" label="Jerome" insertAfterMso="TabView">
<group id="customGroup1" label="First Tab">
<button id="customButton1" label="JG Button 1" imageMso="HappyFace" size="large" onAction="Callback1" />
<button id="customButton2" label="JG Button 2" imageMso="PictureBrightnessGallery" size="large" onAction="Callback2" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>

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

enter image description here

Maintenant la partie code. Ouvrez l'éditeur VBA, insérez un module et collez le code suivant:

Public Sub Callback1(control As IRibbonControl)

    MsgBox "You pressed Happy Face"

End Sub

Public Sub Callback2(control As IRibbonControl)

    MsgBox "You pressed the Sun"

End Sub

Enregistrez le fichier Excel en tant que fichier activé par macro. Maintenant, lorsque vous cliquez sur le smiley ou le soleil, vous verrez la boîte de message correspondante:

enter image description here

J'espère que cela t'aides!

141
Siddharth Rout

J'ai pu accomplir cela avec VBA dans Excel 2013. Aucun éditeur spécial requis. Tout ce dont vous avez besoin est l’éditeur de code Visual Basic, accessible depuis l’onglet Développeur. L'onglet Développeur n'étant pas visible par défaut, il doit être activé dans Fichier> Options> Personnaliser le ruban. Sous l'onglet Développeur, cliquez sur le bouton Visual Basic. L'éditeur de code se lancera. Faites un clic droit dans le volet Explorateur de projet à gauche. Cliquez sur le menu d'insertion et choisissez le module. Ajoutez les deux sous-marins ci-dessous au 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 = "<mso:customUI      xmlns:mso='http://schemas.Microsoft.com/office/2009/07/customui'>" & vbNewLine
ribbonXML = ribbonXML + "  <mso:ribbon>" & vbNewLine
ribbonXML = ribbonXML + "    <mso:qat/>" & vbNewLine
ribbonXML = ribbonXML + "    <mso:tabs>" & vbNewLine
ribbonXML = ribbonXML + "      <mso:tab id='reportTab' label='Reports' insertBeforeQ='mso:TabFormat'>" & vbNewLine
ribbonXML = ribbonXML + "        <mso:group id='reportGroup' label='Reports' autoScale='true'>" & vbNewLine
ribbonXML = ribbonXML + "          <mso:button id='runReport' label='PTO' "   & vbNewLine
ribbonXML = ribbonXML + "imageMso='AppointmentColor3'      onAction='GenReport'/>" & vbNewLine
ribbonXML = ribbonXML + "        </mso:group>" & vbNewLine
ribbonXML = ribbonXML + "      </mso:tab>" & vbNewLine
ribbonXML = ribbonXML + "    </mso:tabs>" & vbNewLine
ribbonXML = ribbonXML + "  </mso:ribbon>" & vbNewLine
ribbonXML = ribbonXML + "</mso:customUI>"

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 = "<mso:customUI           xmlns:mso=""http://schemas.Microsoft.com/office/2009/07/customui"">" & _
"<mso:ribbon></mso:ribbon></mso:customUI>"

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

End Sub

Appelez LoadCustRibbon secondaire dans le Wookbook ouvert même et appelez le ClearCustRibbon secondaire dans l'événement Before_Close du fichier de code ThisWorkbook.

27
Roi-Kyi Bryant

Je me suis battu comme un fou, mais c'est en fait la bonne réponse. Pour ce que ça vaut, ce qui m'a manqué, c'est ça:

  1. Comme d'autres le disent, on ne peut pas créer le ruban CustomUI avec VBA , mais , vous n'en avez pas besoin!
  2. L'idée est de créer votre code de ruban xml à l'aide de la commande Fichier> Options> Personnaliser le ruban d'Excel, puis d'exporter le ruban dans un fichier .customUI (il ne s'agit que d'un fichier txt contenant xml).
  3. Maintenant vient le tour : vous pouvez inclure le code .customUI dans votre Fichier .xlsm à l'aide de l'outil MS auquel ils font référence ici, en copiant le code à partir du fichier .customUI
  4. Une fois qu'il est 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 <ruban. startFromScratch = "false"> ou vous perdez le reste du ruban. À la sortie du classeur, le ruban est supprimé.
  5. À partir de là, rien de plus simple, créez votre ruban, copiez le code XML spécifique à votre ruban à partir du fichier .customUI, puis placez-le dans un wrapper comme indiqué ci-dessus (... <tabs> votre xml </ tabs .. .)

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

Et voici son exemple sur la façon dont vous activez/désactivez les boutons du ruban http://www.rondebruin.nl/win/s2/win013.htm

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

20
Jan Wijninckx

Les réponses fournies ici sont spécifiques à l’utilisation de l’éditeur d’interface utilisateur personnalisé. J'ai passé un certain temps à créer l'interface sans ce merveilleux programme. Je documente ici la solution pour aider les autres utilisateurs à décider s'ils ont besoin de cet éditeur d'interface utilisateur personnalisé ou non.

Je suis tombé sur la page Web suivante de l’aide de Microsoft - https://msdn.Microsoft.com/en-us/library/office/ff861787.aspx . Cela montre comment configurer l’interface manuellement, mais j’ai eu quelques problèmes pour pointer vers mon code complémentaire personnalisé.

Pour que les boutons fonctionnent avec vos macros personnalisées, configurez la macro dans vos sous-fichiers .xlam afin qu'elle soit appelée comme décrit dans la section SO answer - Appel d'une macro Excel à partir du ruban . En gros, vous devez ajouter ce paramètre "control As IRibbonControl" à tout module pointé à partir de votre ruban xml. En outre, votre ruban xml doit avoir la syntaxe onAction = "myaddin! Mymodule.mysub" pour appeler correctement tous les modules chargés par l’add-in.

En utilisant ces instructions, j'ai pu créer un complément Excel (fichier .xlam) doté d'un onglet personnalisé chargé lorsque mon VBA est chargé dans Excel avec le complément ajouté. Les boutons permettent d'exécuter du code à partir de l'addition et l'onglet personnalisé est désinstallé lorsque Je supprime l'add in.

17
Jomtung

En plus de la réponse Roi-Kyi Bryant, ce code fonctionne entièrement dans Excel 2010. Appuyez sur ALT + F11 pour ouvrir l'éditeur VBA. Double-cliquez sur ThisWorkbook sur le côté gauche, puis collez le code suivant:

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 = "<mso:customUI      xmlns:mso='http://schemas.Microsoft.com/office/2009/07/customui'>" & vbNewLine
ribbonXML = ribbonXML + "  <mso:ribbon>" & vbNewLine
ribbonXML = ribbonXML + "    <mso:qat/>" & vbNewLine
ribbonXML = ribbonXML + "    <mso:tabs>" & vbNewLine
ribbonXML = ribbonXML + "      <mso:tab id='reportTab' label='My Actions' insertBeforeQ='mso:TabFormat'>" & vbNewLine
ribbonXML = ribbonXML + "        <mso:group id='reportGroup' label='Reports' autoScale='true'>" & vbNewLine
ribbonXML = ribbonXML + "          <mso:button id='runReport' label='Trim' " & vbNewLine
ribbonXML = ribbonXML + "imageMso='AppointmentColor3'      onAction='TrimSelection'/>" & vbNewLine
ribbonXML = ribbonXML + "        </mso:group>" & vbNewLine
ribbonXML = ribbonXML + "      </mso:tab>" & vbNewLine
ribbonXML = ribbonXML + "    </mso:tabs>" & vbNewLine
ribbonXML = ribbonXML + "  </mso:ribbon>" & vbNewLine
ribbonXML = ribbonXML + "</mso:customUI>"

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 = "<mso:customUI           xmlns:mso=""http://schemas.Microsoft.com/office/2009/07/customui"">" & _
"<mso:ribbon></mso:ribbon></mso:customUI>"

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 t'aides!

8
Erikas

J'ai rencontré des difficultés avec la solution de Roi-Kyi Bryant lorsque plusieurs compléments ont tenté de modifier le ruban. De plus, je n'ai pas d'accès administrateur à mon ordinateur de travail, ce qui a exclu l'installation de Custom UI Editor. Donc, si vous êtes dans le même bateau que moi, voici un exemple alternatif permettant de personnaliser le ruban en utilisant uniquement Excel. Remarque, ma solution est dérivée de Guide Microsoft .


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

Mon fichier 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 fichier 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. Pour chaque fichier que vous avez créé à l'étape 1, ajoutez le suffixe .Zip à leur nom de fichier. Dans mon cas, j'ai renommé Chart Tools.xlam en Chart Tools.xlam.Zip et Privelged UDFs.xlam en Priveleged UDFs.xlam.Zip.
  2. Ouvrez chaque fichier .Zip et accédez au dossier _rels. Copiez le fichier .rels dans le dossier _rels que vous avez créé à l'étape 3. Modifiez chaque .rels fichier avec un éditeur de texte. À partir du guide Microsoft

Entre l'élément final <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 de spécifier 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 fichier .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 fichier .rels pour Priveleged UDFs 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="privelegedUDFsCustomUIRel" />
    </Relationships>
  1. Remplacez les fichiers .rels de chaque fichier .Zip par le fichier .rels que vous avez modifié à l'étape précédente.
  2. Copiez et collez le dossier .customUI que vous avez créé dans le répertoire de base du ou des fichiers .Zip.
  3. Supprimez l'extension de fichier .Zip des fichiers Excel que vous avez créés .
  4. Si vous avez créé des fichiers .xlam dans Excel, ajoutez-les à vos compléments Excel.
  5. Le cas échéant, créez des rappels dans chacun de vos compléments. À l'étape 4, il y a onAction mots clés dans mes boutons. Le mot clé onAction indique que, lorsque l'élément contenant est déclenché, l'application Excel déclenche la sous-routine encapsulée entre guillemets directement après le mot clé onAction. Ceci s'appelle un rappel . Dans mes fichiers .xlam, j'ai un module appelé CallBacks dans lequel j'ai inclus mes sous-routines de rappel.

CallBacks Module

Mon module CallBacks 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 module CallBacks 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

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 rappel requise, vous recevrez une erreur lors de la compilation de votre projet/projets VBA. Partie 3 du guide Microsoft définit toutes les signatures de rappel.


Voici à quoi ressemble mon exemple fini

Finished Product


Quelques conseils de fermeture

  1. Si vous souhaitez que les compléments partagent les éléments du ruban, utilisez les mots clés idQ et xlmns:. Dans mon exemple, Chart Tools.xlam et Priveleged UDFs.xlam ont tous deux accès aux éléments avec idQ égal à x:chartToolsTab et x:privelgedUDFsTab. Pour que cela fonctionne, le x: est requis, et j'ai défini son espace de nom dans la première ligne de mon fichier customUI.xml, <customUI xmlns="http://schemas.Microsoft.com/office/2006/01/customui" xmlns:x="sao">. La section Deux manières de personnaliser l’UI fluide dans le guide Microsoft donne quelques détails supplémentaires.
  2. Si vous souhaitez que les compléments accèdent aux éléments du ruban fournis avec Excel, utilisez le mot clé isMSO. La section Deux manières de personnaliser l’UI fluide dans le guide Microsoft donne quelques détails supplémentaires.
4
Joshua Daly