XL 2021 Afficher une palette de 10 couleurs dans le ruban

  • Initiateur de la discussion Initiateur de la discussion Dudu2
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Dudu2

XLDnaute Barbatruc
Bonjour,

J'aimerais afficher une petite palette de 10 couleurs dans le ruban dans un fichier de Macros utilisé en Compléments .xlam.

1747738893337.png


Je sais qu'il y a la ressource de @patricktoulon qui permet d'intervenir dans le Ruban mais partant de zéro, je ne sais pas par quel bout prendre le problème.

Merci par avance pour toute suggestion ou même proposition.
 
Solution
a ben si tu veux tu importe par vba (si tu sais faire)
mais surtout c'est le contenu du xlam qui doit aller dans le sample
étapes
ouvrir le sample
  1. si le xlam n'est pas activer l'ouvrir
  2. transférer le contenu (module et feuille du xla) dans le sample
  3. donner un nom au vbaproject du sample (celui qui ne le fait pas y prend des baffes)
  4. fermer ou déactiver le xla
  5. enregistrer sous
  6. choisir format xlam(le dialogue se positionne sur le dossier des addins )
  7. cliquer sur l'ancien xlam
terminé ton groupe palette est intégré dans ton xlam

et si un jour tu decide un beau dimanche ou n'importe quel jour de la semaine
de modifier ton ruban avec customUi editor ou l'exellent magnifique lumineux creatorRibbonx voici le...
Bonjour il te faut le faire avec un editeur customUI le mien ou un autre
avant de customUiser ton xlam (avec mon applicatif ou autre) tu pourrait le faire dynamiquo
3 solutions
1° en creant des multiple commandbar pour aligner des boutons
2°créer un officeUI dynamique en xml par vba
3° ajouter les fichier de customisation avec mon applicatif ou autre (customUI)
 
Ah, je n'ai pas expliqué... Sorry !
C'est juste pour colorer la sélection de cellule(s).
Bon, selon l'explication de @patricktoulon, faut que je creuse un peu pour le costume oui 🥸
VB:
Public Const PaulRouge = "255"
Public Const Jaune = 65535
Public Const Vert = 65280
Public Const Bleu = 15174705
Public Const Violet = 14438496
Public Const Orange = 1338847
Public Const Olive = 2329968
Public Const Rose = 13811710
Public Const Gris = 10395294
Public Const Turquoise = 16645413
 
ben le problème c'est que c'est des couleur special il te faut donc passer par des image perso
il n'existe pas de coloration de bouton en customUI
je peux essayer neanmoins quelque chose de dynamico en officeUI
se sera un bouton ouvrant un menu avec des bouton avec pour icon des carré en couleur demandée

sinon il faudra passer par mon creatorRibbonX all image et non creatorRibbonX imagemso et je suis le seul a l'avoir le all image 🤣

tu veux que je te tente quelque chose maintenant que j'ai les couleurs?
 
ok
alors voila
dans le module "thisworkbook" ton xlam (ET PAS AILLEURS!!!)
dans le workbook.opent tu va mettre
il faudra bien evidemment changer le chemin !!!!!!!!!!!!!!
VB:
Const fichier = "C:\Users\patricktoulon\AppData\Local\Microsoft\Office\Excel.officeUI"
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Kill fichier
End Sub

Private Sub Workbook_Open()
CreateRibbon
End Sub

dans un module standard (TOUJOURS DANS LE XLAM!!!) tu va mettre ceci
VB:
'Auteur: patricktoulon

Public Const PaulRouge = "255"
Public Const Jaune = 65535
Public Const Vert = 65280
Public Const Bleu = 15174705
Public Const Violet = 14438496
Public Const Orange = 1338847
Public Const Olive = 2329968
Public Const Rose = 13811710
Public Const Gris = 10395294
Public Const Turquoise = 16645413
Const fichier = "C:\Users\patricktoulon\AppData\Local\Microsoft\Office\Excel.officeUI"


