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.
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 SubJ'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 SubTechniquement 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 SubBibu
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 PropertyJ'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,
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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