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 :

Boucler sur une collection?


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut Boucler sur une collection?
    Bonjour,
    J'ai un module de classe, et une collection, le tout me permet d'ajouter des objets à la collection, et de n'avoir qu'une seule procédure événementielle pour l'ensemble des objets de la collection.

    Je voudrais savoir s'il existe un moyen de retrouver tous les objets de la collection ?
    Pour ajouter les objets j'utilise le code suivant, l'objectif est de pourvoir atteindre les objets depuis "CollectFiltres" qui est la collection.
    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
     
    Dim Obj As Control
    Dim Cl As ClsCmdeSTT
    Set Cl = Nothing
    Set CollectFiltres = New Collection
    For Each Obj In Me.Controls
        If InStr(1, Obj.Name, "Filtre") > 0 Then
            Set Cl = New ClsCmdeSTT
            If TypeName(Obj) = "ComboBox" Then
                Call ChargerFiltres(Obj.Name, Me)
                Set Cl.ListeFiltres = Obj
            ElseIf TypeName(Obj) = "TextBox" Then
                Set Cl.TexteFiltres = Obj
            End If
            CollectFiltres.Add Cl      
        End If
    Next Obj
    J'ai essayé plusieurs codes qui ne fonctionnent pas...
    Merci de votre aide.

  2. #2
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    Ta question est donc finalement : parcourir une collection ?
    Ben ... le plus simplement du monde -->> ainsi (ou toto est la collection)--->>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each article In toto
      MsgBox article
    Next
    ou encore ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 To toto.Count
     MsgBox toto(i)
    Next
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  3. #3
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    C'est ce que j'ai fait, mais j'ai le message "Propriété ou méthode non gérée par cet objet..."

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Code ClsCmdeSTT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public WithEvents Lst As MSForms.ComboBox
    Public WithEvents Txt As MSForms.TextBox
    Private Sub Lst_Change()
    End Sub
     Private Sub Txt_Change()
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim Obj As Object ,CollectFiltres  as New Collection
    For Each Obj In Me.Controls
          If CBool(InStr(1, Obj.Name, "Filtre")) Then
          Select Case TypeName(Obj)
            Case "ComboBox"
                 Call ChargerFiltres(Obj.Name, Me)
                     CollectFiltres.Add New ClsCmdeSTT, Obj.Name
                    Set CollectFiltres(Obj.Name).Lst = Obj
            Case "TextBox"
                  CollectFiltres.Add New ClsCmdeSTT, Obj.Name
                 Set CollectFiltres(Obj.Name).Txt = Obj
         End Select
           End If
    Next

  5. #5
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Merci, je viens d'adapter mon code en fonction de tes corrections.
    Mais j'ai toujours un message d'erreur lorsque je boucle sur ma collection... "Propriété ou methode non gérée par cet objet".

  6. #6
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Un exemple en ajoutant juste une variable "Nom" à la classe.

    Module de l'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
    Option Explicit
     
    Private CollectFiltres As Collection
     
    Private Sub UserForm_Activate()
    Dim Obj As Control
    Dim Cl As ClsCmdeSTT
    Set Cl = Nothing
    Set CollectFiltres = New Collection
    For Each Obj In Me.Controls
        If InStr(1, Obj.Name, "Filtre") > 0 Then
            If TypeName(Obj) = "ComboBox" Then
                Set Cl = New ClsCmdeSTT
                Call ChargerFiltres(Obj.Name, Me)
                Set Cl.ListeFiltres = Obj
                Cl.Nom = Obj.Name
                CollectFiltres.Add Cl
            ElseIf TypeName(Obj) = "TextBox" Then
                Set Cl = New ClsCmdeSTT
                Set Cl.TexteFiltres = Obj
                Cl.Nom = Obj.Name
                CollectFiltres.Add Cl
            End If
        End If
    Next Obj
    End Sub
     
    Private Sub CommandButton1_Click()
    Dim Toto As ClsCmdeSTT
        For Each Toto In CollectFiltres
            MsgBox Toto.Nom
        Next
    End Sub
    Module de classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Option Explicit
     
    Public WithEvents ListeFiltres As MSForms.ComboBox
    Public WithEvents TexteFiltres As MSForms.TextBox
     
    Public Nom As String
     
    Private Sub ListeFiltres_Change()
        MsgBox ListeFiltres.Name
    End Sub
     
    Private Sub TexteFiltres_Change()
        MsgBox TexteFiltres.Name
    End Sub
    EDIT : code userform modifié pour ne pas ajouter, à la collection, des objets "non Filtres"...
    Cordialement,
    Franck

  7. #7
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Merci, mais du coup je récupère le nom du Control mais pas le contrôle en lui même...
    Donc il faudrait que j'utilise "Userform.Control(Toto.Nom)" pour retrouver le contrôle, sauf que je ne connais pas le userform à l'avance...
    Je suis chiant désolé...

    En fait, lors de l'évènement "Change" de l'un des objets de mon userform affectés à ma collection, je souhaite balayer tous les autres objets de la collection pour savoir s'ils contiennent du texte ou pas...
    Et donc pour ça, je dois pouvoir pointer sur les objets eux mêmes... A moins que je récupère le userform avec "ListeFiltres.Parent" dans mon module de classe pour ensuite exploiter la variable "Nom" et ainsi boucler sur mes contrôles...

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour pijaku,
    cette écriture n'est pas bonne, il faut couper le cordon ombilicale avec la collection!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CollectFiltres.Add Cl
    set Cl=nothing
    c'est pour cela que je préfère cette écrite!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     CollectFiltres.Add New ClsCmdeSTT, Obj.Name
    Set CollectFiltres(Obj.Name).Lst = Obj
    @ojo86 tu es sur Mac?

    C'est ce que j'ai fait, mais j'ai le message "Propriété ou méthode non gérée par cet objet..."

    sur quelle N° de ligne!

  9. #9
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Nouveau code 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
    Option Explicit
     
    Private CollectFiltres As Collection
     
    Private Sub CommandButton1_Click()
    Dim Toto As ClsCmdeSTT
     
        For Each Toto In CollectFiltres
            MsgBox Me.Controls(Toto.Nom).Value
        Next
    End Sub
     
    Private Sub UserForm_Activate()
    Dim Obj As Control
     
        Set CollectFiltres = New Collection
        For Each Obj In Me.Controls
            If InStr(1, Obj.Name, "Filtre") > 0 Then Classe_Add CollectFiltres, Obj
        Next Obj
    End Sub
     
    Private Sub Classe_Add(C As Collection, O As Control)
    Dim Cl As ClsCmdeSTT
     
        Set Cl = New ClsCmdeSTT
        If TypeName(O) = "ComboBox" Then
            'Call ChargerFiltres(Obj.Name, Me)
            Set Cl.ListeFiltres = O
        ElseIf TypeName(O) = "TextBox" Then
            Set Cl.TexteFiltres = O
        End If
        Cl.Nom = O.Name
        C.Add Cl
    End Sub
    Cordialement,
    Franck

  10. #10
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Citation Envoyé par dysorthographie Voir le message
    Bonjour pijaku,
    cette écriture n'est pas bonne, il faut couper le cordon ombilicale avec la collection!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CollectFiltres.Add Cl
    set Cl=nothing
    c'est pour cela que je préfère cette écrite!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     CollectFiltres.Add New ClsCmdeSTT, Obj.Name
    Set CollectFiltres(Obj.Name).Lst = Obj
    @ojo86 tu es sur Mac?


    sur quelle N° de ligne!
    Non je ne suis pas sur mac.
    Je récapitule :
    Mon userform avec 3 ComboBox.
    A l'ouverture du userform je rempli ma collection avec ta méthode :
    La variable CollectFiltres est publique dans un module classic.

    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
     
    Sub InitFiltres()
    Dim Obj As Control
    Set CollectFiltres = New Collection
    For Each Obj In Me.Controls
        If InStr(1, Obj.Name, "Filtre") > 0 Then
            Select Case TypeName(Obj)
                Case "ComboBox"
                    Call ChargerFiltres(Obj.Name, Me)
                    CollectFiltres.Add New ClsCmdeSTT, Obj.Name
                    Set CollectFiltres(Obj.Name).ListeFiltres = Obj
                Case "TextBox"
                    CollectFiltres.Add New ClsCmdeSTT, Obj.Name
                    Set CollectFiltres(Obj.Name).TexteFiltres = Obj
            End Select
     
            'MsgBox CollectFiltres.Item(CollectFiltres.Count).ListeFiltres.Name
     
        End If
    Next Obj
    End Sub
    Dans mon module de classe ClsCmdeSTT :
    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
     
     
    Option Explicit
     
    Public WithEvents ListeFiltres As MSForms.ComboBox
    Public WithEvents TexteFiltres As MSForms.TextBox
     
     
    Private Sub ListeFiltres_Change()
        Dim objet 
     
        For Each objet In CollectFiltres
            MsgBox objet.Name
        Next
    End Sub
    Plante sur la ligne "MsgBox objet.Name"


    Je pense que je me mélange les pinceaux...

  11. #11
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Je ne vois pas l'intérêt d'une telle boucle.
    L'événement déclenché correspond au contrôle concerné.

    Mais si tu y tiens, il faut déclarer ta collection Public dans un module standard :

    Module1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Public CollectFiltres As Collection
    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
    Option Explicit
     
    Private Sub UserForm_Activate()
    Dim Obj As Control
     
        Set CollectFiltres = New Collection
        For Each Obj In Me.Controls
            If InStr(1, Obj.Name, "Filtre") > 0 Then Classe_Add CollectFiltres, Obj
        Next Obj
    End Sub
     
    Private Sub Classe_Add(C As Collection, O As Control)
    Dim Cl As ClsCmdeSTT
     
        Set Cl = New ClsCmdeSTT
        If TypeName(O) = "ComboBox" Then
            'Call ChargerFiltres(Obj.Name, Me)
            Set Cl.ListeFiltres = O
        ElseIf TypeName(O) = "TextBox" Then
            Set Cl.TexteFiltres = O
        End If
        Cl.Nom = O.Name
        C.Add Cl
    End Sub
    Classe :
    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
    Option Explicit
     
    Public WithEvents ListeFiltres As MSForms.ComboBox
    Public WithEvents TexteFiltres As MSForms.TextBox
     
    Public Nom As String
     
    Private Sub ListeFiltres_Change()
    Dim Toto As ClsCmdeSTT
     
        For Each Toto In CollectFiltres
            MsgBox Toto.Nom
        Next
    End Sub
     
    Private Sub TexteFiltres_Change()
        MsgBox TexteFiltres.Name
    End Sub
    Cordialement,
    Franck

  12. #12
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Et si tu tiens à récupérer l'objet, il faut l'intégrer dans la collection, avec (par exemple) un Array :

    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
    Option Explicit
     
    Private Sub UserForm_Activate()
    Dim Obj As Control
     
        Set CollectFiltres = New Collection
        For Each Obj In Me.Controls
            If InStr(1, Obj.Name, "Filtre") > 0 Then Classe_Add CollectFiltres, Obj
        Next Obj
    End Sub
     
    Private Sub Classe_Add(C As Collection, O As Control)
    Dim Cl As ClsCmdeSTT
     
        Set Cl = New ClsCmdeSTT
        If TypeName(O) = "ComboBox" Then
            'Call ChargerFiltres(Obj.Name, Me)
            Set Cl.ListeFiltres = O
        ElseIf TypeName(O) = "TextBox" Then
            Set Cl.TexteFiltres = O
        End If
        Cl.Nom = O.Name
        C.Add Array(Cl, O), O.Name
    End Sub
    Classe :
    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
    Option Explicit
     
    Public WithEvents ListeFiltres As MSForms.ComboBox
    Public WithEvents TexteFiltres As MSForms.TextBox
     
    Public Nom As String
     
    Private Sub ListeFiltres_Change()
    Dim Toto
     
        For Each Toto In CollectFiltres
            MsgBox Toto(0).Nom & "  ==> " & Toto(1).Value
        Next
    End Sub
     
    Private Sub TexteFiltres_Change()
     
    End Sub
    Cordialement,
    Franck

  13. #13
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    L'interêt le voici :
    Mes 3 combobox sont des listes de filtre.
    Je dois donc construire une chaine de texte pour filtrer sur mon recordSet. La chaine se compose de : "Champ1 = '" & ValeurListe1 & "' AND Champ2 = '" & ValeurListe2 & "'" etc etc...

    Pour construire cette chaine de texte, je dois donc boucler sur mes trois listes afin de savoir si un critère a été sélectionné. Si c'est le cas, alors j'ajoute le critère de filtre à la chaine de caractère, sinon je n'ajoute rien...
    Sachant que je souhaite exploiter le code sur plusieurs formulaires, je n'aurais donc pas toujours les 3 mêmes listes.

  14. #14
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Dans mon dernier exemple, Toto(0) correspond à l'instance de classe et Toto(1) au contrôle.
    Cordialement,
    Franck

  15. #15
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Je pensais qu'on pouvait faire beaucoup plus simple...
    J'étais loin de trouver...

  16. #16
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Un autre exemple, plus simple, avec deux collections, une des classes et une des contrôles :

    Module1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Option Explicit
     
    Public CollectFiltres As Collection
    Public CollectObjets As Collection
    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
    Option Explicit
     
    Private Sub UserForm_Activate()
    Dim Obj As Control
     
        Set CollectFiltres = New Collection
        Set CollectObjets = New Collection
        For Each Obj In Me.Controls
            If InStr(1, Obj.Name, "Filtre") > 0 Then Classe_Add CollectFiltres, Obj
        Next Obj
    End Sub
     
    Private Sub Classe_Add(C As Collection, O As Control)
    Dim Cl As ClsCmdeSTT
     
        Set Cl = New ClsCmdeSTT
        If TypeName(O) = "ComboBox" Then
            Call ChargerFiltres(Obj.Name, Me)
            Set Cl.ListeFiltres = O
        ElseIf TypeName(O) = "TextBox" Then
            Set Cl.TexteFiltres = O
        End If
        Cl.Nom = O.Name
        C.Add Cl
        CollectObjets.Add O, Cl.Nom
    End Sub
    Classe :
    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
    Option Explicit
     
    Public WithEvents ListeFiltres As MSForms.ComboBox
    Public WithEvents TexteFiltres As MSForms.TextBox
     
    Public Nom As String
     
    Private Sub ListeFiltres_Change()
    Dim Toto
     
        For Each Toto In CollectFiltres
            MsgBox CollectObjets.Item(Toto.Nom).Name
        Next
    End Sub
     
    Private Sub TexteFiltres_Change()
     
    End Sub
    Cordialement,
    Franck

  17. #17
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Citation Envoyé par pijaku Voir le message
    Dans mon dernier exemple, Toto(0) correspond à l'instance de classe et Toto(1) au contrôle.
    J'ai testé le code et ça fonctionne avec la array.
    J'ai supprimé un truc et ça fonctionne toujours...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            'CollectFiltres.Add Array(Cl, Obj), Obj.Name 'Ta ligne d'origine
            CollectFiltres.Add Array(Cl, Obj) 'Ma ligne de test
    Maintenant, dans ma tête, j'ai du mal à comprendre comment ça fonctionne le .Add Array()... peux-tu m'expliquer?

  18. #18
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 949
    Points
    2 949
    Billets dans le blog
    10
    Par défaut
    Ce que tu as supprimé correspond aux clés de la collection.
    J'en mets systématiquement pour deux raisons :
    > éviter les doublons,
    > pouvoir retrouver facilement un objet par son nom (cf mon dernier exemple).

    Dans une collection, tu mets ce que tu veux. Un Objet, un variant, un String, un array...
    Ici, tu souhaite récupérer un objet et gérer ta classe, il te faut donc mettre dans ta collection, dans les Items de ta collection, les deux : l'instance de classe et l'objet.
    D'où mon Array(Cl, O)
    Cordialement,
    Franck

  19. #19
    Invité
    Invité(e)
    Par défaut
    tu es sur quel OS????

  20. #20
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Ok, en fait, chaque item d'une collection porte plusieurs paramètres qu'il faut renseigner avant l'ajout à la collection c'est bien ça?
    C'est ce que tu fais avec "Cl.Nom = O.Name"

Discussions similaires

  1. [VBA-E] boucler sur une colonne
    Par ricoree78 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 14/02/2007, 20h04
  2. VBNET : Agir sur une collection de contrôles ?
    Par VinZent dans le forum Windows Forms
    Réponses: 3
    Dernier message: 12/11/2006, 09h01
  3. Réponses: 1
    Dernier message: 25/10/2006, 13h41
  4. Boucler sur une table pour renommer des valeurs
    Par webwhisky dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 03/01/2006, 14h19
  5. [Struts] <logic:iterate> sur une collection d objets c
    Par trax020 dans le forum Struts 1
    Réponses: 2
    Dernier message: 12/05/2005, 00h11

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