Sub CreateRibbon()
    Set docXML = CreateObject("Microsoft.XMLDOM")    'creation
    Set CUI = docXML.appendchild(docXML.createelement("customUI"))
    CUI.setattribute "xmlns", "http://schemas.microsoft.com/office/2009/07/customui"
    CUI.setattribute "onLoad", "CustomUIOnLoad"
    Set oCreation = docXML.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8"" standalone=""yes""")    'creation de l'entete du process
    docXML.InsertBefore oCreation, docXML.ChildNodes.Item(0)    'insertion parametre process
    Set ribbonX = docXML.createelement("ribbon"):
    CUI.appendchild (ribbonX)
    Set BtabS = docXML.createelement("tabs")
    ribbonX.appendchild (BtabS)
    Set BtaB = docXML.createelement("tab"): BtaB.setattribute "idMso", "TabHome"
    BtabS.appendchild (BtaB)
    Set bgroup = docXML.createelement("group"): bgroup.setattribute "id", "gColorPerso": bgroup.setattribute "label", "Palette Color"
    BtaB.appendchild (bgroup)
    Set Button = docXML.createelement("button"): Button.setattribute "id", "bColorPerso": Button.setattribute "label", "Afficher Palette Color"
    Button.setattribute "imageMso", "HappyFace" 'choisir l'icon que l'on veux ici
    bgroup.appendchild (Button)
    Button.setattribute "onAction", ThisWorkbook.FullName & "!afficher_la_palette"
    Button.setattribute "size", "large"
    If Dir(fichier) <> "" Then Kill fichier
    SaveFormatDocToFileXL docXML, fichier
    CommandBars("ribbon").Reset
    'Debug.Print code
End Sub

Sub afficher_la_palette()
    Dim barre
     colorxs = Array(PaulRouge, Jaune, Vert, Bleu, Violet, Orange, Olive, Rose, Gris, Turquoise)
    nom = Array("PaulRouge", "Jaune", "Vert", "Bleu", "Violet", "Orange", "Olive", "Rose", "Gris", "Turquoise")
    On Error Resume Next
    CommandBars("colorperso").Delete
    On Error GoTo 0
   
    Set barre = CommandBars.Add("colorperso", msoBarPopup, False, True)
    For i = 0 To UBound(colorxs)
       
        With barre.Controls.Add(msoControlButton, 1, , , True)
            .Caption = nom(i)
            With Cells(Rows.Count, Columns.Count)
                .Interior.Color = colorxs(i)
                .CopyPicture Format:=xlBitmap
            End With
            .PasteFace
            .OnAction = "ChangeColorCell"
            .Tag = colorxs(i)
        End With
    Next
    barre.ShowPopup
    'le menu s'auto detruit
    On Error Resume Next
    CommandBars("colorperso").Delete
    On Error GoTo 0
End Sub
Sub ChangeColorCell()
    Selection.Interior.Color = Val(CommandBars.ActionControl.Tag)
End Sub



'fonction pour enregistrer au format UTF-8
Public Sub SaveFormatDocToFileXL(ByVal doc, ByVal FileName As String)
    Dim ReaderXml As Object, StreamFormaté As Object, WriterFormat As Object, elem
    Set ReaderXml = CreateObject("MSXML2.SAXXMLReader.6.0")
    Set StreamFormaté = CreateObject("ADODB.Stream")
    Set WriterFormat = CreateObject("MSXML2.MXXMLWriter")
    With StreamFormaté
        .Open
        .Type = 1    'adTypeBinary
        With WriterFormat
            .omitXMLDeclaration = False
            .standalone = True
            .byteOrderMark = False    'If not set (even to False) then
            '.encoding is ignored.
            .Encoding = "utf-8"    'Even if .byteOrderMark = True
            'UTF-8 never gets a BOM.
            .indent = True
            .Output = StreamFormaté
            With ReaderXml
                Set .contentHandler = WriterFormat
                Set .dtdHandler = WriterFormat
                Set .errorHandler = WriterFormat
                .putProperty "http://xml.org/sax/properties/lexical-handler", WriterFormat
                .putProperty "http://xml.org/sax/properties/declaration-handler", WriterFormat
                .Parse doc
            End With
        End With
        If Dir(FileName) <> "" Then Kill fichier
        .SaveToFile FileName
        .Close
    End With
    Set ReaderXml = Nothing
    Set StreamFormaté = Nothing
    Set WriterFormat = Nothing
End Sub
enregistre les modifs de ton xla(sélectionne n'importe quel module dans le xlam eten haut dans VBE fichier/ 'enregistrer....."
1747749031659.png



terminé
normalement tu devrai avoir ceci

demo1.gif


c'est un premier Jet hein j'ai pas tout bien déclaré les variables et out tout mais mon le moteur est là
il faudrait entre autre verifier si l'utilisateur n'a pas deja personnalisé son ruban en mode OfficeUI
car si c'est le cas il perd sa personnalisation
il faudra donc ajouter a mon moteur non pas la creation du officeUI mais la sauvegarde de l'originale et créer mon item da"ns une copie de ce fichier de personalisation officeUI

tu me diras
😉
 

Pièces jointes

re:
et voila le fichier mis au propre
bichonné,toiletté,code commenté,etc...
on a donc
le chemin du officeUI est automatiquement trouvé

dans le module thisworkbook du xlam
  • 1° à l'appel du open on sauvegarde le fichier officeUI si il existe
  • 2° à la fermeture on remet l'original si il existait
  • 3° on appelle la sub de creation du bouton dans le ruban

VB:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    fichier = Environ("LocalAppData") & "\Microsoft\Office\Excel.officeUI"
    fichier2 = Environ("LocalAppData") & "\Microsoft\Office\Excel.officeUIBack"
     If Dir(fichier) <> "" Then Kill fichier
     If Dir(fichier2) <> "" Then
          Name fichier2 As Replace(fichier2, ".officeUIBack", ".officeUI")
    End If
End Sub

Private Sub Workbook_Open()
    fichier = Environ("LocalAppData") & "\Microsoft\Office\Excel.officeUI"
    If Dir(fichier) <> "" Then sauvegardeofficeUI
    CreateRibbon
End Sub

dans un module standard du xlam

  • la sub de creation dans le ruban
  • la sub de creation du popup
  • la sub de sauvegarde
  • la sub appellée par les bouton du popup
  • la fonction de creation de fichier officeUI formatée avec code indenté
  • exemple en commentaire de ce que l'on doit obtenir comme code xml
VB:
'Auteur: patricktoulon
Option Explicit

Public Const PaulRouge = "255"
Public Const Jaune = 65535
Public Const Vert = 65280
Public Const Bleu = 15174705
Public Const Violet = 14438496
Public Const Orange = 1338847
Public Const Olive = 2329968
Public Const Rose = 13811710
Public Const Gris = 10395294
Public Const Turquoise = 16645413
Public fichier As String
Public fichier2 As String

'ici on va cré le xml pour ajouter le bouton dans l'onglet"Accueil"("TabHome" en customUI)
Sub CreateRibbon()
    Dim DocXmL, CuI, RibbonX, oCreation, BtabS, BtaB, bGrouP, ButtoN
    Set DocXmL = CreateObject("Microsoft.XMLDOM")    'creation
    Set CuI = DocXmL.appendchild(DocXmL.createelement("customUI")) 'creation de balise cusomUI
    'ses attributs
    CuI.setattribute "xmlns", "http://schemas.microsoft.com/office/2009/07/customui"
    CuI.setattribute "onLoad", "CustomUIOnLoad"
    
    Set oCreation = DocXmL.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8"" standalone=""yes""")    'creation de l'entete du process
    DocXmL.InsertBefore oCreation, DocXmL.ChildNodes.Item(0)    'insertion parametre process
    
    Set RibbonX = DocXmL.createelement("ribbon") 'creation de  balise "ribbon"
    CuI.appendchild (RibbonX)
    
    Set BtabS = DocXmL.createelement("tabs") 'creation de la balise tabs(qui contient tout les tab(onglets du ruban)
    RibbonX.appendchild (BtabS)
    
    Set BtaB = DocXmL.createelement("tab"): BtaB.setattribute "idMso", "TabHome" 'creation de balise tab
    BtabS.appendchild (BtaB)
    
    'creation de balise "group"
    Set bGrouP = DocXmL.createelement("group"): bGrouP.setattribute "id", "gColorPerso": bGrouP.setattribute "label", "Palette Color"
    BtaB.appendchild (bGrouP)
    
    'creation de balise button(le bouton)
    Set ButtoN = DocXmL.createelement("button"): ButtoN.setattribute "id", "bColorPerso": ButtoN.setattribute "label", "Afficher Palette Color"
    ButtoN.setattribute "imageMso", "HappyFace" 'choisir l'icon que l'on veux ici
    bGrouP.appendchild (ButtoN)
    'les attribut du bouton
    ButtoN.setattribute "onAction", ThisWorkbook.FullName & "!afficher_la_palette" 'sa macro associée
    ButtoN.setattribute "size", "large" ' style gros bouton
    
    'creation du fichier officeUI
    fichier = Environ("LocalAppData") & "\Microsoft\Office\Excel.officeUI"
    SaveFormatDocToFileXL DocXmL, fichier
    'un petit reset ça fait du bien par ou ça passe
    CommandBars("ribbon").Reset
    'Debug.Print code
