Définir a quel moment se lance le ruban personalisé
Bonjour à tous, je travail actuellement sur la mise en place d'un ruban personnalisé et cela avance bien, toutefois le ruban ne se charge que lorsque plusieurs macro lancées au démarrage on terminées leur Job
Est il possible de définir dans le code ou le ThisWorkbook le lancement du ruban avant toute autre opération?
J'espère avoir été clair mais n'hésitez pas si ma question ne l'est finalement pas.
Merci d'avance et bonne journée à tous
Bonjour,
Le fichier correspondant aurait été le bien venu
Cordialement
Bonjour,
Mais le code de personnalisation du ruban en question se trouve-t-il dans un addin/votre classeur PERSONAL ou bien dans le code du fichier dont vous parlez ?
S'il se trouve dans le fichier que vous ouvrez, vous pouvez mettre l'appel à votre macro de personnalisation tout en haut de Workbook_Open.
Private Sub Workbook_Open()
' d'abord appel de la procédure de modification du ruban
MaPersonalisationDuRuban
' reste du code
End SubMerci de vos réponses
@saboh12617 il n'y a pas de code propre à la personnalisation du ruban qui soit visible pour le lancement, il est intégré via officeribbonXEditor, le ruban personnalisé ne s'active qu'après que le code ai géré les fonctions d'ouverture (Gestion utilisateurs et menu principal) et j'aimerait qu'il s'active dès que le fichier s'ouvre (Le fichier est maintenant joint à ce fil de discussion)
@Jacky, je joint le fichier, comme évoqué sur un autre fil de discussion, le code est en cours d'optimisation.
Au lancement du fichier vous avez la possibilité de ne pas lancer le code en répondant non au msgbox d'ouverture, le ruban personnalisé désactivant le ruban classique Excell, accès au code par Alt F11
Bonne journée à tous
re-bonjour,
j'aimerait qu'il s'active dès que le fichier s'ouvre
dans ce cas je rejoins "à deux pieds" Saboh
en effet il suffit de l'appeler dès l'ouverture du fichier dans Worbook Open
Cordialement
Re,
Je ne connais pas trop l'outil officeribbonXEditor, mais de ce que j'ai pu lire ce n'est pas lié au VBA... donc difficile à piloter avec du VBA.
Perso quand j'ouvre votre fichier j'ai le ruban personnalisé qui s'affiche directement (fonctionnement attendu), mais c'est sans doute puisque j'ai désactivé les macros à l'ouverture. Je pense donc que votre problème est le suivant :
Quand vous ouvrez le fichier, la petite fenêtre qui demande de passer en mode automatique ou non se lance immédiatement (dès que le code VBA est chargé) alors même que d'autres éléments (comme le ruban) n'ont pas encore été chargés. Et une fois qu'elle s'affiche elle bloque/met en pause le chargement du classeur.
Pour corriger cela je vous propose 2 solutions :
1) Ajoutez DoEvents en haut du Sub Workbook_Open pour laisser au classeur le temps de finir de se charger avant d'afficher la MsgBox.
Private Sub Workbook_Open()
DoEvents
' reste du code
End Sub2) Si ce n'est pas suffisant, ajoutez un petit délai (à définir manuellement) avant de lancer la suite du code, par exemple 2 secondes :
Private Sub Workbook_Open()
DoEvents
Application.Wait Now + TimeValue("0:00:02")
DoEvents
' reste du code
End SubA tester...
merci de votre interret, j'ai testé cette proposition et ma temps important sur l'option 2 le ruban n'apparait que lorsque toute la procédure de lancement est terminée.
En désactivant la question d'origine on a directement la gestion des droits utilisateur qui s'effectue et la fenêtre "typeaction" qui se lance, ce n'est que lorsque celle-ci et les question qui en découlent sont terminées que le ruban s'active.
Je pense en effet qu'il me faudrait une procédure permettant de le lancer moi même mais je ne trouve pas comment faire avec officeribbonXEditor ni comment l'appeler à l'ouverture
je vais chercher en e sens
Bonjour,
C'est du lourd hein !
Dans ce qui suit il est supposé que le classeur s'ouvre automatiquement dans la feuille d'accueil (parce qu'elle a été activée juste avant la dernière fermeture dans le BeforeClose)
... et non pas dans une feuille Utilisateur mais dans un UserForm.
créer une procédure ResetRibbon avec
Sub ResetRibbon()
If Not (MonRuban Is Nothing) Then
MonRuban.Invalidate
End If
End SubDans le WorkbookOpen mettre :
DoEvents
ResetRibbon
'Ensuite ta procédure de logging (il est supposé que cela se fait via un UserForm qui contiendra dans le Activate la suite des instructions relatives aux personnalisations)Ne possédant pas 365 je ne pourrai pas aller plus loin dans ma participation.
A+
dans la procédure de reset j'ai juste dséfini la variable comme suit :
Dim MonRuban As IRibbonUI
mais malheureusement cela ne change rien j'ai essayé un doevent avant et après le reset du ruban mais il continue de se charger comme avant
ci dessous extrait des codes
'@procedure de lancement du ruban
Sub ResetRibbon()
Dim MonRuban As IRibbonUI
If Not (MonRuban Is Nothing) Then
MonRuban.Invalidate
End If
End Sub
Private Sub Workbook_Open()
'lancement du ruban
DoEvents
ResetRibbon
DoEvents
'procedure de gestion utilisateur
initialisation.UtilisateursEtMenu
lancement_ouverture
end subTu n'as aucune raison d'avoir de macro à exécuter avant de lancer ton USF de logging et tant que l'utilisateur ne s'est pas identifié, il n'y a aucune raison que ton USF ne fasse autre chose qu'attendre.
Ce qui est quand même bizarre c'est que chez moi il passe bien ton ribbon.Tu es certain que tes Options de gestion de Confidentialité sont Ok ?
En particularité le "Accès approuvé..."
A+
Encore merci pour le temps passé a chercher à solutionner mon problème, en effet ces options sont bien paramétrées.
Quand tu dis que le ribbon passe bien chez toi que fait il précisément? Chez moi il se lance en effet mais uniquement quand la fenêtre "typeaction" a terminé son Job, tan qu'elle est ouverte, le ribbon est celui standard de Excell et pas mon perso et ce que je cherche à faire c'est justement qu'il se lance dès l'ouverture du fichier avant même de charger quoi que ce soit d'autre
il se lance dès le départ chez toi?
Bonne journée
Bonjour à tous?
Malheureusement, la procédure Workbook_Open s’exécutera toujours avant le chargement du ruban. Donc impossible d'y travailler dessus, surtout avec des formulaires qui bloquent le déroulement de l'ouverture du classeur (demande de mot de passe etc..).
Une solution de contournement ?
- Ne pas mettre de code bloquant dans Workbook_Open
- Créer un procédure dans les Callbacks 'OnRibbonLoad' (Ou autre nom)
- Faire un appel dans à cette procédure dans le fichier Xml
- Dans cette procédure vous pouvez sauvegarder le pointeur du ruban.
- Faire appel à d'autres conditions d'ouvertures
- Vous pourriez ajouter deux zones de textes dans le ruban.
- Vérifier si l'identifiant Session est correct
- Vérifier si l'identifiant Profile est correct
- Ajuster le classeur en fonction des deux entrées
Prenez bien le temps de lire la documentation. Je vous conseille l'assistant ruban car il est bien abouti, pratique à utilser et relativement stable.
Je vois que vous utiliser Office 365 donc vous devez adapter le ruban à minimum Office 2010 et le nommer 'customUI14'
Pour le ruban :
- Éviter en mode développement de cacher les onglets Excel
Voici un exemple de fichier avec les fameuses zones de texte et deux boutons qui ne sont là que pour afficher si le fichier et Bloqué ou pas.
<!-- Copyright Jean-Paul (Valtrase) 08/2025 -->
<!--Ruban Loréal-->
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"
onLoad="OnRibbonLoad">
<ribbon startFromScratch="true">
<!---->
<tabs>
<!--L'Oréal général-->
<tab id="tabGeneral"
label="L'ORÉAL"
visible="true">
<group id="grpUsers"
autoScale="true"
centerVertically="false"
label="Utilisateurs"
getVisible="GetVisible"
tag="RibbonName:=;inMenu:=;CustomTagValue1:=;CustomTagValue2:=;CustomTagValue3:=;CustomPicture:=;CustomPicturePath:="
image="General3">
<box id="box1"
boxStyle="vertical"
visible="true">
<labelControl id="labelControl1"
enabled="true"
visible="true"
label="Identifiant session :"/>
<labelControl id="labelControl2"
enabled="true"
visible="true"
label="Identifiant profil :"/>
</box>
<box id="box2"
boxStyle="vertical"
visible="true">
<editBox id="ebxSessionId"
enabled="true"
visible="true"
screentip="Identifiant session."
supertip="Renseigner votre identifiant session pour pouvoir vous connecter."
onChange="OnChangeEditBox"
getText="GetTextEditBox"
tag="Key:=SessionID;DefaultValue:="
sizeString="00000000000000"/>
<editBox id="ebxProfileId"
enabled="true"
visible="true"
screentip="Identifiant de profil."
supertip="Renseigner votre identifiant de profil pour pouvoir vous connecter."
onChange="OnChangeEditBox"
getText="GetTextEditBox"
tag="Key:=ProfileID;DefaultValue:="
sizeString="00000000000000"/>
</box>
<separator id="separator1"
visible="true"/>
<button id="btnLocked"
enabled="true"
getVisible="GetVisible"
image="General2"
label="Compte verrouillé"
onAction="OnActionButton"
screentip="Compte verrouillé."
supertip="Le compte est verrouillé entrer un identifiant de session et de profil valide, pour pouvoir accéder aux fonctionnalités.
Si vous n'avez pas de compte faites une demmande aux administrateurs."
size="large"/>
<button id="btnUnlocked"
enabled="true"
getVisible="GetVisible"
image="General1"
label="Compte accessible"
onAction="OnActionButton"
screentip="Compte accessible."
supertip="Le compte est accessible, vous pouvez accéder à l'ensemble des fonctionnalités."
size="large"/>
<separator id="separator2"/>
<button id="btnContactAdmin"
size="large"
label="Contacter les administrateurs"
screentip="Contacter les administrateurs."
supertip=" Demander de l'aide ou faites une suggestion aux administrateurs."
image="Contact2.png"
onAction="OnActionButton"
enabled="true"
getVisible="GetVisible"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>Pour ma part j'appelle les mêmes procédures pour chaque classe de contrôles. par exemple pour les boutons de commande ce sera : onAction="OnActionButton"
Ensuite je fais le tri avec un select case, je trouve cela plus simple (je suis vieux et j'ai du mal à retenir ...) exemple :
'@Description "Callback for Button-Click."
Public Sub OnActionButton(Control As IRibbonControl)
Select Case Control.ID
Case "btnContactAdmin"
'Todo "Make something"
Case Else
' // Si pas reconnu le select case du bouton sera créer et afficher dans la fenêtre d'exécution
Debug.Print "Case """; Control.ID; """"
End Select
End SubBonne programmation...
P.S. J'ai oublié les images...
Bonjour @Jean-Paul, le "Onribbonload" qui lance le reste c'est exactement ce que je cherchait, le ruban se lance et envoie le reste du code, mon IT bloque l'utilisation du officeribbonxeditor mais je regarde cela sur mon PC perso dès ce WE
Un grand merci également pour tous ces nouveaux conseils
Petite question subsidiaire concernant les images, j'ai beaucoup de mal à trouver des images perso pour le ruban qui soient libre de droit, avez vous une sorce interessante?
Merci encore et bonne journée
Re,
Pour les icônes je vais sur Icones8
Je sélectionne Icônes:
Je fait défiler et je sélectionne Windows (Ou parfois Andrïde)
Si vous voulez des icônes Remplies (Filled) Sélectionner Windows 11 sinon cliquer sur Afficher les 6 styles en dessous.
Moi j'utilise Windows 10 tout court.
Faire la recherche dans la barre de recherche en haut. Parfois si pas de résultat faire un test en lui parlant en Anglais.
En regardant de plus près vous verrez qu'il y a tout un tas de modifications possibles et le téléchargement sur plusieurs tailles.
Ici un dossier avec une icône auxiliaire.
Le même dossier avec une autre icône auxiliaire.
Amusez-vous bien...
P.S. J'ai remarqué à l'utilisation que selon le thème d'Excel sélectionné les images s'affichaient mal, par défaut j'utilise un gris clair qui passe sur tous les thèmes. Exemple RGB(212, 212, 212).
Super, merci beaucoup pour toutes ces informations, bonne journée
Le travaille avance, j'ai envoyé mon code dans la procédure de lancement du Ruban, malheureusement ce code semble être trop bloquant, le ruban ne s'affiche qu'après avoir effectuer l'ensemble du code.
Pour le ruban lui même, je me suis concentré pour le moment sur la partie graphique afin de commencer à maitriser ces instructions nouvelles pour moi, je verrais les callback ensuite, j'ai n'ai donc mi aucun appel de procédure, un grand merci à @Jean-Paul pour son aide avec de bonnes base, pour le moment 2 ponts bloquants :
je ne parviens pas à afficher une image sur le libellé des groupes
je ne parviens pas à centrer le bouton "boutonverouillé" sous l'ensemble des deux lignes de labelcontrol et editbox, j'ai pourtant mis cet ensemble dans un "boxprincipale", Pb de hauteur totale?
ci dessous le code pour le ruban personalisé et ci joint le fichier avec avancement à ce jour
Merci d'avance de votre aide et bonne journée à tous
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"
onLoad="Ouverture_Ruban">
<!--mettre "true" pour masquer tous les autres onglets standards-->
<ribbon startFromScratch="true">
<tabs>
<!-- Crée un onglet personnalisé: -->
<!-- L'onglet va se positionner automatiquement à la fin du ruban. -->
<!-- Utiliser insertAfterMso="NomOngletPrédéfini" pour préciser l'emplacement de l'onglet -->
<tab id="Outil_validation" label="Outil de Validation" visible="true">
<group id="Général" autoScale="true" centerVertically="false" label="Général" visible="true" image="General3">
<button id="Contact" enabled="true" visible="true" label="Contact Gestionnaire" screentip="Génère un mail aux administrateurs"
image="contact" supertip="Demandez de l'aide ou faites une suggestion aux administrateurs" size="large" onAction="clic_sur_bouton" />
<button id="Quitter" enabled="true" visible="true" label="Quitter Application" screentip="Permets de sortir de l'application"
image="Quitter" supertip="Pour sortir proprement avec remise en état de tous les paramètres" size="large" onAction="clic_sur_bouton" />
</group>
<group id="Session" autoScale="true" centerVertically="false" label="Générateur de session" image="General3">
<box id="boxprincipale" boxStyle="vertical" visible="true">
<box id="box1" boxStyle="vertical" visible="true">
<labelControl id="LbIdSession" enabled="true" visible="true" label="Identifiant session :"/>
<labelControl id="LbIdProfil" enabled="true" visible="true" label="Identifiant profil :"/>
</box>
<box id="box2" boxStyle="vertical" visible="true">
<editBox id="SaisieNomSession" enabled="true" visible="true" screentip="Identifiant session." supertip="Renseigner votre identifiant session pour pouvoir vous connecter."/>
<editBox id="SaisieNomProfil" enabled="true" visible="true" screentip="Identifiant de profil." supertip="Renseigner votre identifiant de profil pour pouvoir vous connecter."/>
</box>
<button id="Boutonverouille" enabled="true" image="General2" label="Dévérouiller" visible="true"
screentip="Compte verrouillé." supertip="La session de simulation est verrouillée, entrez un identifiant de session et de profil valide puis cliquez sur ce bouton pour pouvoir accéder aux fonctionnalités du profil choisi. Si vous n'avez pas de compte faites une demmande aux administrateurs." size="normal"/>
</box>
</group>
</tab>
</tabs>
</ribbon>
</customUI>Bon, j'ai trouvé un solution temporaire pour que l'ensemble soit plus propre visuellement mais ce n'est malheureusement pas parfaitement aligné, j'ai utilisé l'alignement horizontal, il semble qu'avec l'alignement vertical il ne veuille pas mettre 3 élément de hauteur sur le ruban @Jean-Paul avez vous déjà eu ce soucis?
le code donne cela :
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"
onLoad="Ouverture_Ruban">
<!--mettre "true" pour masquer tous les autres onglets standards-->
<ribbon startFromScratch="true">
<tabs>
<!-- Crée un onglet personnalisé: -->
<!-- L'onglet va se positionner automatiquement à la fin du ruban. -->
<!-- Utiliser insertAfterMso="NomOngletPrédéfini" pour préciser l'emplacement de l'onglet -->
<tab id="Outil_validation" label="Outil de Validation" visible="true">
<group id="Général" autoScale="true" centerVertically="false" label="Général" visible="true" image="General3">
<button id="Contact" getEnabled="activeBoutonContact" visible="true" label="Contact Gestionnaire" screentip="Génère un mail aux administrateurs"
image="contact" supertip="Demandez de l'aide ou faites une suggestion aux administrateurs" size="large" onAction="clic_sur_bouton" />
<button id="Quitter" getEnabled="activeBoutonQuitter" visible="true" label="Quitter Application" screentip="Permets de sortir de l'application"
image="Quitter" supertip="Pour sortir proprement avec remise en état de tous les paramètres" size="large" onAction="clic_sur_bouton" />
</group>
<group id="Session" autoScale="true" centerVertically="false" label="Générateur de session" image="General3">
<box id="box1" boxStyle="horizontal" visible="true">
<labelControl id="LbIdSession" getEnabled="activeLabelSession" visible="true" label="IdentifiantS :"/>
<editBox id="SaisieNomSession" getEnabled="activeSaisieSession" visible="true" screentip="Identifiant session." supertip="Renseigner votre identifiant session pour pouvoir vous connecter."/>
</box>
<box id="box2" boxStyle="horizontal" visible="true">
<labelControl id="LbIdProfil" getEnabled="activeLabelProfil" visible="true" label="IdentifiantP :"/>
<editBox id="SaisieNomProfil" getEnabled="activeSaisieProfil" visible="true" screentip="Identifiant de profil." supertip="Renseigner votre identifiant de profil pour pouvoir vous connecter."/>
</box>
<box id="box3" boxStyle="horizontal" visible="true">
<button id="BoutonVerouille" getEnabled="activeBoutonVerouillé" image="General2" label="Dévérouiller simulation" visible="true" size="normal"
screentip="Compte verrouillé." supertip="La session de simulation est verrouillée, entrez un identifiant de session et de profil valide puis cliquez sur ce bouton pour pouvoir accéder aux fonctionnalités du profil choisi. Si vous n'avez pas de compte faites une demmande aux administrateurs."/>
</box>
</group>
</tab>
</tabs>
</ribbon>
</customUI>Pour l'image des groupe, cet attribut n'est pas disponible sur l'élément group même si Office RibbonX editor accèpte la commande "image" sur un groupe.
Niveau code, l'activation / désactivation de chaque élément est en place
Je bute encore sur le changement d'image d'un bouton en fonction d'un état, j'ai trouvé cette possibilité avec une image externe mais pas avec une image interne....
Bon ça avance doucement
ci joint le fichier avec l'avancement actuel, bonne soirée à tous
Bonjour à tous,
@Patrick Petits retours sur votre code.
Quand vous dites :
Pour l'image des groupe, cet attribut n'est pas disponible sur l'élément group même si Office RibbonX editor accèpte la commande "image" sur un groupe.
Ce n'est pas tout à fait juste, l'image est acceptée, mais visible que si le ruban est rétréci. voici un exemple
Ruban complet :
Ruban rétréci :
S'il vous plait, si vous ne voulez pas avoir de problème pas d'accents sur les ID de contrôles et pour la portabilité du code je dirais pas d'accents du tout.
Le ruban accepte trois lignes de contrôles avec une taille standards si vous en mettez quatre cela ne fonctionnera pas comme voulu.
Je bute encore sur le changement d'image d'un bouton en fonction d'un état, j'ai trouvé cette possibilité avec une image externe mais pas avec une image interne....
Pour une image interne, cela ne fonctionne qu'avec les images MSO, pas les images personnelles.
Merci @Jean-paul pour toutes ces subtilités, je comprends mieux pourquoi associer potentiellement une image à un groupe.
Noté pour les accents, je vais corriger
pour les images je vais retravailler l'ensemble je ne parviens pas à mettre trois lignes mais cela est probablement lié au fait que ces lignes sont intégrées dans un box.
J'intègre toutes ces subtilités et la prise en main du reste du code pour lancer les actions et récupérer le contenu des "editbox", je préfère me baser sur votre exemple mais sans le recopier tel quel afin de bien comprendre comment le maitriser
je ne manquerait pas de vous tenir informé, encore un grand merci et bon Week end
Re,
En règles générales il vaut mieux selon moi regrouper les fonctions et procédures par taches dans vos modules, Par exemple tous les modules"macroDimmensionner..." devrait être regroupés en un seul. De même Ouverture_Ruban devrait faire parti de votre Module Callbacks ( Ou autre nom).
Prenez l'habitude de préfixer vos procédures du nom du module qui les contient. Cela facilitera la lecture à ceux qui ne sont pas dans votre tête...
Voici un petit exemple avec trois lignes dans les box (Qui doivent être en vertical) Une pour les labels un autre pour les zones de texte. Jouez sur l'attribut Size des zone de texte pour augmenter leurs dimensions. On peut aussi ajouter par exemple un bouton qui ne sert à rien si ce n'est qu'afficher le status du compte utilisateur. Pour cela il faudra agir avec :
- Le getLabel du bouton pour changer son Label (Attention il faut désactiver l'attribut label...)
- le getImage du bouton pour charger l'image activé ou désactivé (avec la fonction LoadPicture.)
<!-- Copyright Jean-Paul (Valtrase) 08/2025 -->
<!--Ruban Loréal-->
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"
onLoad="OnRibbonLoad">
<ribbon>
<!---->
<tabs>
<!--L'Oréal général-->
<tab id="tabGeneral"
label="L'ORÉAL"
visible="true">
<group id="grpUsers"
autoScale="true"
centerVertically="false"
label="Utilisateurs"
getVisible="GetVisible"
tag="RibbonName:=;inMenu:=;CustomTagValue1:=;CustomTagValue2:=;CustomTagValue3:=;CustomPicture:=;CustomPicturePath:="
image="General3">
<button id="btnContactAdmin"
size="large"
label="Contacter les administrateurs"
screentip="Contacter les administrateurs."
supertip=" Demander de l'aide ou faites une suggestion aux administrateurs."
image="Contact2.png"
onAction="OnActionButton"
enabled="true"
getVisible="GetVisible"/>
<separator id="separator1"
visible="true"/>
<box id="box1"
boxStyle="vertical"
visible="true">
<labelControl id="labelControl1"
enabled="true"
visible="true"
label="Identifiant session :"/>
<labelControl id="labelControl2"
enabled="true"
visible="true"
label="Identifiant profil :"/>
<labelControl id="labelControl3"
enabled="true"
visible="true"
label="Status du compte :"/>
</box>
<box id="box2"
boxStyle="vertical"
visible="true">
<editBox id="ebxSessionId"
enabled="true"
visible="true"
screentip="Identifiant session."
supertip="Renseigner votre identifiant session pour pouvoir vous connecter."
onChange="OnChangeEditBox"
getText="GetTextEditBox"
tag="Key:=SessionID;DefaultValue:="
sizeString="00000000000000000000"/>
<editBox id="ebxProfileId"
enabled="true"
visible="true"
screentip="Identifiant de profil."
supertip="Renseigner votre identifiant de profil pour pouvoir vous connecter."
onChange="OnChangeEditBox"
getText="GetTextEditBox"
tag="Key:=ProfileID;DefaultValue:="
sizeString="00000000000000000000"/>
<button id="btnAccountStatus"
enabled="true"
getVisible="GetVisible"
image="General2"
onAction="OnActionButton"
screentip="Compte verrouillé."
supertip="Le compte est verrouillé entrer un identifiant de session et de profil valide, pour pouvoir accéder aux fonctionnalités.
Si vous n'avez pas de compte faites une demmande aux administrateurs."
getLabel="GetLabel"
size="normal"/>
</box>
</group>
</tab>
</tabs>
</ribbon>
</customUI>et le résultat :
Bonne programation.
