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
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
Voici un court tutoriel comme promis:
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.
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"
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.
Inspectons le code
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.
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:
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:
J'espère que cela t'aides!
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.
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:
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
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.
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!
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 .
.xlam
, Chart Tools.xlam
et Priveleged UDFs.xlam
, afin de démontrer comment de multiples compléments peuvent interagir avec le ruban.customUI
et _rels
.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>
.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
..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 MicrosoftEntre 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>
.rels
de chaque fichier .Zip
par le fichier .rels
que vous avez modifié à l'étape précédente..customUI
que vous avez créé dans le répertoire de base du ou des fichiers .Zip
..Zip
des fichiers Excel que vous avez créés ..xlam
dans Excel, ajoutez-les à vos compléments Excel.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.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
Quelques conseils de fermeture
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.isMSO
. La section Deux manières de personnaliser l’UI fluide dans le guide Microsoft donne quelques détails supplémentaires.