End Sub

Sub afficher_la_palette()
    Dim barre, ColoRx, Noms, i&, ColorXs
    'on reprend les constantes en array
    ColorXs = Array(PaulRouge, Jaune, Vert, Bleu, Violet, Orange, Olive, Rose, Gris, Turquoise)
    'on reprend les constante en noms
    Noms = Array("PaulRouge", "Jaune", "Vert", "Bleu", "Violet", "Orange", "Olive", "Rose", "Gris", "Turquoise")
    'on delete le popup si il existe
    On Error Resume Next
    CommandBars("colorperso").Delete
    On Error GoTo 0
    
    'creation de la barre popup
    Set barre = CommandBars.Add("colorperso", msoBarPopup, False, True)
    'création des bouton du popup
    For i = 0 To UBound(ColorXs)
        
        With barre.Controls.Add(msoControlButton, 1, , , True)
            .Caption = Noms(i) 'on lui donne son texte de caption
            'on colorie une cellule loin loin loin  avec la couleur index i
            With Cells(Rows.Count, Columns.Count)
                .Interior.Color = ColorXs(i)
                .CopyPicture Format:=xlBitmap 'on copie la cellule en picture
            End With
            .PasteFace 'on colle l'image au bouton
            .OnAction = "ChangeColorCell" 'on lui donne sa macro au bouton
            .Tag = ColorXs(i) 'on met la couleur dans le tag du bouton
        End With
    Next
    Cells(Rows.Count, Columns.Count).Interior.Color = xlNone 'on nettoie la cellule qui nous a servir a faire les icons de couleur
    barre.ShowPopup 'on affiche le popup
    'le menu s'auto detruit
    On Error Resume Next
    CommandBars("colorperso").Delete
    On Error GoTo 0
