VBA : modifier la couleur d'un bouton de commande en fonction de sa caption

Bonjour à tous,

Je suis bloqué pour une macro.

Savez-vous s'il existe un code qui traduirait ceci :

En cliquant sur boutoncommand1

Dans userform1 : recherche du bouton ayant pour caption "xxxxx"

Sélection de ce bouton.

Changement de backcolor de ce bouton.

J'ai réussi à changer tous les boutons, mais pas celui ciblé...

Merci

Bonjour,

Private Sub boutoncommand1_Click()
    Dim cmd As Control, clr&
    clr = RGB(R, G, B) 'Définir la couleur...
    For Each cmd In Me.Controls
        If TypeOf cmd Is MSForms.CommandButton Then
            If cmd.Caption = "XXXXX" Then
                cmd.BackColor = clr
                Exit For
            End If
        End If
    Next cmd
End Sub

Cordialement.

Re-Bonjour MFerrand,

Ne faut-il pas prévoir dans ton code de retirer les couleurs des boutons colorés lors d'une éventuelle exécution antérieure du code ?

Un truc du genre :

Private Sub boutoncommand1_Click()
    Dim cmd As Control, clr&
    clr = RGB(R, G, B) 'Définir la couleur...
    For Each cmd In Me.Controls
        If TypeOf cmd Is MSForms.CommandButton Then
            If cmd.Caption = "XXXXX" Then
                cmd.BackColor = clr
            Else: cmd.BackColor = RGB(80, 80, 80)
            End If
        End If
    Next cmd
End Sub

Re Pedro,

Retirer la couleur non, en mettre une autre peut-être... Il est sûr que si l'on modifie la couleur en fonction de l'intitulé, si on modifie les intitulés cela devrait entraîner re-modification des couleurs... La méthode est à adapter à ce qu'on veut globalement faire...

Cordialement.

Re Pedro,

Retirer la couleur non, en mettre une autre peut-être... Il est sûr que si l'on modifie la couleur en fonction de l'intitulé, si on modifie les intitulés cela devrait entraîner re-modification des couleurs... La méthode est à adapter à ce qu'on veut globalement faire...

Cordialement.

je manque de clarté, mais on s'est compris !

Je crois aussi ! La question est posée hors contexte, lorsque le contexte sera précisé on pourra ajuster la réponse...

Bonjour à tous les 2 et merci de vous pencher sur mon cas.

Ne faut-il pas prévoir dans ton code de retirer les couleurs des boutons colorés lors d'une éventuelle exécution antérieure du code ?

Si c'est possible de faire sans je préfère ne pas supprimer les couleurs. Pour l'instant ils sont vert pâle, si un onglet change en rose, le bouton associé à cet onglet devient rose également, les autres restent vert.

Private Sub boutoncommand1_Click()
    Dim cmd As Control, clr&
    clr = RGB(R, G, B) 'Définir la couleur...
    For Each cmd In Me.Controls
        If TypeOf cmd Is MSForms.CommandButton Then
            If cmd.Caption = "XXXXX" Then
                cmd.BackColor = clr
                Exit For
            End If
        End If
    Next cmd
End Sub

Malheureusement ton code ne marche pas MFerrand. Mais c'est peut-être parce que j'ai oublié de dire que le bouton qui actionne cette macro est lui-même dans un autre userform (userform_palette). J'ai donc essayé de modifier "Me.controls " par "userform1.controls" mais après j'ai des messages d'erreur de type rowsource.

Pour simplifier, je vous renvoie mon tableur. Je l'ai à nouveau beaucoup simplifié pour qu'il soit moins lourd et cibler le problème.

Il vous suffit d'aller dans un des onglets "activité", de cliquer sur "changer la couleur de l'onglet". Le userform_palette s'ouvre alors. C'est en cloquant sur ces boutons que j'aimerais que ceux du userform1 changent de couleur.

Merci beaucoup.

73cahier-as-auto.xlsm (409.61 Ko)

Evidemment, ce n'est plus la même question !

Si Pedro a du temps, je lui laisse la primeur !

Je n'ai que 2 mains...

Personne pour m'aider ??

Ta demande initiale :

En cliquant sur boutoncommand1

Dans userform1 : recherche du bouton ayant pour caption "xxxxx"

Sélection de ce bouton.

Changement de backcolor de ce bouton.

Tu balances ensuite un classeur sans préciser :

où trouver le fameux boutoncommand1 ?

par quoi était renvoyé le "xxxxx" ?

et quel autres détails utiles pour définir avec précision l'opération...

Vu l'état de ton code (tu es adepte de code à rallonge et très répétitif...), je ne vais sûrement pas plonger dedans. Ni travailler avec !

En l'absence de quelque chose de rationnel à faire, j'ai trouvé ta palette assez plaisante et l'ai extraite pour la recoder. Un petit exercice pour moi... Je t'en remercie.

Au stade actuel, je stocke la couleur cliquée dans une variable. Je refléchis à comment rendre son utilisation multiforme, peut-être en déplaçant la variable dans un Module standard pour pouvoir utiliser la couleur une fois le Userform fermé.

Cordialement.

Vu l'état de ton code (tu es adepte de code à rallonge et très répétitif...), je ne vais sûrement pas plonger dedans. Ni travailler avec !

Je fais ce que je peux, avec ce que j'ai et le temps dont je dispose.

où trouver le fameux boutoncommand1 ?

Le userform_palette s'ouvre alors. C'est en cliquant sur ces boutons que j'aimerais que ceux du userform1 changent de couleur.

j'ai trouvé ta palette assez plaisante et l'ai extraite pour la recoder

Je t'en prie sers toi...

Merci quand même...

Merci ! Je te la restituerai... après l'avoir rétablie dans sa fonction (pour ça il faut que je lise le code...)

Mais pour la suite que tu veux lui faire assurer tu es toujours aussi peu clair : qu'est-ce qui identifie le bouton "xxxxx" du userform1 ?

Et coloration de boutons d'un Userform cela recouvre deux types de solutions distinctes : soit une intervention au niveau du VBE pour en modifier la couleur, soit dans la mesure où les couleurs de boutons sont alignées sur des couleurs d'onglets (et autres éléments de feuilles) par une initialisation de Userform1 qui procède à cet alignement à son ouverture.

Quelques détails supplémentaires ne seraient pas superflus !

Cordialement.

Ok, pardon. Je reprends.

Dans l'onglet "inscr AS" , en cliquant sur "inscrire un(e) élève)" tu peux ouvrir le userform1 sur lequel figurent 20 boutons "Inscrire en Activité 1", "Inscrire en Activité 2"...

Grâce à vous j'ai trouvé le moyen de changer la caption de ces boutons en changeant le nom de l'activité. Donc si, en appuyant sur "changer d'activité" je change "Activité 1" en "handball", le bouton du userform1 associé changera en "Inscrire en Handball".

Je voudrais créer la même procédure avec la couleur. Si dans l'un des onglets activité j'appuie sur le bouton de changement de couleur, le userform_palette apparaît et en cliquant sur une couleur, les cellules changent de couleur, la couleur de l'onglet aussi et je voudrais que le bouton du userform1associé prenne la même couleur.

Donc pour essayer d'être bien clair il faudrait coder cette procédure.

Par exemple , avec l'onglet "Activité 1" actif.

En cliquant sur le commandbutton1 du userform_palette (couleur blanche).

Recherche d'un bouton dans userform1 dont la caption est "Inscrire en "&Activesheet.name soit "Inscrire en Activité 1"

Changement du backcolor en blanc.

J'espère avoir été plus clair.

Ça devient effectivement plus clair ! Mais il faut d'abord que je recode la coloration effectuée à partir de ta palette, soit éliminer le code en 48 exemplaire pour le rétablir sur un seul.

Pour l'instant, j'ai sérieusement allégé la codification en supprimant tout pour réécrire la partie fonctionnelle, soit récupérer la couleur cliquée. J'avais également pour la rendre plus générique ajouté un bouton pour supprimer la coloration... lequel est facilement ôtable pour rétablir l'utilisation que tu en faisais.

Une fois rétabli le code de coloration, je pense qu'il n'y aura pas d'obstacle à y greffer la coloration du bouton de Userform1...

Mais comme j'ai eu l'occasion de le dire ailleurs, je suis dans des préparatifs de départ, et ma check-list pour aujourd'hui et demain est déjà longue. Il n'est donc pas sûr que j'aboutisse d'ici demain, ce qui nous renverrait à mercredi ou jeudi, une fois rendu à destination. Je te tiens au courant de l'avancée...

Cordialement.

Ok,

Mais il faut d'abord que je recode la coloration effectuée à partir de ta palette, soit éliminer le code en 48 exemplaire pour le rétablir sur un seul.

Franchement si tu y arrives chapeau !! Et je suis curieux de voir ce code !

Pas de souci pour le délai, c'est déjà très sympa de t'en occuper.

Merci beaucoup !

Bonjour,

Réintégré mon home ! Mais comme habituellement en pareil cas, j'ai pas mal de tâches domestiques accumulées, quelques tâches administratives et ma programmation médicale à mettre en place...et à récupérer un petit peu... Tout ça va se décanter durant le weekend

Recoder sur une procédure ne pose pas en soi de difficulté, dès lors que l'on a le renvoi de la couleur au clic sur le bouton. La couleur de police se récupère facilement elle, alternativement noir ou blanc selon la couleur de fond. La seule, non pas difficulté, mais je dirais complication, relève de la disposition irrégulière de tes plages à colorer...

Des complications en grande partie évitables si l'on pense, au moment de la conception à ce qui devra être fait par la suite. On peut alors choisir des dispositions qui faciliteront le travail au lieu de le compliquer.

En attendant que je m'y mette, tu peux étudier mon exercice Palette...

