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

98

Je cherche un moyen d'ajouter un onglet personnalisé dans le ruban Excel qui porterait quelques boutons. Je suis tombé sur certaines ressources pour y remédier via Google, mais toutes semblent douteuses et outrageusement compliquées.

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

MISE À JOUR : J'ai essayé cet exemple à partir d' ici mais j'obtiens une erreur "objet requis" sur 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
Bourdonner
la source
Veuillez confirmer quelle version d'Excel vous utilisez?
Siddharth Rout
C'est pour Project.
Nathan_Sav

Réponses:

146

AFAIK, vous ne pouvez pas utiliser VBA Excel pour créer un onglet personnalisé dans le ruban Excel. Vous pouvez cependant masquer / rendre visible un composant de ruban à l'aide de VBA. De plus, 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é .


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

Didacticiel

Voici un petit tutoriel comme promis:

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

    entrez la description de l'image ici

  2. Faites un clic droit comme indiqué dans l'image ci-dessous et cliquez sur "Office 2007 Custom UI Part". Il insérera le "customUI.xml"

    entrez la description de l'image ici

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

    entrez la description de l'image ici

  4. Inspectons le code

    entrez la description de l'image ici

    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 en ce moment. Vous pouvez télécharger plus d'identifiants 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 "JG Button 1" et "JG Button 2". Gardons le visage heureux comme l'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. Enregistrez et fermez CUIE. Maintenant, lorsque vous ouvrez le fichier Excel, cela ressemblera à ceci:

entrez la description de l'image ici

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

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 prenant en charge les macros. Maintenant, lorsque vous cliquez sur le Smiley ou le Soleil, vous verrez la boîte de message correspondante:

entrez la description de l'image ici

J'espère que cela t'aides!

Déroute de Siddharth
la source
6
Oui :) Ron a plein d'exemples sur son site Web. rondebruin.nl/ribbon.htm
Siddharth Rout
1
Voulez-vous créer un nouvel onglet? Si oui, fournissez plus de détails et je vous donnerai le code XML :)
Siddharth Rout
1
Donne-moi 20 minutes. Mise à jour du message ci-dessus avec le code et les instantanés pertinents :)
Siddharth Rout
6
@SiddharthRout +1 - Je découvre que je n'ai pas besoin de livres Excel, suivez simplement vos messages pour ce que j'ai besoin d'apprendre dans une journée de travail (et ce soir, c'est le ruban XML!) :)
Notre homme en Bananas
1
Je recommanderais de créer une nouvelle question avec votre code xml de base et le code VBA, puis nous pourrons le prendre forme là-bas? @YasserKhalil
Siddharth Rout
30

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 dans l'onglet Développeur. L'onglet Développeur n'est pas visible par défaut, il doit donc ê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. Cliquez avec le bouton droit de la souris dans le volet Explorateur de projets sur la gauche. Cliquez sur le menu d'insertion et choisissez 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 sub dans le Wookbook open even et appelez le sous ClearCustRibbon dans l'événement Before_Close du fichier de code ThisWorkbook.

Roi-Kyi Bryant
la source
Cela a fonctionné pour moi, mais avec seulement quelques problèmes mineurs que j'ai rencontrés. 1) Si j'ai conservé l'événement Before_Close, le nouveau ruban ne s'est pas chargé. 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 expliquer pourquoi cela se produit, ce serait formidable!
Petay87
Le code est-il exactement le même? Pouvez-vous le poster? L'idée est qu'Excel doit modifier le fichier ruban standard avant le chargement du ruban et le réinitialiser avant la fermeture du classeur. La réinitialisation du ruban est nécessaire afin qu'il ne s'affiche pas dans les autres classeurs.
Roi-Kyi Bryant
3
Ce code remplace toutes les personnalisations de ruban actuelles que l'utilisateur a peut-être déjà effectuées.
WizzleWuzzle
@WizzleWuzzle Ce n'est pas nécessaire. Le ruban pourrait être importé et analysé dans un objet qui pourrait être traversé. De nouveaux éléments pourraient alors être ajoutés à l'objet. Le résultat peut être enregistré dans un fichier. La question était de savoir comment créer un ruban personnalisé; pas comment modifier un existant.
Roi-Kyi Bryant
1
@ Roi-Kyi-Bryant La question était d'ajouter un élément de ruban personnalisé, et non d'écraser tout le ruban personnalisé actuel. Ce code remplace le ruban actuel.
WizzleWuzzle
24

