VBA et les collections d'objets.

Dernière mise à jour le 18 mai 2008 à 04:28 par lermite222
Publié par lermite222

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.
Meilleures réponses pour « VBA et les collections d'objets. » dans :
[VBA] Collections de classes et collections d’objets Voir Cette démo emploi, comme le titre l’indique, des collections différentes. Elle ne comporte que deux séries de cinq contrôles mais peut en gérer beaucoup plus avec le même nombre de lignes de code. Introduction Les contrôles sur une feuille de...
VBA Un timer une seconde tout simple VoirEn VBA, il n'y a pas (du moins à ma connaissance) de composant Timer. On peut en créer un très facilement. Dans un module de feuille Activer/ dés activer le timer : Placer un bouton sur Feuil1 et mettre le code... Private Sub...
Découper un objet de l'arrière plan (détourage) VoirParfois on peut vouloir découper un objet de son arrière-plan, par exemple un visage, un fruit posé sur une table, etc. L'outil habituellement utilisé est le lasso, mais l'opération est délicate. On peut également utiliser des calques, mais dans...
[VBA] Ecrire/lire une série de TextBox en une seule Sub VoirEn VBA, les TextBox ne disposent pas d'un index et dans la plupart des cas, pour entrer du texte, on procède par.. TextBox1.Text = Cells(2,1).value TextBox2.Text = Cells(2,2).value TextBox3.Text = Cells(2,3).value Et l'inverse pour lire les...
Objet FileSystemObject (FSO) VoirFileSystemObject L'objet FileSystemObject (FSO) permet de manipuler le système de fichiers de Windows. L'utilisation du modèle d'objet FileSystemObject s'effectue en créant une instance de l'objet Scripting.FileSystemObject l'intermédiaire de la...
Java - Les objets VoirLa création d'objets Un objet est une instance de classe, la création d'objets s'appelle donc l'instanciation. Cette instanciation se fait grâce à l'opérateur new suivi du nom de la classe à instancier et de parenthèses contenant les paramètres...
Les objets en langage C++ VoirLa création d'objets En C++, il existe deux façons de créer des objets, c'est-à-dire d'instancier une classe : de façon statique de façon dynamique La création statique La création statique d'objets consiste à créer un objet en lui affectant un...