ListBox sans doublons ?

Bonjour,

Je suis actuellement un tutoriel et j'ai 2 soucis :

En fin de chapitre "Créer une ListBox multicolonnes", il et dit que pour Extraire la valeur de la 3eme colonne d'une Listbox, dans la ligne sélectionnée il fallait utiliser la ligne de code suivante:

MsgBox ListBox1.List(ListBox1.ListIndex, 2)

Je l'ai donc entrée dans un bouton de commande, mais ça me renvoie une erreur d'exécution 381: Impossible de lire la propriété List. Index de table de propriétés non valide. Avez vous une idée sur le sujet ?

D'autre part, au chapitre "Remplir une ListBox sans doublons", une erreur 457: Clé déja associée à un élément de cette collection est également déclarée. Peut être avez vous une idée la dessus aussi.

Merci de votre aide...

Mon fichier joint si nécessaire :

Bonsoir

au plus simple

MsgBox ListBox1.Column(2)

A+

Maurice

Bonjour,

As-tu téléchargé le classeur de Démo ?

Bonsoir,

ListBox sans doublons avec un dictionnaire.

Private Sub UserForm_Initialize()
  Set f = Sheets("BD")
  Set d = CreateObject("Scripting.Dictionary")
  a = f.Range("A2:A" & f.[A65000].End(xlUp).Row)  ' tableau a(n,1) pour rapidité
  For i = LBound(a) To UBound(a)
   If a(i, 1) <> "" Then d(a(i, 1)) = ""
  Next i
  Me.ListBox1.List = d.keys
End Sub

Boisgontier

Bonsoir Boisgontierjacques,

une question pour m'enlever un doute :

d = dictionary, ça ok je connais c'est un objet qui ne prend pas de doublon

If a(i, 1) <> "" Then d(a(i, 1)) = ""

si a(i,1) est différent de rien = s'il y a une valeur alors on ajoute la valeur au dictionnaire.

Ma question : Est-ce bien là la rapidité du "truc" ? Je veux dire que comme le dictionnaire ne prend pas de doublon, si on essaie d'en entrer un, alors il ne rentre pas "automatiquement" il n'y a pas besoin de faire de test, c'est bien ça ?

Si c'est le cas je viens d'avoir une révélation !!!

@ bientôt

LouReeD

une question pour m'enlever un doute :

d = dictionary, ça ok je connais c'est un objet qui ne prend pas de doublon

If a(i, 1) <> "" Then d(a(i, 1)) = ""

si a(i,1) est différent de rien = s'il y a une valeur alors on ajoute la valeur au dictionnaire.

Ma question : Est-ce bien là la rapidité du "truc" ? Je veux dire que comme le dictionnaire ne prend pas de doublon, si on essaie d'en entrer un, alors il ne rentre pas "automatiquement" il n'y a pas besoin de faire de test, c'est bien ça ?

L'instruction :

If a(i, 1) <> "" Then ...

c'est pour éviter le créer une clé vide

L'avantage de la syntaxe :

d(clé) = valeur

est qu'elle permet d'éviter de contrôler l'existence de la clé :

  • si la clé existe, la valeur est affectée à la clé existante
  • si elle n'existe pas elle est ajoutée au dictionnaire avec sa valeur
d'où une plus grande rapidité du code.

Donc c'est bien ça, on boucle sur les valeurs (en évitant les vides) et on les met dans le dico, si c'est en double ce n'est copier qu'une fois, si c'est nouveau on l'ajoute !

Je l'utilisais sans bien saisir le truc...

@ bientôt

LouReeD

merci archer,

Ta ligne fait le travail...

tout comme celle du tutoriel d'ailleurs, car je dois faire mon mea culpa, j'oubliais de sélectionner une ligne avant de l'activer...

Merci de répondre toujours présent...

Bonsoir Patrice33740,

Je n'ai pas trouvé le fichier démo dont tu parles...

Celui qui est en lien ne correspond pas...

Merci quand même pour ton intervention...

bonsoir Boisgontierjacques,

Merci pour ce code que je vais essayer de comprendre, car je dois bien avoué que je ne suis pas du tout familiarisé avec la méthode "Dictionary"...

Si tu avais la gentillesse de me donner quelques explications sur le fonctionnement de Dictionary, je les lirais avec grand plaisir...

Merci encore de ton aide

Bonjour,

Comparaison de Collection et Dictionary pour une liste sans doublons (20.000 lignes)

(Collection est compatible MAC)

Option Compare Text
Dim f
Private Sub UserForm_Initialize()
  Dim Maliste As New Collection
  Set f = Sheets("BD")
  Dim a()
  a = f.Range("A2:A" & f.[A65000].End(xlUp).Row).Value
  On Error Resume Next
  For i = LBound(a) To UBound(a)
     Maliste.Add Item:=a(i, 1), key:=a(i, 1)
  Next i
  On Error GoTo 0
  Dim b(): ReDim b(1 To Maliste.Count, 1 To 1)
  For i = 1 To Maliste.Count
     b(i, 1) = Maliste(i)
  Next i
  Me.ListBox1.List = b
End Sub
Private Sub UserForm_Initialize()
  Set f = Sheets("BD")
  Set d = CreateObject("Scripting.Dictionary")
  d.CompareMode = vbTextCompare
  a = f.Range("A2:A" & f.[A65000].End(xlUp).Row)  ' tableau a(n,1) pour rapidité
  For i = LBound(a) To UBound(a)
   If a(i, 1) <> "" Then    d(a(i, 1)) = ""
  Next i
  Me.ListBox1.List = d.keys
 End Sub

Boisgontier

bonsoir Boisgontierjacques,

Si tu avais la gentillesse de me donner quelques explications sur le fonctionnement de Dictionary, je les lirais avec grand plaisir...

Tu trouveras toutes les explications (et bien plus encore) sur son excellent site : http://boisgontierjacques.free.fr/pages_site/Dictionnaire.htm

Rechercher des sujets similaires à "listbox doublons"