Manipuler en VBA le ruban
Bonjour à tous,
Je cherche à personnaliser le ruban en VBA et non manuellement en passant par "l'Option d'Excel", "Personnaliser le ruban"
Exemple si je veux supprimer l'onglet "Dessin" en utilisant un bout de code et non manuellement comme c'est fait ci-dessus, que dois-je écrire comme bout de code VBA?
Merci et bonne journée
Bonjour,
Hum... Depuis 20 ans les choses ont bien changées ! Depuis 2010 il n'est plus possible d'utiliser ta programmation que depuis l'onglet complément, mais je suppose que plus personne n'utilise cette technique.
En effet depuis 2010 VBA ne permet plus que de gérer les Events et procédures diverses relatives au nouveau ribbon que tu peux créer au moyen d'application tierce.
La plupart des indication que je pourrai te donner seraient sans doute obsolète avec 365 aussi mon conseil est donc seulement de consulter tout ce que tu pourras trouver sous ce lien...
Bonne lecture !
A+
Bonjour Galopin,
Il est vrai qu'en 2008 j'avais réussi à construire un Menu personnalisé que j'intégrais temporairement dans mon produit .
J'ai voulu reprendre mon code d'antan et basta ça ne marche plus
Avant de reprendre contact je vais regarder sérieusement ton lien
Merci et à plus
Les outils récents permettent de modifier la totalité des ribbons Office (Excel/Access/Word…)
Adaptation des rubans natifs :
https://fgcu.zendesk.com/hc/en-us/articles/23533754480283-Customizing-the-Ribbon-in-Microsoft-365
Il semble que ce lien permette la création d’un ribbon in extenso (à partir de rien) comme on le faisait déjà à partir de 2010
https://microsoft-office-custom-ui-editor.updatestar.com/en
.malheureusement ce n'est pas un freeware comme le laisse supposer la pub aussi j'ai supprimé le lien, mais si quelqu'un veut le tester, l'adresse est correcte.
A+
Bonjour à tous,
Oui j'ai également fouillé et je ne trouve rien de convaincant…
Je pense qu'à ce compte-là passer par un Userform serait plus pratique.
Bonjour à tous,
J'utilise Office 365 et le tutoriel de SilkRoad qui date pourtant de 2008 fonctionne toujours et je l'utilise. Tout est à faire à la main mais c'est très très instructif sur le fonctionnement et le format des fichiers Excel.
Cdlt,
Cylfo
Bonjour,
Cylfo comme je n'ai pas 365 je n'osais pas m'avancer sur ce terrain. Mais à l'évidence quand on épluche un peu tout ce qui se dit sur les différents essais pour 365 il reste encore quelques problèmes à régler pour avoir une compatibilité totale avec l'usine à gaz. Il passera sans doute encore pas mal de mise à jour avant d'avoir une version complètement compatible 365. Et puis tout le monde ne maitrise pas forcément json ou Python...
J'utilise pour ma part également une version Access d'Arckam : Il commence à dater mais est aussi très pratique.
A+
Bonjour à tous,
Comme je suis tétu, j'ai cherché et trouvé un début de solution à la question que j'ai posée : comment en VBA ajouter un onglet dans le Menu ?
Voici le code que j'ai construit
Sub creer_onglet()
Set Mon_Menu = CommandBars.ActiveMenuBar
Mon_Menu.Visible = True
' Ajoute un onglet
Set Nv_onglet = Mon_Menu.Controls.Add(Type:=msoControlButton, Temporary:=True)
With Nv_onglet
.Caption = "Enregister" ' Nom du bouton.
.OnAction = "Macro_Enregistrer" ' Macro à lancer.
.FaceId = 3 ' Numéro d'icône.
.Style = msoButtonIconAndCaption ' Placement de l'icône.
End Withce qui me donne
L'onglet a pris le nom de "Compléments" sans que je lui ai indiqué ...... à étudier !
Dans le Ruban un nouveau groupe est construit : "Commandes de Menu", là aussi le nom je ne l'ai pas fourni
Et j'ai bien le bouton "Enregistrer" avec son icone, cette fois ci c'est bien moi qui l'ai demandé
Donc je peux en VBA ajouter un onglet. Il me faut maintenant voir comment modifier les noms de l'onglet et du groupe et aussi voir comment le supprimer
De plus il me faut chercher aussi à créer un autre groupe si besoin est
Désolé de vous ennuyer avec mes casses tête chinois, mais comme je vous l'ai dit je suis tétu et tiens à obtenir réponse à ma question
Bonsoir,
Le Custom UI Editor à très vite conquis pas mal de programmeur Excel et la méthode que tu utilises à semble-t-il été rapidement abandonnée.
Il faudrait donc tomber sur quelqu'un qui a conservé ses prog originaux.
A mon avis une solution très pratique est effectivement comme le suggère saboh d'utiliser des UserForm : J'ai beaucoup pratiqué ça également à partir de classeur sans ruban qui ne possèdent que la croix de fermeture. C'est à toi de fournir aux utilisateurs tous outils dont ils peuvent avoir besoin.
En pièce jointe un classeur sans ruban que tu peux bricoler à ta guise avec des USerForm...
A+
@galopin01,
Tu dis "comme je n'ai pas 365 je n'osais pas m'avancer sur ce terrain" mais ce que je voulais dire c'est qu'actuellement je suis sur 365 (et aussi Office Pro 2019) et que les personnalisations de ruban qu'elles soient faites à partir des versions 2016 (j'ai d'anciens fichiers), 2019 ou 365 fonctionnent toutes.
Cdlt,
Cylfo
Bonjour Cylfo,
C'est toujours bon à savoir. Est ce que 365 est 64 bits only ou est-ce qu'il peut être aussi 32 bits ?
A+
Bonjour @ tous !
Des menus j'en ai fait ! Mais pas dans le ruban !
Ci dessous deux fichiers avec le même objectif : faire une gestion des chambres d'hôtel, mais les deux projets ont été stoppés !
Mais cela n'enlève rien à l'exemple des menus !
Le premier c'est un menu sur USF non modal, c'est à dire que le classeur reste accessible et le USF reste visible même si l'on change de feuille.
Le deuxième c'est "plus technique", il y a plus de programmation car cela joue avec une image ActiveX dont on surveille le survol et le clic de la souris.
La même image est placée sur tous les onglets où l'on veut avoir accès au menu. j'avoue, c'est de l'ActiveX et c'est moins pratique.
@ bientôt
LouReeD
Bonjour LouReed,
Parfait, tes Menus en effet ne sont pas dans le Ruban, contrairement à ce que j'essayais de réaliser
Je maintiens l'exemple donné un peu plus haut, c'est à dire : j'ai construit, en Vba, un nouveau menu dans un nouveau groupe en appelant l'onglet "Compléments". Ainsi j'ai bien accès à mon menu supplémentaire, mais, et c'est peut être ridicule, j'aurais aimé n'avoir que cet onglet afin d'interdire l'usage des autres onglets.
Il y a bien une solution, c'est de les supprimer manuellement, mais ça aura une incidence sur tous mes fichiers
Je crois que j'en resterai là
Merci et au plaisir
Bonjour à tous.
@Jacky :
le résultat ne répond toujours pas à ma question, la seule chose c'est que cette méthode me permet de déterminer le nom du nouvel onglet construit et de ce fait éviter d'utiliser l'onglet "Compléments"
Bien sur que c'est faisable. Bien entendu il faut prendre deux minutes pour lire le tutos et ne pas le survoler en pensant que les réponses vont arriver toutes seules.
Voici un exemple de fichier xml qui va servir à configurer le ruban :
<!--Editer par Jean-Paul (Valtrase) le 06/04/2025-->
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"
onLoad="OnRibbonLoad">
<ribbon startFromScratch="true">
<tabs>
<tab id="tab0"
getVisible="GetVisible"
label="Tests coupures">
<group id="grpSystem"
autoScale="true"
centerVertically="true"
label="Système"
getVisible="GetVisible"
tag="RibbonName:=;inMenu:=;CustomTagValue1:=;CustomTagValue2:=;CustomTagValue3:=;CustomPicture:=;CustomPicturePath:="
imageMso="ChangeFolderDownloadSettings">
<editBox id="ebxPassword"
label="Mot de passe"
screentip="Mot de passe utilisateur"
supertip="Entrer un mot de passe pour pouvoir changer les paramètres systèmes."
imageMso="WebControlPassword"
getText="GetText"
onChange="OnChangeEditBox"
tag="RibbonName:=;inMenu:=;CustomTagValue1:=;CustomTagValue2:=;CustomTagValue3:=;DefaultValue:=;CustomPicture:=;CustomPicturePath:="
getVisible="GetVisible"
getEnabled="GetEnabled"/>
<checkBox id="cbxDisplaySystemObjects"
label="Afficher les objets systèmes"
screentip="Afficher les objets systèmes"
supertip="Active/désactive l'affichage des objets system, (feuilles et champs nommés).
Attention toutes modifications sur ces objets peut entrainer le dysfonctionnement du classeur."
onAction="OnActionCheckbox"
getPressed="GetPressed"
tag="Key:=DisplaySystemObjects;DefaultValue:=0"
getVisible="GetVisible"
getEnabled="GetEnabled"/>
<checkBox id="cbxDisplayMessages"
label="Afficher les messages"
screentip="Afficher les messages."
supertip="Active/désactivel'affichage des messages de confirmation."
onAction="OnActionCheckbox"
getPressed="GetPressed"
tag="Key:=DisplayMessages;DefaultValue:=0"
getVisible="GetVisible"
getEnabled="GetEnabled"/>
<separator id="separator1"
getVisible="GetVisible"/>Si l'on regarde de plus près on s'aperçoit qua la ligne :
<ribbon startFromScratch="true">Cette ligne permet de cacher le ruban d'Excel et de ne laisser que le personnalisé.
Si l'on descend un peu on voit que le ruban 'tab0' porte le nom 'Test coupures' c'est le nom de l'onglet du ruban.
On continu de descendre on trouve le premier groupe grpSystem avec le nom 'Système'. Si l'on continu on voit les contrôles du groupe système.
Voilà, donc pour commencer, partir avec un schéma de ce que l'on veut et ensuite, on y va on télécharge un éditeur de ruban ICI ou bien Là.
Et surtout on fait une copie de sauvegarde on est jamais assez prudent.
Concernant la gestion du ruban chacun a son école. Pour ma part je regroupe la gestion par type de contrôle. Exemple tous les contrôle Button pointeront sur la procédure OnActionButton. Voir ci-dessous
<button id="btnDisplaySystemSheets"
size="normal"
label="Feuilles système"
screentip="Afficher les feuilles système."
supertip="Les feuilles système sont cachées car modifiées seulement par programmation.
Ne toucher à celles-ci que si vous êtes sûr de ce que vous faites."
imageMso="AccessFormDatasheet"
tag="RibbonName:=;inMenu:=;CustomTagValue1:=;CustomTagValue2:=;CustomTagValue3:=;CustomPicture:=;CustomPicturePath:="
onAction="OnActionButton"
getVisible="GetVisible"
getEnabled="GetEnabled"/>Tous les appels sont dans un module CallBacks que j'ai pris soin d'intégrer au classeur avant de faire le ruban sous peine de messages d'erreurs et de plantages.
Pfff. Jean-Paul pour se rappeler du nom de tous les contrôles c'est pas gagné ! C'est vrai donc j'ai ma petite astuce :que j'ai intégré dans tous les CallBacks des contrôles un simple petit Debug.Print qui crée une Case pour chaque contrôle.
'@Description "Callback for Button-Click."
Public Sub OnActionButton(control As IRibbonControl)
Select Case control.ID
Case Else
Debug.Print "Case """; control.ID; """" '; vbTab; " "; Control.Tag; """"
End Select
End SubDonc à l'ouverture du classeur si pas d'erreur je clique sur tous les contrôles et j'ai la Case à utiliser.
Pour finir comme je suis un peu fainéant, et que je n'aime pas réinventer la roue à chaque fois je me suis créer des base de groupes avec le fichier xlm complet qui peut être incorporer facilement dans le fichier initial si vous utilisez par exemple le logiciel d'Arckam.
Une dernière chose ou deux,
Le ruban n'aime pas du tout les plantages et il se retrouve facilement sur Nothing donc prévoir une gestion de rafraichissement du ruban par la sauvegarde de son Handle.
startFromScratch C'est très bien mais une fois définit, on ne retrouve plus les onglets Excel, une autre méthode existe mais ce n'est pas à l'ordre du jour.
On peut définir des images personnalisées pour les contrôles, pas de soucis, sauf que après plusieurs tests je me suis rendu compte que ceux-ci n'aimaient pas du tout le changement de thème.
Voilà si vous voulez vous lancer dans l'aventure je peux vous fournir les base du module de Callbacks.
Bonne programmation.
Bonsoir Jean-Paul
C'est avec application que j'ai lu le tuto et je n'ai jamais pensé que les solutions allaient arriver toutes seules, je ne me le serais jamais permis
Mon problème est du au fait que je n'arrive pas à assimiler correctement les dirctives du tuto
Le fichier que j'ai construit, tout comme le tien, est un fichier .xlm qu'il faut intégrer dans le fichier .xlms, me semble-t-il. Et c'est justement là que je n'arrive pas à m'en sortir
Pour démarrer, vous devez créer le fichier xml de personnalisation:
Ouvrez le Bloc-notes et copiez les balises suivantes dans le fichier.
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="OngletPerso" label="OngletPerso" visible="true">
</tab>
</tabs>
</ribbon>
</customUI>C'est ce que j'ai fait
Ensuite
Sauvegardez le fichier au format xml, à l'emplacement de votre choix sur votre PC. Par convention, ce fichier doit être nommé customUI.xml.
Ensuite, fermez le fichier.
Ouvrez un nouveau classeur Excel et enregistrez-le sous l'extension .xlsm (format openXML avec macros).
Refermez le classeur.
Recherchez le classeur sur votre PC et ajoutez lui l'extension .zip.
Ensuite dézippez le fichier.
Ouvrez le dossier dézippé.
Ajoutez un répertoire nommé customUI dans le répertoire dézippé.
Faites glisser le fichier customUI.xml dans ce dossier.
Vous allez maintenant créer une relation entre le classeur et le fichier xml:
Démarrez le Bloc-notes.
Utilisez le menu Fichier/Ouvrir.
Ouvrez le fichier .rels du fichier Zip, depuis le bloc-notes :
Dans le champ "Fichier de type", sélectionnez l'option "Tous les fichiers".
Recherchez et ouvrez le fichier .rels dans le dossier dézippé (dans le sous répertoire _rels).
Toujours pas de problème (théoriquement)
Et c'est maintenant que ça cloche
Sauvegardez et refermez le fichier .rels.
Rezippez le dossier complet.
Supprimez l'extension .zip et renommez le classeur si nécessaire.
Ouvrez le classeur. Vous constatez qu'un nouvel onglet nommé "OngletPerso" est ajouté dans le ruban.
car je ne comprends pas très bien et je me plante
Aurais-tu la gentilesse de me préciser comment je peux, en définitive, créer ce fameux fichier qui répondra à mes besoins, en utilisant bien sûr le code que tu m'as donné.
Un grand merci d'avance et bonne soirée
Bonsoir à tous,
@Jacky, Ca c'est une méthode que vous pourrez utiliser plus tard une fois bien assimilé les fonctionnalités.
Pour ma part je vous conseille de télécharger l'application bassée sur Access que vous devez pouvoir ouvrir puisque vous posséder Office 365.
Donc rendez-vous sur la page de l'assistant Ruban.
Sur le menu de gauche cliquez sur téléchargement.
Vous verrez le lien de téléchargement.
- Une fois téléchargé, ouvrez-le vérifiez les mises à jour dans l'onglet A propos.
- Créer un classeur test puis
- Ajouter un module dont le nom sera Callbacks. ou autres selon vos envies.
- Ajouter le minimum requis pour le ruban. La procédure pour le OnAction du bouton que l'on ajoutera plus tard. Pour ma part je fais en sorte que tous les cotrôle bouton pointent vers la même procédure OnActionButton, ensuite je fais un Select Case pour chaque contrôle.
'@Description "Callback for event button click."
Public Sub OnActionButton(Control As IRibbonControl)
Select Case Control.id
Case "btnRunMacro"
Ribbon.RunMainForm
Case "btnDisplayLogFile"
MsgBox "Oupsss... Tout reste à faire."
Case "grpDisplay_dlB"
MsgBox "Oupsss... Tout reste à faire."
Case Else
Debug.Print "Case """; Control.id; """" ' vbTab; "' "; Control.Tag; """" ' // cette ligne crée automatiquement la section case avec le nom du contrôle ;)
End Select
End SubNous pouvons ajouter La procédure qui sera lu au chargement du ruban.
'@Description "Callback sur le chargement du ruban."
Public Sub OnRibbonLoad(Ribbon As IRibbonUI)
Set mUIRibbon = Ribbon
mUIRibbon.ActivateTab "tab1"
End SubUn fois fait on enregistre et ferme le classeur.
Dans l'onglet Ruban de l'assistant cliquer sur Charger un fichier Office, sélectionner le fichier fraichement créé.
Voilà maintenant c'est au tour du ruban:
Dans l'onglet Ruban cliquer sur nouveau, La racine se met en place.
Maintenant clic droit sur customUI() et on sélectionne ribbon, puis clic droit sur ribbon et on sélectionne tabs (Onglets) C'est le parent des tab.
On continu clic droit sur tabs () et on sélectionne notre premier onglet tab ()
Si tout c'est bien déroulé nous en sommes ici.
On va ajouter un groupe (les groupes sont une manière de classer les fonctions, (fichier Office, Ruban XML, Actions sur le ruban etc. pour le ruban de l'assistant)
A partir de maintenant il faut faire bien attention à certains points
- Les fichiers xml sont sensible à la casse, donc attention aux minuscules et majuscules.
- Les contrôles doivent avoir des ID uniques, sinon plantage et le ruban ne s'affichera pas.
Une bonne pratique consiste à pouvoir intercepter les erreurs sur le ruban, pour cela il faut cocher une option dans les options Excel Options/Options avancées/Générales/Afficher les erreurs du complément d'utilisateur. Si une erreur est levée Excel indiquera la ligne de l'erreur.
Maintenant nous pouvons ajouter les contrôles au groupe.
Nous allons ajouter un bouton:
Clic droit sur Group (group1) et on sélectionne Button (Bouton) à ce stade nous devons avoir ceci :
Pour chaque élément du ruban nous avons ses propriétés sur la droite de la fenêtre. Les plus importantes sont :
- Id : Identifiant unique
- Label : ce qui sera afficher sur le bouton
- OnAction : pour un bouton c'est la procédure qui sera lancé sur le clic
Les autres ne sont pas obligatoires pour le début.
Au dessus de la fenêtre de navigation il y à l'éditeur Xml un clic sur la page et l'on peut voir le résultat du fichier xml créé.
Voilà il ne reste plus qu'a vérifier le fichier Groupe Action sur le ruban/Valider
Si tout est OK nous pouvons Sauvegarder le fichier.
Voilà c'est là qu'il faut bien lire la documentation pour connaître toutes les ficelles d'utilisation du ruban. Et de la personnalisation de chaque contrôle.Dans le ruban de l'assistant groupe Fichier Office nous avons la possibilité d'ouvrir le fichier Excel
Voilà bonne programmation.