Parcourir une collection (issue d'un UsF) dans un module de classe

Bonjour à tous,

Si je viens vers vous aujourd'hui c'est car j'ai un petit problème concernant les modules de classes.

Je dispose d'un Userform correspondant à un formulaire à remplir pour créer des fiches de non-conformités. Il y a donc plusieurs TextBox, Boutons, etc.

image

L'idée ici est de sélectionner le service auquel la fiche de NC est rattachée. Je préfère utiliser des boutons aux Checkbox car ils sont plus visibles. L'opérateur clique sur un bouton pour sélectionner son service, ce qui colore ce même bouton en vert et place tout les autres boutons à la couleur de base. De ce fait, l'opérateur a toujours la vision sur le service sélectionné (coloré en vert).

Voici le code à l'ouverture de l'UsF :

Public BoutonsServices As New Collection

Private Sub UserForm_Initialize()

    Dim Ctl As MSForms.Control

    For Each Ctl In Me.Controls

        If Ctl.Name Like "*cbService*" Then

            Set MyBouton = New cbServiceClass
            Set MyBouton.TargetBouton = Ctl
            BoutonsServices.Add MyBouton
            Ctl.BackColor = &HC0FFFF

        End If

    Next Ctl

End Sub

J'ajoute ces boutons dans un module de classe, et à l'évènement "Clic sur le boutons", je souhaiterais parcourir ma collection "BoutonsServices" afin de colorer tout les boutons de cette collection (sauf celui sur lequel je viens de cliquer) en couleur de base.

Ensuite, dans mon module de classe, j'essaye de boucler sur cette collection, mais c'est là où je pêche :

Public WithEvents TargetBouton As MSForms.CommandButton

Private Sub TargetBouton_Click()

    Dim Ctl As MSForms.Control

    For Each Ctl In ufCreation.BoutonsServices
        'Ici écrire une instruction type :
        'If Ctl.Name <> TargetBouton.Name Then
        '   Ctl.BackColor = #### (couleur au choix)
        'ElseIf
        '   Ctl.BackColor = #### (couleur de sélection)
        'End If
    Next Ctl

End Sub

Techniquement je pourrais réussir à faire ce que je veux en bouclant sur l'intégralité des Contrôles de mon UsF, et en posant une condition (sur le nom, le type, le tag, etc..), mais je me demande s'il est possible de boucler sur la Collection directement.

Je vous joins mon fichier si vous voulez voir le problème dans la globalité,

Bibu

Techniquement avec un code comme celui-ci ça fonctionne parfaitement, prenez plus ma question comme une question globale et pas spécifique à ce sujet ^^

Public WithEvents TargetBouton As MSForms.CommandButton

Private Sub TargetBouton_Click()

    Dim Ctl As MSForms.Control

    serviceSelec = TargetBouton.Caption

    For Each Ctl In ufCreation.Controls
        If Ctl.Name Like "*cbService*" Then
            If Ctl.Name <> TargetBouton.Name Then
               Ctl.BackColor = &HC0FFFF
            Else
               Ctl.BackColor = &HFF00&
            End If
        End If
    Next Ctl

End Sub

Bibu

Bonjour BibuNesco,

Est-ce qu'il ne vaudrait pas mieux utiliser des optionbuttons dans ce cas précis ?

En tout cas, voici une possibilité (il en existe probablement des meilleures) en définissant une propriété au sein de l'Userform, afin de la récupérer dans la classe cbServiceClass :

'MODULE DE CLASSE cbServiceClass
Public WithEvents TargetBouton As MSForms.CommandButton

Private Sub TargetBouton_Click()
Dim tButtons, b
Const cVbGray = &H8000000F
tButtons = UserForms(UserForms.Count - 1).Buttons 'UserForms(UserForms.Count - 1) plus sûr que TargetBouton.parent et évite une fonction intermédiaire
For Each b In tButtons
    b.TargetBouton.BackColor = cVbGray
Next b
TargetBouton.BackColor = vbGreen
End Sub

'MODULE USERFORM
Dim tBTN() As New cbServiceClass, pBTN

Private Sub UserForm_Initialize()
For Each ctrl In Me.Controls
    If TypeName(ctrl) = "CommandButton" Then
        n = n + 1: ReDim Preserve tBTN(1 To n)
        Set tBTN(n).TargetBouton = ctrl
    End If
Next ctrl
Me.Buttons = tBTN
End Sub

Public Property Let Buttons(mBTN)
pBTN = mBTN
End Property

Public Property Get Buttons()
Buttons = pBTN
End Property

J'utilise ici des tableaux plutôt que des collections.

Mais au final, à moins d'avoir un nombre considérable de contrôles, je n'ai pas le sentiment que cette façon d'agir offre un grand avantage...

Sinon, ce que je fais en général (je précise que j'apprends plus que je ne maitrise), c'est que j'ai une classe pour les évènements et une autre classe qui permet l'instanciation de cette classe : dans cette seconde classe, je crée et alimente ma collection de cbServiceClass et je définis tout un tas de méthodes générales (dont celle de création de la collection/tableau de cbServiceClass) à appliquer indifféremment à mes userforms. C'est cette seconde classe que je déclare au niveau de mes userforms.

Cdlt,

Bonjour,

ci_jointe une solution

Salut,

Merci beaucoup à tout les deux, c'est parfait !

L'utilisation de module de classe ici est peut-être un peu bizarre étant donné que je n'ai que deux ou quatres contrôles à gérer, mais dans d'autre projet j'en aurais beaucoup plus, c'est pourquoi je préférais me renseigner sur les MdC et les collections/tableaux etc par rapport à ça.

Je garde ce sujet dans mes "sujets suivis" et je m'y replongerais aussi souvent que nécessaire.

Bibu

Rechercher des sujets similaires à "parcourir collection issue usf module classe"