[VBA-XL] Problème avec la propriété List d'une ComBoBox

[Résolu]
Signaler
Messages postés
112
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
14 mai 2021
-
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
-
Bonjour, j'ai un petit problème avec la propriété List d'une ComBoBox. Enfaite j'essaye de gérer les doublons des valeurs de ma combobox. Sauf que quand j'essaye de la parcourir j'ai comme message d'erreur : "Impossible de lire la propriété List. Index de table de propriétés non valide".

Voici le code :

Public Function GestDoublons()
Dim i, j As Integer
Dim NuOF, NuOFSuiv As String
   
        For i = -1 To Feuil1.ComboBox4.ListCount - 1
           
          NuOF = Feuil1.ComboBox4.List(i)
           
           
                    For j = i + 1 To Feuil1.ComboBox4.ListCount
                           NuOFSuiv = Feuil1.ComboBox4.List(j)
                            
                            
                            If NuOF = NuOFSuiv Then   Feuil1.ComboBox4.RemoveItem (j)
                            
                    Next
        Next
                    
                

End Function


Merci d'avance et bonne journée

8 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Tu n'as donc pas compris que c'est au Additem, qu'il est judicieux de prendre la décision d'ajouter ou non ?

Tu tiens à ta méthode "in fine" ?
En général, on applique alors le dicton : "qui fait à sa tête paye de son dos" !
Je vais néanmoins te montrer comment (et ce sera moins le résultat de connaissances de la syntaxe que celui de l'utilisation de mes méninges et de logique) ===>>

For i = ComboBox1.ListCount - 1 To 0 Step -1
   For j = i - 1 To 0 Step -1 '<<<<=== on ne "regarde" qu'au dessus
     If ComboBox1.List(j) = ComboBox1.List(i) Then
        ComboBox1.RemoveItem i
        Exit For ' <<<<==== et on passe au i suivant, donc on quitte la boucle j
     End If
   Next
 Next


Voilà !

Mais je reviens et insiste : il coûte moins cher de le faire au moment de l'ajout.
Et je te signale qu'on peut le faire sans boucle aucune, compte tenu des particularités des comboboxes de VBA (différentes de VB6) et que DARKSIDIOUS ne connaissait pas forcément :

regarde :

ComboBox1.Text = "c"
If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem ComboBox1.Text


n'ajouteras "c" que si non déjà présent
Le reste est facile à deviner, par exemple avec un Range :

genre (à main levée) :

for each c in range("a1:a100")
  combobox1.text = c.value
  If combobox1.listindex = -1 then combobox1.additem combobox1.text
next

Te voilà une fois de plus renseigné, mais j'aimerais voir le jour où tu sauras te débrouiller un peu toi-même à l'aide de tes seules connaissances actuelles (ce que je t'ai montré plus haut en boucle "un fine" ne fait appel à aucune autree connaissances que celles que tu avais , hein !)
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Bonjour,

Déjà : L'index - 1 ne correspond en effet à aucun index d'une combobox !
Le premier index est 0


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
112
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
14 mai 2021
1
Merci pour ta réponse rapide .

Du coup j'ai démarré mon index à 0 mais toujours la même erreur =/
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
et cette fois-ci ton erreur est là :
For j = i + 1 To Feuil1.ComboBox4.ListCount

car lorsque i ComboBox4.ListCount-1, j ComboBox4.ListCount (hors bornes !)
Et un simple débogage t'aurait permis d'éviter cette perte de temps

Et lorsque tu auras "réparé" cette erreur évidente, tu tomberas sur une autre erreur, que je t'annonce à l'avance :
Lorsque l'on supprime des articles de haut en bas, les index des suivants s'en trouvent modifiés ! (toujours le faire de bas en haut !)


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
plou persou !
Bon ==>> je te conseille de lire cette discussion :
Tapez le texte de l'url ici.
dans laquelle DARKSIDIOUS est intervenu en faisant preuve de grande sagesse.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
112
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
14 mai 2021
1
Si si j'essayait de résoudre le problème, la méthode de DARKSIDIOUS fonctionne puisque je l'utilise déjà dans mon code sauf que le temps de cycle de cet algorithme est énorme si on a une grande liste (mon cas). Voilà pourquoi j'essayai de faire ce test à la fin, lorsque tous mes ADDITEM sont effectués. La taille de l'index de la ComboBox est dynamique ce qui ici me pose des problème. En effet si je supprime un élément, il ne faut pas pour la prochaine itération que je pointe sur le suivant mais sur le même élément (principe de la FIFO).
Messages postés
112
Date d'inscription
mercredi 19 mai 2010
Statut
Membre
Dernière intervention
14 mai 2021
1
Je ne connaissais pas cette propriété des ComboBox, étant habitué au C, j'ai pris pour habitude de tout faire à la main. Tu aurais surement pu être un peu plus "sympa" dans ta démarche, sachant que je suis malgré quelques connaissances, un débutant.

Enfin merci beaucoup quand même, j'ai appliqué ta méthode et tout fonctionne en deux instructions ce qui m'arrange énormément.


Bonne journée
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
Désolé de t'avoir paru "antipatrhique", mais :
1) il n s'agissait pas de code, mais bel et bien d'organisation de la pensée
et
2) j'aurais été plus "tendre" si tu avais fait un petit effort, au moins, de recherche à l'aide du moteur de recherche de ce forum (et c'est à la portée de tous). La preuve :
Tapez le texte de l'url ici.
tu y aurais trouvé des méthodes (par exemple le snippet de Mortalino) différentes de celle que j'ai proposée plus haut (en traitement "in fine").
N'est-ce pas ?

A quoi servent les snippets, créés principalement à l'intention des débutants, si les débutants n'y cherchent jamais ? As-tu une réponse à cela ? Vas-tu me dire qu'on ne sait y trouver ce que l'on cherche et m'expliquer pourquoi je n'ai eu aucune difficulté à y trouver le snippet de Mortalino ?
Explique donc !


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient