Coloriser les boutons options quand il est sélectionné et inversement

Bonjour à tous,
Je souhaiterais activer le backcolor des boutons options ( 1 seul à la fois ) quand il est sélectionné mais surtout le remettre à sa couleur par défaut lorsqu'il ne l'est plus.
Actuellement, quand je clique sur un autre que le "400B" la sélection se fait bien mais la couleur reste.

Le but final de cela sera de ne faire apparaitre que les pièces concernées par le modèle de moto. Mais c'est un autre débat.
En attendant, si vous avez aussi la solution pour que ma variable "wsh" fonctionne... (on peut l'appeler autrement si nécessaire).
J'ai essayé "String" et "Object" mais ça bloque l'un comme l'autre.

 Dim wsh as String

Je suis débutant en VBA... vous l'aurez deviné.

Merci d'avance

2025 07 07 143507
Private Sub OptionButton400B_Click()        ' sélectionne les réponses si ces 2 conditions sont vraies
    Dim wsh
'  wsh = ThisWorkbook.Sheets("Honda")

    If OptionButton400B = True Then
        OptionButton400B.BackColor = &H80FFFF   ' surligne en jaune quand activé
     '  If wsh.Range("AE") = "400" And wsh.Range("BB") = "B" Then       ' colonne cyl_400 et typ_B
        Else
        OptionButton400B.BackColor = &H8000000F    ' revient à la couleur par défaut quand désactivé
    End If

End Sub

Bonjour,

Dans votre macro, avant d'appliquer la couleur sur le bouton sélectionné, il faut remettre la couleur par défaut à tous les boutons, ensuite vous pouvez changer la couleur du bouton sélectionné.

Si j'avais eu le fichier, je vous l'aurai fait.

Cdlt

Bonjour papicx, Arturo83

Si je comprends bien le code, vous n'utilisez pas de module de classe

Il est vrai que la compréhension n'est pas simple quand on débute, mais alors qu'est-ce que c'est pratique

Voici un petit exemple avec 3 OptionButton, que vous pourrez reprendre facilement je pense

A+

merci à vous deux, je vais tenter de mettre un module de classe.

J'ai bien noté la remarque de Arturo83.
Je vous fais un retour rapidement.

Bonjour à tous,

Je rebondis sur l’excellente proposition de @JExcelFr :

Pour bien comprendre :

Il a créé une classe, c’est-à-dire un « modèle/moule » (Une classe est un modèle, comme un « moule » à gâteau. Quand on crée un objet à partir de cette classe, on dit qu’on l’instancie : on « fabrique un gâteau avec le moule ». Ici, chaque bouton de l’UserForm sera associé à une instance de cette classe. Pour plus d’infos => Web « classe en programmation »). Puis, dans cette classe (Classe1) il a mis un bouton : la variable : Public WithEvents Opt As MSForms.OptionButton.

Il est noté « WithEvents » car ce bouton, comme un Userform, fonctionne avec des évènements : quand on le clique, en interne se lance le sub Opt_Click // le bouton est cliqué, et quand on en clique un autre (quand ils sont liés dans la même frame/même UF), alors se lance le sub Opt_Change // le bouton change d’état. L’utilisation du mot-clé WithEvents permet de capter ces évènements, et d’y ajouter du code. On ne peut faire cela qu’avec une classe contenant le bouton, afin d’avoir accès à ces 2 subs « internes ».

Ainsi, il ne reste qu’à implémenter ces 2 subs en indiquant que quand un bouton est cliqué : il voit sa couleur devenir jaune, et quand son état change, on met à jour sa couleur en fonction de son nouvel état interne (cliqué ou non). L’intérêt de la classe, c’est qu’on peut centraliser la logique de changement de couleur en un lieu unique pour tous les OptionButton de l’Userform.

Ensuite, on passe dans le code de l’Userform. Pour connecter le fonctionnement de la classe à votre UF, il faut 2 étapes : c’est le rôle du code dans UserForm_Initialize et de la variable Private Opt() As New Classe1.

La variable Opt() est nécessaire pour stocker en mémoire une liste de nos « instances » : les boutons qui doivent changer de couleur.

Le code dans UserForm_Initialize parcours les Controles de l’UF, et s’ils sont du type compatible avec notre classe (MSForms.OptionButton), alors on crée une instance de la classe pour chacun, que l’on ajoute à notre tableau Opt(). Ces instances restent en mémoire tant que l’UserForm est actif.


Ce commentaire a simplement une vocation explicative, j'espère que c'est clair et que je ne vous ai pas embrouillé. Merci à JExcelFr pour le code.

Bonjour à tous,

Merci pour ce tuto très détaillé qui m'aide à comprendre un peu ce qui se passe, mais j'avoue que je serai bien incapable de partir d'une page blanche pour en faire un nouveau. Je souligne que ça fait avancer un peu mes faibles connaissances en VBA, donc MERCI.

J'ai donc réussi à faire un nouveau module de classe comme suggéré. Le principe des modules de classe, c'est juste puissant !

Je me permets d'ajouter que j'ai mis un moment à trouver comment renommer le module de classe alors que c'est tout simple à faire.
Le nommage des modules permet de s'y retrouver quand on en a plusieurs, comme dans mon cas.
Il suffit de modifier le nom dans les propriétés et, bien évidemment, corriger le nom dans le code du formulaire pour que ça fonctionne.

Private Opt() As New ClasseOptionBouton
2025 07 08 102549

Comme j'avais déjà un bloc pour l'initialisation du formulaire, j'ai inclus la partie de code dedans en prenant soin de "l'entourer" de commentaires pour la compréhension du code

  ' ########### début de contrôle des couleurs des boutons Option de choix des motos
  Dim Ctl As Control
  Dim OptCount As Integer
  ' Mettre la couleur de fond normale
  For Each Ctl In Me.Controls
    If TypeOf Ctl Is MSForms.OptionButton Then
      Ctl.BackColor = &H8000000F    ' couleur par défaut des boutons
      OptCount = OptCount + 1
      ReDim Preserve Opt(1 To OptCount)
      Set Opt(OptCount).Opt = Ctl
    End If
  Next Ctl
  ' ########### fin de contrôle des couleurs des boutons Option de choix des motos

voici le résultat. (excusez moi, je ne sais pas faire de petite vidéo)

MERCI beaucoup.

2025 07 08 102858
Rechercher des sujets similaires à "coloriser boutons options quand selectionne inversement"