Pour pouvoir tester, la palette s'ouvre sur raccourci Ctrl+e, et en non modal, pour que l'on puisse enchaïner... elle se limite à colorer la cellule active (ou à la décolorer).

Hormis ces aspects conjoncturels d'environnement, qui sont modifiables à loisir, l'important est ce sur quoi repose le renvoi de la couleur au clic sur un bouton.

Je n'ai pas modifié tes couleurs, ni la numérotation des boutons (bien que les ayant renommés). J'ai constaté que tu ne faisais varier tes couleurs que sur certaines valeurs des composantes RVB, 6 paliers que j'ai indicé 0 à 5, et j'ai introduit en Tag de chaque bouton un code BVR permettant le calcul de la couleur attachée au bouton.

Le regroupement des boutons couleurs est par ailleurs opéré au moyen d'un Module de classe. Ce qui permet un code réduit pour renvoyer la couleur du bouton.

Cordialement.

35palettetest.xlsm (33.66 Ko)

Bonjour MFerrand,

Merci de t'être penché sur mon souci.

Des complications en grande partie évitables si l'on pense, au moment de la conception à ce qui devra être fait par la suite.

A la base ce fichier n'était destiné qu'à mon établissement, et ça ne me dérangeait pas de faire toutes les manips mais d'autres établissements me l'ont demandé et je ne me vois pas rentrer les paramètres à chaque fois. D'où ma volonté d'essayer de tout automatiser.

Je vais essayer de jeter un oeil à ce que tu as fait mais après avoir regardé très rapidement c'est très loin de ce dont je suis capable et il va falloir que je décode tout ça ligne par ligne

Merci en tout cas.

Bon, on avance, malgré le rhume que je me suis pris dans mes derniers déplacements... J'ai réintégré la palette dans ton fichier, telle qu'elle était, mais en conservant les noms de boutons renommés, et reconstruit la procédure qui manquait encore :

Sub ClrClic()
    Dim nm$, Plg, i%, j%, k%
    nm = ActiveSheet.Name
    Plg = Split("A1 A3:BN3 F4:F150 BM4:BN151 F151:BL152 BP153:BR162")
    With Worksheets(nm)
        .Tab.Color = CurClr
        For i = 0 To UBound(Plg)
            With .Range(Plg(i))
                .Interior.Color = CurClr
                .Font.Color = FClr
            End With
        Next i
    End With
    With Worksheets("Cahier AS")
        For j = 0 To 9
            For k = 0 To 1
                If .Cells(j * 16 + 2, k * 10 + 1) = nm Then GoTo PosAS
            Next k
        Next j
PosAS:
        If j < 10 Then
            Plg = Split("A1:E14 F1:H9")
            For i = 0 To UBound(Plg)
                With .Range(Plg(i)).Offset(j * 16, k * 10)
                    .Interior.Color = CurClr
                    .Font.Color = FClr
                End With
            Next i
            Plg = Split("A1:B1 A14 H8:H9")
            For i = 0 To UBound(Plg)
                With .Range(Plg(i)).Offset(j * 16, k * 10)
                    .Interior.ColorIndex = xlColorIndexNone
                End With
            Next i
        End If
    End With
    nm = "Inscrire en " & nm
    With ThisWorkbook.VBProject.VBComponents("UserForm1")
        For i = 1 To 24
            With .Designer.Controls("CommandButton" & i)
                If .Caption = nm Then
                    .BackColor = CurClr
                    .ForeColor = IIf(FClr = vbWhite, vbCyan, RGB(0, 128, 128))
                    Exit For
                End If
            End With
        Next i
    End With
End Sub

C'est à partir du module de classe (dont j'ai complété la procédure) que le clic sur un bouton couleur alimente 2 variables niveau module Userform : CurClr (couleur du bouton), FClr (couleur de police associée à la couleur du bouton), puis lance la proc. ci-dessus :

Elle opére en 3 temps : sur la feuille à partir de laquelle le Userform a été lancé, sur la feuille Cahier AS et sur Userform1.

C'est finalement assez simple, et allège de façon conséquente le code... Pas le temps pour l'instant de regarder d'autres codes qui mériteraient d'être revus... mon étape suivante va être la pharmacie !

Cordialement.

Bonjoue MFerrand,

Je viens de tester vite fait, tout se passe (presque) parfaitement. Donc déjà un grand bravo.

Le souci c'est que quand j'essaye d'ouvrir mon Userform1 en passant par le bouton "Inscrir(e) un(e) élève", il me met une erreur de type rowsource.

J'essaierai de voir si je peux régler ça tout seul.

Un grand merci à toi en tout cas et bon courage pour le travail.

Cousin-hub

Dans le fichier que tu avais communiqué et que j'ai retourné, "Base_élèves", source d'une Combo de userform1 affiche Réf! (référence invalide). L'erreur dans ce fichier est normale si la référence n'est pas rétablie.

Cordialement.

Rechercher des sujets similaires à "vba modifier couleur bouton commande fonction caption"