J'ai lutté comme un fou, mais c'est en fait la bonne réponse. Pour ce que cela vaut, ce qui m'a manqué, c'est 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 de créer votre code de ruban xml en utilisant Fichier> Options> Personnaliser le ruban d'Excel, puis d'exporter le ruban dans un fichier .customUI (c'est juste un fichier txt, avec xml dedans)
  3. Maintenant vient l'astuce : 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 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à, c'est simple, créez votre ruban, copiez le code xml qui est spécifique à votre ruban à partir du fichier .customUI, et placez-le dans un wrapper comme indiqué ci-dessus (... <tabs> vos xml </ tabs .. .)

Au fait, 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 la façon dont vous activez / désactivez les boutons sur le 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

Jan Wijninckx
la source
2
Toujours (5 ans plus tard) la meilleure réponse à mon avis et peut-être que OP @BuZz aimerait rafraîchir le message d'origine, en pointant au moins cette réponse (?). Je l'ai à peine trouvée car elle se trouvait au bas d'une assez longue liste de réponses.
Chri.s
18

Les réponses 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, donc je documente la solution ici pour aider n'importe qui d'autre à décider s'il a besoin de cet éditeur d'interface utilisateur personnalisé ou non.

Je suis tombé sur la page Web 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 des problèmes en pointant vers mon code de complément personnalisé.

Pour que les boutons fonctionnent avec vos macros personnalisées, configurez la macro dans vos sous-marins .xlam pour qu'elle soit appelée comme décrit dans cette réponse SO - Appel d'une macro Excel à partir du ruban . En gros, vous devrez ajouter ce paramètre "control As IRibbonControl" à n'importe quel module pointé depuis 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 le complément.

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

Jomtung
la source
1
Cela fonctionne pour ceux d'entre nous qui ne disposent pas de tous les outils de développement. Merci pour la solution "simple"
Evan
2
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.
Rick Henderson
8

En plus de la réponse de Roi-Kyi Bryant, ce code fonctionne entièrement dans Excel 2010. Appuyez sur ALT + F11 et l'éditeur VBA apparaîtra. Double-cliquez sur ThisWorkbooksur 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 = "<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 d'enregistrer et de rouvrir le classeur. J'espère que cela t'aides!

Erikas
la source
Comment passeriez-vous des arguments avec cela? J'utilise ceci, mais je ne trouve pas de moyen de passer des arguments.
jDave1984
En utilisant ma réponse, vous ajouteriez une liste d'arguments à chaque sous-routine Quelque chose comme LoadCustomRibbon (tabName en tant que chaîne, groupName en tant que chaîne, btnName en tant que chaîne). Appelez ensuite ces sous-routines à l'endroit approprié comme l'a souligné @Erikas.
Roi-Kyi Bryant
6

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


  1. Créez des fichiers / fichiers Excel dont vous souhaitez personnaliser les rubans. Dans mon cas, j'ai créé deux .xlamfichiers, Chart Tools.xlametPriveleged UDFs.xlam , pour montrer comment plusieurs 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 customUIet _rels.
  4. Dans chaque customUIdossier, créez un customUI.xmlfichier. Le customUI.xmlfichier détaille la manière dont les fichiers Excel interagissent avec le ruban. La partie 2 du guide Microsoft couvre les éléments du customUI.xmlfichier.

Mon customUI.xmlfichier pour Chart Tools.xlamressemble à 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.xmlfichier pour Priveleged UDFs.xlamressemble à 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 un suffixe .zipà leur nom de fichier. Dans mon cas, j'ai renommé Chart Tools.xlamen Chart Tools.xlam.zipet Privelged UDFs.xlamenPriveleged UDFs.xlam.zip .
  2. Ouvrez chaque .zipfichier et accédez au _relsdossier. Copiez le .relsfichier dans le _relsdossier que vous avez créé à l'étape 3. Modifiez chaque .rels fichier avec un éditeur de texte. À partir du guide Microsoft

Entre l' <Relationship>élément final et l' <Relationships>élément de fermeture , 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 .relsfichier pour Chart Tools.xlamressemble à 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 .relsfichier pour Priveleged UDFsressemble à 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 .relsfichiers de chaque .zipfichier par le .rels/ les fichiers que vous avez modifiés à l'étape précédente.
  2. Copiez et collez le .customUIdossier que vous avez créé dans le répertoire de base du .zipfichier / fichiers.
  3. Supprimez l' .zipextension de fichier des fichiers Excel que vous avez créés .
  4. Si vous avez créé des .xlamfichiers, de retour 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 des onActionmots - clés dans mes boutons. Le onActionmot-clé indique que, lorsque l'élément conteneur est déclenché, l'application Excel déclenchera la sous-routine entre guillemets directement après le onActionmot - clé. C'est ce qu'on appelle un rappel . Dans mes .xlamfichiers, j'ai un module appelé CallBacksoù j'ai inclus mes sous-routines de rappel.

Module CallBacks

Mon CallBacksmodule pour Chart Tools.xlamressemble à

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 CallBacksmodule pour Priveleged UDFs.xlamressemble à

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 / vos projets VBA. La partie 3 du guide Microsoft définit toutes les signatures de rappel.


Voici à quoi ressemble mon exemple fini

Produit fini


Quelques conseils de clôture

  1. Si vous souhaitez que les compléments partagent les éléments du ruban, utilisez le mot clé idQet xlmns:. Dans mon exemple, les Chart Tools.xlamet les Priveleged UDFs.xlamdeux ont accès aux éléments avec idQun égal à x:chartToolsTabet x:privelgedUDFsTab. Pour que cela fonctionne, l' x:est nécessaire, et je l' ai défini son espace de noms dans la première ligne de mon customUI.xmlfichier, <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:x="sao">. La section Deux façons de personnaliser l'interface utilisateur Fluent dans le guide Microsoft donne plus de détails.
  2. Si vous souhaitez que les compléments accèdent aux éléments du ruban fournis avec Excel, utilisez le isMSOmot - clé. La section Deux façons de personnaliser l'interface utilisateur Fluent dans le guide Microsoft donne plus de détails.
Joshua Daly
la source
0

Une autre approche consiste à télécharger le module de classe Open XML gratuit de Jan Karel Pieterse à partir de cette page: Modification d'éléments dans un fichier OpenXML à l'aide de 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 rezip les fichiers.

John Korchok
la source