IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Classes et collections


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 75
    Points : 42
    Points
    42
    Par défaut Classes et collections
    Bonjour à tous,
    Alors je vous explique succinctement le contexte.
    Je souhaite ajouter dynamiquement des boutons à un userform et y affecter du code.
    J'ai donc adapté un morceau de code trouvé sur le forum et çà fonctionne.
    Donc pourquoi est-ce que je poste direz-vous?
    En fait je ne maitrise pas trop les classes et les collections. Je ne voudrais donc pas appliquer bêtement le code sans le comprendre. Voici donc le code de base (c'est réduit au strict nécessaire pour les explications):
    Userform
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Public Collect As Collection
    Public CollectBT As Collection
    Private Sub UserForm_Initialize()
    Dim Bouton As MSForms.CommandButton
    Dim Cl As ClasBT
    '
    Set Collect = New Collection
    Set CollectBT = New Collection
    '
    For i = 1 To 3
        Set Bouton = Me.Controls.Add("Forms.commandbutton.1", "equipe" & i, True)
        CollectBT.Add Bouton  'Ajouter à la collection d'objet
        Set Cl = New ClasBT 'Ajouter à la collection de classe
        Set Cl.GroupBoutons = Bouton
        Collect.Add Cl
     
        With CollectBT(i) 'Initialise les boutons
            .Top = i * 30
            .Left = 30
        End With
    Next
     
    End Sub
    Public Sub ControlClick()
        MsgBox "ok "
    End Sub
    Le module de classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public WithEvents GroupBoutons As MSForms.CommandButton
     
    Private Sub GroupBoutons_Click()
     
        Call UserForm1.ControlClick
     
    End Sub
    Voici donc mes questions:
    -CollectBT est la collection des boutons. Ca sert à modifier les propriétés des boutons (position, couleur, etc...) avec un minimum de lignes de code, pour éviter de modifier indépendamment chaque bouton. Est-ce bien là l'intérêt?
    -Cl c'est quoi? Une instance de ClasBT?
    -GroupBoutons c'est quoi, un objet ou une propriété? Parce que çà a l'air d'être une propriété mais dans ce cas comment on peut affecter un bouton à une propriété?
    -et enfin, à quoi sert la collection Collect?

    Merci d'avance pour vos réponses

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Points : 1 394
    Points
    1 394
    Par défaut
    oui la collection est un objet qui permet de référencer d'autres éléments par exemple des objets. Gràace à ça on est capable d'utiliser des boucles for pour appliquer des actions communes groupées sur ces objets. VB6 a la notiond e contrôle array mais pas vba, ainsi en vba quand on veut faire la même chose sur 5 boutons par exemple on les stocke dans une collection.

    cl est bien une instance de la clasBT

    Groupbuttons est une variable de classe qui est en fait un objet de type MSForms.CommandButton. Cette variable est déclarée de façon à supporter les évènements de ce type d'objet (par exemple l'évènement clic). La Private Sub GroupBoutons_Click() dans la classe redéfinit par ailleurs la procédure exécutée lors d'un clic sur un bouton de ce type.

    Avec: Set Cl.GroupBoutons = Bouton
    il dit que les bouton sont de ce type et donc il redéfinit le clic sur ces boutons

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 75
    Points : 42
    Points
    42
    Par défaut
    Merci pour cette réponse rapide.
    Et sais-tu pourquoi il utilise la classe Collect?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Il faut déjà comprendre que dans Excel, du point de vue informatique tous est collection.
    Excel.application : une collection de propriétés et de méthode :
    Collection Excel.application.Workbooks :
    Classeur1.xls, Classeur2.xls,…..
    Collection Excel.application.Workbooks(1).Sheets :
    Feuil1, Feuil2,…
    Excel.application.Workbooks(1).Sheets.Add ajoute une feuille à la collection.
    Ce qui est perturbant c’est que l’on peut définir ça propre collection :
    Dim MyCollection as New Collection de ce fait elle fonctionne comme Excel.application.Workbooks(1).Sheets.Add MyCollection.add
    On peut ajouter deux type de valeur à une collection MyCollection.add 1 ou MyCollection.add MyClass.
    Dans Excel si tout est collection d’une certaine manière tout est class :
    Excel, Classeur1.xls, Feuil1,cells(1,1) sont des Class.
    Je défini une Class comme un variable intelligente sauf qu’elle s’instancie avec le mot New.
    Une class est un programme à part entière ou plus exactement un modèle de programme. On y trouve le descriptif des tâches à effectuer.
    Dans un premier temps on ajoute une class commandbutton puis on ajoute cette class à la class ClasBT qui prend en charge l’événement On_Click.
    C’est un peut succin mais c’est l’idée.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Points : 1 394
    Points
    1 394
    Par défaut
    collectbt contient les boutons
    et collect contient les instance de classe clasbt qui redéfinissent le comportement des boutons.

    Pour savoir à quoi ça sert il faudrait voir plus de code

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 75
    Points : 42
    Points
    42
    Par défaut
    Ce que je n'arrive pas à comprendre c'est qu'on affecte Bouton à ClasBT (via Set Cl.GroupBoutons = Bouton) qui gère l'événement Click.
    Maintenant à quoi sert Collect (et je confirme que si on ne l'utilise pas, çà ne fonctionne pas)

  7. #7
    Invité
    Invité(e)
    Par défaut
    J’ai modifié un peut le code, tu verras que tu peux exécuter différentes actions dans la méthode ControlClick en fonction du contrôle sur lequel tu click.
    userForm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    30
    31
    32
    33
    34
    35
    36
    37
    Public Collect As Collection
    Public CollectBT As Collection
    Private Sub UserForm_Initialize()
    Dim Bouton As MSForms.CommandButton
    Dim Cl As ClasBT
    '
    Set Collect = New Collection
    Set CollectBT = New Collection
    '
    For I = 1 To 3
    Set Bouton = Me.Controls.Add("Forms.commandbutton.1", "equipe" & I, True)
    CollectBT.Add Bouton 'Ajouter à la collection d'objet
    Set Cl = New ClasBT 'Ajouter à la collection de classe
    Cl.ID = I
    Set Cl.GroupBoutons = Bouton
    Collect.Add Cl
     
    With CollectBT(I) 'Initialise les boutons
    .Top = I * 30
    .Left = 30
    End With
    Next
     
    End Sub
    Public Sub ControlClick(ByVal ID As Long)
     Select Case ID
        Case 1
            MsgBox "Test du contrôle N° " & ID
        Case 2
            MsgBox "Même chose mais pour le contrôle N° " & ID
        Case 3
            MsgBox "Et là c'est le contrôle N° " & ID
     End Select
    End Sub
    Public Sub ControlClickDroit(ByVal ID As Long)
        MsgBox "Tu veux de l'aide ?"
    End Sub
    ClasBT:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public WithEvents GroupBoutons As MSForms.CommandButton
    Public ID As Long
    Private Sub GroupBoutons_Click()
     
    Call UserForm1.ControlClick(ID)
     
    End Sub
    Dernière modification par Invité ; 21/06/2013 à 14h12.

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut heu
    bonjour

    le but d'une classe control c'est de gérer leur propriétés dans une seule et meme instance

    il y a plusieur facon d'y arriver

    regarde cet exemple pour les textboxs ICI!!!

    et il y en a d'autre dans les contributions

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par gadsweb Voir le message
    Ce que je n'arrive pas à comprendre c'est qu'on affecte Bouton à ClasBT (via Set Cl.GroupBoutons = Bouton) qui gère l'événement Click.
    Maintenant à quoi sert Collect (et je confirme que si on ne l'utilise pas, çà ne fonctionne pas)
    Bonsoir,
    Une classe dispose des propriétés (variable) et des méthodes (fonction, sub)
    Une class est un modèle (structure) de programme ; les propriétés et les méthodes son unique à la class. Exemple dans la class j’ai une variable ID as long
    Je dispose de 3 instances dim MyClass1 as New ClasBT ,dim MyClass2 as New ClasBT, dim MyClass3 as New ClasBT.
    MyClass1.ID=1, MyClass2.ID=2, MyClass3.ID=3 Chaque class base sur le même modèle, ce trouve affecter d’une même variable mais dispose d’une valeur intrinsèque à chaque instance.
    GroupBoutons est également une variable intrinsèque c’est mon bouton
    ollectBT.Add Bouton 'Ajouter à la collection d'objet
    Set Cl = New ClasBT 'Ajouter à la collection de classe
    Cl.ID = I
    Set Cl.GroupBoutons = Bouton.
    Vu que je veux récupérer l’événement de ce contrôle, je veux l’isoler des autre contrôles une class est idéal.
    Public WithEvents GroupBoutons As MSForms.CommandButton
    La collection quand à elle ce comporte comme un variable tableau, elle permet d’ajouter des contrôles dynamiquement sans avoir à définir une palanqué de variable comme dans l’exemple précédant (control1, control2, control3, control150,…)
    1 CollectBT.Add Bouton 'Ajouter à la collection d'objet
    2 CollectBT.Add Bouton 'Ajouter à la collection d'objet
    3 CollectBT.Add Bouton 'Ajouter à la collection d'objet
    150 CollectBT.Add Bouton 'Ajouter à la collection d'objet
    ….

  10. #10
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Citation Envoyé par gadsweb Voir le message
    Voici donc mes questions:
    -CollectBT est la collection des boutons. Ca sert à modifier les propriétés des boutons (position, couleur, etc...) avec un minimum de lignes de code, pour éviter de modifier indépendamment chaque bouton. Est-ce bien là l'intérêt
    Pour répondre à cette question et si tu n'auras plus besoin de la collection des boutons créés après l'Initialize, tu n'auras pas besoin de CollectBT et ton code se résumera à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Dim Collect As Collection
     
    Private Sub UserForm_Initialize()
    Dim Bouton As MSForms.CommandButton
    Dim Cl As ClasBT
    Dim i As Byte
     
    Set Collect = New Collection
    For i = 1 To 3
        Set Bouton = Me.Controls.Add("Forms.commandbutton.1", "equipe" & i, True)
        With Bouton
            'ici on change toutes les propriétés du contrôle qu'on vient d'ajouter
            .Caption = "Equipe " & i
            .Top = i * 30
            .Left = 30
        End With
     
        Set Cl = New ClasBT
        Set Cl.GroupBoutons = Bouton
        Collect.Add Cl                                 'Ajouter à la collection de classe
     
        'On libère les varaibles non nécessaires
        Set Bouton = Nothing
        Set Cl = Nothing
    Next i
    End Sub
    Remarque, 1 seul module de classe peut gérer les évènements de plusieurs types de contrôles.

    PS. A voir les déclarations.


    '================================================
    Une autre manière (utiliser un tableau au lieu des collections)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Private Const N As Byte = 5
    Dim Tb(1 To N) As New ClasBT
     
    Private Sub UserForm_Initialize()
    Dim Bouton As MSForms.CommandButton
    Dim i As Byte
     
    For i = 1 To N
        Set Bouton = Me.Controls.Add("Forms.commandbutton.1", "equipe" & i, True)
        With Bouton
            .Caption = "Equipe " & i
            .Top = i * 30
            .Left = 30
        End With
     
        Set Tb(i).GroupBoutons = Bouton                'Insérer l bouton créé
    Next i
    Me.Height = 30 * (N + 2)
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  11. #11
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    En redimensionnant le tableau à fur et à mesure (pratiquement identique au second code de mercatog).

    Dans le module de la Form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    30
     
    Dim Btn() As New ClasBT
     
    Private Sub UserForm_Initialize()
     
        Dim I As Integer
     
        For I = 1 To 3
     
            ReDim Preserve Btn(1 To I)
     
            Set Btn(I).GroupeBtn = Me.Controls.Add("Forms.commandbutton.1", "equipe" & I, True)
     
            With Btn(I).GroupeBtn
     
                .Caption = "Equipe " & I
                .Top = I * 30
                .Left = 30
     
            End With
     
        Next I
     
    End Sub
     
    Sub EvenementBouton(Bouton As MSForms.CommandButton)
     
        MsgBox Bouton.Caption
     
    End Sub
    Dans le module de classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Public WithEvents GroupeBtn As MSForms.CommandButton
     
    Private Sub GroupeBtn_Click()
     
       UserForm1.EvenementBouton GroupeBtn
     
    End Sub
    Hervé.

Discussions similaires

  1. Utilisation Modules de classe et collection
    Par jeanjean6 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 13/03/2013, 11h35
  2. classe de collection de paramètre dérivable.
    Par nouknouk dans le forum C++
    Réponses: 8
    Dernier message: 22/10/2012, 14h44
  3. [Toutes versions] Collections de classes et collections d’objets.
    Par LeForestier dans le forum Contribuez
    Réponses: 0
    Dernier message: 22/07/2009, 14h53
  4. exercices "classe et collections" vb
    Par aabdel dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 30/05/2007, 18h36
  5. [VB6]Valeurs une collection renvoyée par la fonction d'une classe
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 30/03/2004, 11h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo