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 :

Utilisation de l’objet «System.Collections.ArrayList"


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 830
    Par défaut Utilisation de l’objet «System.Collections.ArrayList"
    Bonjour,
    Je viens de découvrir un outil très puissant que pour gérer des listes de chaînes de texte (String) l'objet « System.Collections.ArrayList ». Il possède des méthodes qui permettent de faire des tris en ordre alphabétique ou alphabétique inverse d’une façon simple.

    Je l’utilise avec un tableau structuré de 2 colonnes dans la première le NOM dans la seconde le PRÉNOM, pour alimenter un contrôle ListBox mais à l’initialisation de l’UserForm celui-ci n’est pas trier par ordre alphabétique.

    Voici mon code :
    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
    Private Sub UserForm_Initialize()
        Dim Liste As Object
        Dim xItem
        Dim rg As Range
        'Alimenter la liste
        Set Liste = CreateObject("System.Collections.ArrayList")
        Set rg = Range("Tableau2")
        For Each c In rg
            Liste.Add c.Text  'il faut utiliser .Text sinon impossible de trier car on envoie un "range"
        Next c
        '=== liste des items triés en ordre alphabétique===
        Liste.Sort
        For Each xItem In Liste
            ListBox1.List = rg.Value
        Next
    End Sub
    Pouvez-vous m’expliquer pourquoi.

    Merci d’avance pour votre aide.

  2. #2
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 202
    Par défaut
    hello,
    Citation Envoyé par modus57 Voir le message
    Je l’utilise avec un tableau structuré de 2 colonnes dans la première le NOM dans la seconde le PRÉNOM, pour alimenter un contrôle ListBox mais à l’initialisation de l’UserForm celui-ci n’est pas trier par ordre alphabétique.
    Voici mon code :
    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
    Private Sub UserForm_Initialize()
        Dim Liste As Object
        Dim xItem
        Dim rg As Range
        'Alimenter la liste
        Set Liste = CreateObject("System.Collections.ArrayList")
        Set rg = Range("Tableau2")
        For Each c In rg
            Liste.Add c.Text  'il faut utiliser .Text sinon impossible de trier car on envoie un "range"
        Next c
        '=== liste des items triés en ordre alphabétique===
        Liste.Sort
        For Each xItem In Liste
            ListBox1.List = rg.Value
        Next
    End Sub
    Pouvez-vous m’expliquer pourquoi.
    tu dois pas être trop bien réveillé Modus57 car regarde bien ta boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        For Each xItem In Liste
            ListBox1.List = rg.Value
        Next
    tu ne te sers pas de xItem pour remplir ta ListBox. En fait ce ce que tu fais c'est que tu remplis ta ListBox avec le contenu du tableau plusieurs fois.
    Ami calmant, J.P

  3. #3
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 563
    Par défaut
    Bonjour,
    Je l’utilise avec un tableau structuré de 2 colonnes dans la première le NOM dans la seconde le PRÉNOM, pour alimenter un contrôle ListBox mais à l’initialisation de l’UserForm celui-ci n’est pas trier par ordre alphabétique.
    donc tu charges invariablement les Nom et les Prénom les un en dessous des autre? c'es bien ce que tu veux faire?

    et de surcroit ArrayList n'interdit pas le doublons sans vérification de l'existant!
    https://www.gcexcel.com/createobject...ons-arraylist/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Set Liste = CreateObject("System.Collections.ArrayList")
        Set rg = Range("Tableau2")
        For Each c In rg
            Liste.Add c.Text  'il faut utiliser .Text sinon impossible de trier car on envoie un "range"
        Next c
      Liste.Sort
    Nom : Sans titre.png
Affichages : 1253
Taille : 15,9 Ko Nom : Sans titre.png
Affichages : 1253
Taille : 14,3 Ko

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 830
    Par défaut
    Bonjour Thumb down, jurassic pork,

    Comme je l'ai dis je ne connaissais pas l'objet "System.Collections.ArrayList".

    Par curiosité je pensais l'utiliser dans une ListBox pour sa simplicité de tri par ordre alphabétique après suppression des doublons dans le tableau.

    J'ai été sur le lien et cite l'avis de BOISGONTIER :
    C’est un objet de System.Collections.ArrayList. Il n’est pas disponible sur toutes les versions.
    Il peut être remplacé par Dictionary (plus rapide)
    Si ça charges les Nom et les Prénom les un en dessous des autre, aucun intérêt de remplir une ListBox de cette manière à l'initialisation d'un UserForm.

  5. #5
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 202
    Par défaut
    Le contrôle ListView ( dans Microsoft Windows Common Controls 6.0) permet de faire du tri dans les colonnes de ses éléments :

    Nom : ListView.gif
