VBA et les collections d'objets
Quand plusieurs (beaucoup de) contrôles sont mis sur une feuille ou un Userform il est parfois fastidieux d'écrire du code dans chaque évènement des contrôles.
Ce Tuto vous permet de traiter vos contrôles comme s'ils étaient indexés, (mode VB6 avec index)
Préliminaires
Pour les tests et démos, ouvrez un nouveau classeur.
Incorporez, l'un en dessous de l'autre, dans la colonne C ...
OptionButton1 et OptionButton2 propriété GroupName = Feuil1A
OptionButton3 et OptionButton4 propriété GroupName = Feuil1B
CheckBox1, CheckBox2 et CheckBox3
Sauvez le classeur sous le nom Collections.xls
Dans un module
Option Explicit
Public Collect As Collection
Public CollectC As Collection
Public Sub InitOption()
Dim Obj As OLEObject
Dim Cl As Classe1
Set Cl = Nothing
Set Collect = New Collection
Workbooks("Collections.xls").Activate
'boucle sur les objets de la Feuil1
For Each Obj In Sheets("Feuil1").OLEObjects
'verifie s'il s'agit d'un OptionButton
If TypeOf Obj.Object Is MSForms.OptionButton Then
Set Cl = New Classe1
Set Cl.OptionButtonGroup = Obj.Object
Collect.Add Cl
End If
Next Obj
End Sub
Public Sub InitCheck()
Dim Obj As OLEObject
Dim CO As Classe1
Set CO = Nothing
Set CollectC = New Collection
Workbooks("Collections.xls").Activate
'boucle sur les objets de la Feuil1
For Each Obj In Sheets("Feuil1").OLEObjects
'verifie s'il s'agit d'une Checkbox
If TypeOf Obj.Object Is MSForms.CheckBox Then
Set CO = New Classe1
Set CO.CheckBoxGroup = Obj.Object
CollectC.Add CO
End If
Next Obj
End Sub
'Routine à appeler pour Initialiser ou Réinitialiser les collections.
'Nécessaire si le code VBA a été modifié.
Sub ActivationCollect()
InitOption
InitCheck
End Sub
Dans un module de classe
Pour ouvrir un module de classe >> Insertion >> Module de classe.
Copiez ce code...
'--------------------------------------
'Dans un module de classe nommé "Classe1"
'
Option Explicit
Public WithEvents OptionButtonGroup As MSForms.OptionButton
Public WithEvents CheckBoxGroup As MSForms.CheckBox
'Evenement Click sur les CheckBox de la feuille de calcul.
Private Sub CheckBoxGroup_Click()
'Renvoie le nom et la valeur de la CheckBox cliquée
MsgBox CheckBoxGroup.Name & ": " & CheckBoxGroup.Value
'Exemple qui renvoie dans la colonne A, la valeur de CheckBox
Cells(CheckBoxGroup.TopLeftCell.Row, 1) = CheckBoxGroup.Value
End Sub
'Evenement Click sur les CheckBox de la feuille de calcul.
Private Sub OptionButtonGroup_Click()
'Renvoie le nom et la valeur de l'OptionButton cliquée
MsgBox OptionButtonGroup.Name & ": " & OptionButtonGroup.GroupName
'Exemple qui renvoie dans la colonne A, la valeur de l'OptionButton
Cells(OptionButtonGroup.TopLeftCell.Row, 1) = OptionButtonGroup.Value
End Sub
Et dans le module du classeur
Private Sub Workbook_Open()
InitOption
InitCheck
End Sub
A l'ouverture du classeur les collections sont opérationnelles, mais si le code VBA est modifié, les collections seront désactivées, il faudra donc appeler la sub
ActivationCollect soit en mettant le curseur au milieu de la sub et taper F5, soit en créant un raccourci.