VBA et les collections d'objets.
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.