Affichages : 1231
Taille : 248,9 Ko

  6. #6
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 563
    Par défaut
    @modus57 que veux tu faire exactement ?

    Charger une listeBox avec les noms et prénoms dans des colonnes respective trié par ordre alphabétique et sans doublons ?

    Explicite ta demande !

    Pour info c'est ton code qui charge bizarrement la arryliste!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each c In rg
            Liste.Add c.Text  'il faut utiliser .Text sinon impossible de trier car on envoie un "range"
        Next c

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 830
    Par défaut
    Bonjour,

    J’ai oublié de préciser que j’ai installé Excel 64 bits et ListView ne fonctionne pas sur 64 bits, pour utiliser celui-ci il faut que je désinstalle Office 64 bits et que je réinstalle en 32 bits.

    Je répète que par simple curiosité j’espérai alimenter un contrôle ListBox avec les données triées et sans doublons d’un tableau structuré de 2 colonnes dans la première le NOM dans la seconde le PRÉNOM en utilisant l’objet CreateObject("System.Collections.ArrayList").

  8. #8
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 563
    Par défaut
    Bonjour,
    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
    Private Sub UserForm_Initialize()
    With Me.ListBox1
        .List = NomPnom
        .ColumnCount = 2
        .BoundColumn = 2
    End With
    End Sub
     
    Function NomPnom() As String()
    Dim Liste As Object, I As Integer, T As String
    Set Liste = CreateObject("System.Collections.ArrayList")
    With [Tableau2]
        For I = 1 To .Rows.Count
               T = .Cells(I, "A") & ";" & .Cells(I, "B")
               If Liste.IndexOf(T, 0) = -1 Then Liste.Add T
        Next
     End With
      Liste.Sort
      Dim Tb() As String
    ReDim Tb(Liste.Count - 1, 1)
    For I = 0 To Liste.Count - 1
        Tb(I, 0) = Split(Liste(I), ";")(0)
        Tb(I, 1) = Split(Liste(I), ";")(1)
    Next
    NomPnom = Tb
    End Function

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 830
    Par défaut
    Bonjour Thumb down,

    Waouh 🤩 super simple et efficace pour populer une ListBox ou un ComboBox.

    Merci beaucoup pour cette participation, certains savent forger nativement et d’autres forger pour devenir forgerons

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 830
    Par défaut
    Bonjour Thumb down,

    Si j'ajoute une troisième colonne "Âge" au tableau structuré, je n'arrive pas avec la fonction "Split" à alimenter la ListBox ?

  11. #11
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 563
    Par défaut
    Citation Envoyé par modus57 Voir le message
    Bonjour Thumb down,

    Si j'ajoute une troisième colonne "Âge" au tableau structuré, je n'arrive pas avec la fonction "Split" à alimenter la ListBox ?
    Bonjour,
    pas de problème voila la correction!
    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
    Private Sub UserForm_Initialize()
    With Me.ListBox1
        .List = NomPnom
        .ColumnCount = UBound(.List, 2) + 1
        .BoundColumn = UBound(.List, 2) + 1
    End With
     
     
    End Sub
    Function NomPnom() As String()
    Dim Liste As Object, I As Integer, C As Integer, T As String
    Set Liste = CreateObject("System.Collections.ArrayList")
    With [tableau2]
        For I = 1 To .Rows.Count
            For C = 1 To .Columns.Count
            T = T & .Cells(I, C) & ";"
            Next
            If Liste.IndexOf(T, 0) = -1 Then Liste.Add T
            T=""
        Next
     End With
      Liste.Sort
      Dim Tb() As String
    ReDim Tb(Liste.Count - 1, [tableau2].Columns.Count - 1)
    For I = 0 To Liste.Count - 1
        For C = 0 To UBound(Tb, 2)
        Tb(I, C) = Split(Liste(I), ";")(C)
        Next
    Next
    NomPnom = Tb
    End Function
    tu pourras même ajouter des colonne!

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 830
    Par défaut
    Merci pour ta réponse et ta réactivité.

    Je viens de tester, cela renvois la première ligne du tableau autant de fois que le nombre de ligne contenu dans celui-ci.

  13. #13
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 563
    Par défaut
    Citation Envoyé par modus57 Voir le message
    Merci pour ta réponse et ta réactivité.

    Je viens de tester, cela renvois la première ligne du tableau autant de fois que le nombre de ligne contenu dans celui-ci.
    reprends le code, car je lavais modifie!

    je n'effaçais pas la valeur de T!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If Liste.IndexOf(T, 0) = -1Then Liste.Add T
            T=""

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 830
    Par défaut
    OK ça fonctionne maintenant nickel chrome.

    Merci encore pour ta participation.

Discussions similaires

  1. Utilisation de CopyTo sur System.Collections.Queue
    Par zardoz45 dans le forum VBScript
    Réponses: 7
    Dernier message: 24/04/2012, 15h24
  2. Réponses: 7
    Dernier message: 14/07/2011, 22h58
  3. Réponses: 9
    Dernier message: 28/05/2008, 02h06
  4. [C#] Collections (ArrayList)
    Par webspeak dans le forum Windows Forms
    Réponses: 7
    Dernier message: 06/04/2005, 14h07

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