Comment boucler sur des checkboxes via un module de classe quand ces checkboxes sont sur un userform
Bonjour,
J'ai une trentaine de checkboxes qui sont positionnées dans un userform et je souhaite faire un code unique pour l'ensemble en mettant en variable le numéro de ces checkboxes. J'ai trouvé une méthode qui est très proche de ce que je veux grâce à une très vieille discussion (2013) dont je vous mets la conclusion ci-dessous. Mon problème pour y arriver vient du fait que mes checkboxes sont contenues sur l'userform et non dans une feuille comme dans l'exemple, et donc je ne sais pas comment déclarer l'userform à la place de la feuille.
Help please !:)
Citation:
Envoyé par
PMO2017
Bonjour,
Une piste avec le code suivant basé sur une classe.
1) créez un module de classe Class1 et copiez le code suivant
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| Public WithEvents CheckBoxGroup As MSForms.CheckBox
Private Sub CheckBoxGroup_Click()
Dim OL As OLEObject
Dim LB As MSForms.Label
Dim i&
Dim myItem$
'--- Détermine l'ID du CheckBox (les chiffres en final) ---
For i& = 1 To Len(CheckBoxGroup.Name)
If IsNumeric(Mid(CheckBoxGroup.Name, i&, 1)) Then
myItem$ = myItem$ & Mid(CheckBoxGroup.Name, i&, 1)
End If
Next i&
'--- Recherche l'OLEObject correspondant et l'affecte à une variable object MSForms.Label ---
Set OL = ActiveSheet.OLEObjects("Label" & myItem$ & "")
Set LB = OL.Object
'--- Change le caption et la couleur de fonds en fonction de la coche de la CheckBox ---
If CheckBoxGroup.Value Then
LB.Caption = [b1]
LB.BackColor = RGB(204, 255, 204)
Else
LB.Caption = "Merci de valider"
LB.BackColor = RGB(255, 204, 255)
End If
'--- On s'amuse avec d'autres propriétés (accessoirement) ---
LB.WordWrap = False
LB.AutoSize = True
End Sub |
2) copiez le code suivant dans la fenêtre de code de ThisWorkbook
Code:
1 2 3 4 5 6 7
| Private Sub Workbook_Activate()
Call InitializeCheckBoxes(ThisWorkbook.Sheets("test")) 'à adapter par la feuille concernée
End Sub
Private Sub Workbook_Deactivate()
Set MyClass = Nothing
End Sub |
3) copiez le code suivant dans un module Standard
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| Public MyClass As Classe1
Public CollCheckBoxes As Collection
Public Sub InitializeCheckBoxes(Feuille As Worksheet)
Dim OL As OLEObject
Set MyClass = Nothing
'---
Set CollCheckBoxes = New Collection
For Each OL In Feuille.OLEObjects
If TypeOf OL.Object Is MSForms.CheckBox Then
Set MyClass = New Classe1
Set MyClass.CheckBoxGroup = OL.Object
CollCheckBoxes.Add MyClass
End If
Next OL
End Sub |
4) renommez une feuille "test", créez un ActiveX CheckBox1 et un ActiveX Label1.
Sélectionnez les 2 contrôles, copiez les et collez les plusieurs fois de suite pour en avoir une quantité conséquente.
Les contrôles sont appariés de manière qu'à chaque CheckBoxX correspond un LabelX.
5) lancez la procédure "Workbook_Activate" qui est dans ThisWorkBook pour initialiser les contrôles CheckBox
Je mets le classeur exemple en pièce jointe pour faciliter.