[VBA] - Remplir une listBox à partir d'une collection

Bonjour,

J'essaie de remplir une ListBox avec l'ensemble des valeurs uniques présentes dans une colonne.

Pour ce faire, j'ai essayé de passer par une collection, mais je ne parviens pas à utiliser cette collection dans ma ListBox, savez-vous si cela est possible ?

Bonne journée !

A plus tard.

Bonjour la Mouche, bonjour le forum,

L' utilisation d'une collection n'est pas optimale. Un dictionnaire est bien plus approprié car beaucoup plus rapide. Si tu cherches par exemple à alimenter une ListBox avec les données sans doublons de la colonne A, ça donne un code du style :

Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)

Set O = Worksheets("Feuil1") 'définit l'onglet O (à adapter à ton cas)
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs en partant de la seconde (la ligne servant souvent d'en-tête)
    D(TV(I, 1)) = "" 'alimente le dictionnaire D avec les données en colonne 1 de TV
Next I 'prochaine ligne de la boucle
Me.ListBox1.List = D.keys 'alimente la listBox1 avec la liste des éléments du dictionnaire D sans doublon
End Sub

[Édition]

Bonjour RIC, nos posts se sont croisés...

55test.xlsm (23.93 Ko)

Bonjour,

Avec une collection(compatible MAC)

Option Compare Text
Dim f
Private Sub UserForm_Initialize()
  Set f = Sheets("BD")
  Dim a()
  a = Application.Transpose(f.Range("A2:A" & f.[A65000].End(xlUp).Row).Value)
  Me.ListBox1.List = SansDoublonsMAC(a())
End Sub

Function SansDoublonsMAC(a())
   Dim Maliste As New Collection
   On Error Resume Next
   For i = LBound(a) To UBound(a)
     Maliste.Add Item:=a(i), key:=a(i)
   Next i
   On Error GoTo 0
   Dim b(): ReDim b(1 To Maliste.Count)
   For i = 1 To Maliste.Count
     b(i) = Maliste(i)
   Next i
   SansDoublonsMAC = Application.Transpose(b)
End Function

Boisgontier

Bonsoir,

Merci pour votre proposition, c'est exactement ce que je cherchais à faire !

Je n'ai pas encore bien regardé le fonctionnement du code et je vais voir ça de suite.

Mais j'ai tout de même une autre question :

Peut-on choisir plusieurs résultats dans la listbox ?

L'idée serait de supprimer toutes les lignes qui ne correspondent pas aux informations que l'on a sélectionné dans la ListBox.

Je sais comment tout sélectionner, mais pas comment ne sélectionner que les infos souhaitées...

Edit 2 : Je pense avoir trouvé finalement.

Edit : Merci @Boisgontierjacques, je me suis rendu sur votre site avant de poster ici, mais me suis un peu perdu dans mes tests.

A plus tard

Vos propositions fonctionnent toutes, j'ai fait des tests en poursuivant jusqu'au résultat final que je souhaite atteindre, mais j'ai un petit souci au moment de la suppression des lignes.

J'enregistre dans une variable toutes les données enregistrées dans ma listbox (code récupéré depuis le site de BoisgontierJacques), mais quand j'utilise cette variable telle quelle, toute mes lignes se retrouvent supprimée, évidemment...

Comment faire pour qu'Excel reconnaisse qu'il doit chercher chaque valeur sélectionnée et pas l'ensemble concaténé ?

Je joins mon document de travail à ce post.

45test-listbox.xlsm (434.68 Ko)

Bonjour à tous,

Un essai ...

J'ai ajouté des numéros pour tester et tester aussi l'actualisation de la listbox.

ric

Bonsoir,

Pour le moment la procédure supprime toutes les lignes, quelle que soit la sélection dans la ListBox (or choix unique).

Cela vient du fait que, vue qu'aucune ligne ne respecte les conditions indiquées, toutes sont supprimées.

Les conditions devraient être : toutes les lignes qui ne correspondent pas au(x) choix sélectionné(s) sont supprimées. Chaque choix est traité, en tenant compte de tous les choix qui ont été fait.

Sauf que là, les choix sont concaténés et, bien évidemment Excel ne trouve pas de ligne (en colonne E) où il apparaît précisément tous les choix concaténés dans la même cellule.

Si je ne sélectionne qu'1 choix, là ça fonctionne. Puis ça génère l'erreur "Incompatibilité de type" si je relance la macro et que je clique sur un autre choix dans la nouvelle liste.

Merci de vous être penché sur mon problème

Bonjour à tous,

... Les conditions devraient être : toutes les lignes qui ne correspondent pas au(x) choix sélectionné(s) sont supprimées. ...

Désolé d'avoir modifié le "Criterial1" pour les tests et d'avoir oublié de remettre l'option.

C'est Criteria1:="<>" au lieu de Criteria1:="="

Sub DelWetudes()
Dim Plage As Range

   Set dc = Worksheets("Données collector")
   temp1 = [deletude]

   With dc
      lrdc = .Range("A" & Rows.Count).End(xlUp).Row

      Set Plage = .Rows("1:" & lrdc)
      With Plage
         .AutoFilter Field:=5, Criteria1:="<>" & temp1, Operator:=xlAnd 
         Rows(Plage.Row + 1 & ":" & Plage.Row + Plage.Rows.Count - 1).Delete 
         .AutoFilter
      End With
   End With
End Sub

ric

Le code supprime toujours toutes les lignes.

Ce que je comprends ici : .AutoFilter Field:=5, Criteria1:="<>" & temp1

C'est que les données dans temp1 sont "concaténées" et aucune valeur en colonne 5 ne contient la concaténation des choix fait dans la ListBox, c'est au niveau de temp1 qu'il faudrait faire les modifications ?

Si on a plusieurs variables, peut-on les utiliser en tant que "Criterial" ? (du genre Array(criterial1, criterial2, criterial3, etc.) où criterial(x) correspond à chaque fois à 1 choix dans la ListBox ?

Bonjour à tous,

... Ce que je comprends ici : .AutoFilter Field:=5, Criteria1:="<>" & temp1

C'est que les données dans temp1 sont "concaténées" ...

<> veut dire "différent" du contenu de temp1 ... si tu choisis 2996, le filtre affichera tout ce qui est différent de 2996. Puis, la suite du code supprime les lignes visibles.

ric

Bonjour,

Dès que l'on sélectionne 2 éléments dans la ListBox, tout est automatiquement supprimé.

Si on en sélectionne 3, il y a un "dépassement de capacité"

C'est que les données dans temp1 sont "concaténées" ...

Ce que je voulais dire, c'est que : si on sélectionne 2996 et 3154 dans la ListBox, temp1 va correspondre à : "2996 3154" sauf qu'aucune ligne ne contient dans la [colonne E] de mention "2996 3154" ce qui fait que tout se retrouve supprimé. Il faudrait que "2996" et "3154" soient traités à part. Ce que je ne sais pas faire en utilisant une ListeBox.

Je pense savoir le faire si j'utilise un UserForm contenant "x" Combobox auxquelles j’attribus à chaque fois une variable, mais cette solution n'est pas bonne car elle me limite avec le nombre de Combobox que j'enregistrerai.

Bonjour à tous,

À date, je n'ai pas de solution. Mes connaissances sont relativement limitées en vba et mes recherches sur le Net ne trouvent rien de pertinent à adapter.

ric

Bonjour à tous,

Dans la colonne "E", la colonne des critères, y aura-t-il des cellules vides telles que dans le fichier exemple ?

ric

Bonsoir,

Oui il y a des cellules vides comme dans le ficher exemple.

Par contre, si besoin, elles peuvent être changées pr une autre valeur.

Bonjour à tous,

Good, je regarde avec cette option.

ric

Bonjour à tous,

L’objectif recherché : supprimer toutes les lignes dont les valeurs en colonne "E" ne sont pas sélectionnées dans la listbox. J'ai ajouté une confirmation à la suppression.

J'ai placé des 1 dans les cellules vides de la colonne "E" et ça fonctionne bien.

J'ai testé avec de 0, mais ça ne passe pas et je ne trouve pas de contournement.

Un essai ...

ric

Bonjour,

Merci beaucoup pour votre aide ! Après quelques tests tout m'a l'air de parfaitement fonctionner.

Vous m'avez énormément aidé sur ce coup (encore !) je n'avais pas la moindre idée de la méthode à adopter pour obtenir le résultat espéré.

Un gros souci d'éliminé !

Bonne journée, à plus tard

ric

Rechercher des sujets similaires à "vba remplir listbox partir collection"