End Sub
Sub ChangeColorCell()
    'Cette ma"cro est appeler par tout les boutons
    'on donne la couleur a la cellule a"vec la va"leur du tag du bouton cliqué
    Selection.Interior.Color = Val(CommandBars.ActionControl.Tag)
End Sub



'le customui et officeUI travaillent  en UTF-8 alors
'fonction pour enregistrer au format UTF-8 avec le MSXML2 transféré dans le adodb stream
' le code est propre et indenté comme tout xml qu'il se doit d'être
Public Sub SaveFormatDocToFileXL(ByVal doc, ByVal FileName As String)
    Dim ReaderXml As Object, StreamFormaté As Object, WriterFormat As Object, elem
    Set ReaderXml = CreateObject("MSXML2.SAXXMLReader.6.0")
    Set StreamFormaté = CreateObject("ADODB.Stream")
    Set WriterFormat = CreateObject("MSXML2.MXXMLWriter")
    With StreamFormaté
        .Open
        .Type = 1    'adTypeBinary
        With WriterFormat
            .omitXMLDeclaration = False
            .standalone = True
            .byteOrderMark = False    'If not set (even to False) then
            '.encoding is ignored.
            .Encoding = "utf-8"    'Even if .byteOrderMark = True
            'UTF-8 never gets a BOM.
            .indent = True
            .Output = StreamFormaté
            With ReaderXml
                Set .contentHandler = WriterFormat
                Set .dtdHandler = WriterFormat
                Set .errorHandler = WriterFormat
                .putProperty "http://xml.org/sax/properties/lexical-handler", WriterFormat
                .putProperty "http://xml.org/sax/properties/declaration-handler", WriterFormat
                .Parse doc
            End With
        End With
        If Dir(FileName) <> "" Then Kill fichier
        .SaveToFile FileName
        .Close
    End With
    Set ReaderXml = Nothing
    Set StreamFormaté = Nothing
    Set WriterFormat = Nothing
End Sub

'fonction de sauvegarde du fichier officeUI de personnalisation si il existe  déjà
' en le renomant en back
Sub sauvegardeofficeUI()
    fichier = Environ("LocalAppData") & "\Microsoft\Office\Excel.officeUI"
    If Dir(fichier) <> "" Then
        Name fichier As Replace(fichier, ".officeUI", ".officeUIBack")
    End If
End Sub

'exemple du résultat à obtenir
'<?xml version="1.0" encoding="utf-8" standalone="yes"?>
'<customUI onLoad="CustomUIOnLoad" xmlns="http://schemas.microsoft.com/office/2009/07/customui">
'    <ribbon>
'        <tabs>
'            <tab idMso="TabHome">
'                <group id="gColorPerso" label="Palette Color">
'                    <button id="bColorPerso" label="Afficher Palette Color" imageMso="HappyFace" onAction="C:\Users\patricktoulon\Desktop\palette color dynamique perso customUi Mixte commandbars.xlsm!afficher_la_palette" size="large"/>
'                </group>
'            </tab>
'        </tabs>
'    </ribbon>
'</customUI>
voilà avec ça t'es paré
patrick
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
40
Affichages
3 K
Retour