supprimer doublons dans listview

Le
Pascal
bien le bonsoir,

je cherche à supprimer les doublons de ma liste, mon code me fait parfois
une errreur sur la ligne
lst.removeitem(f)
pourriez-vous SVP m'indiquer ce qui cloche, le message est le suivant ;
ARGUMENT OU APPEL DE PROCEDURE INCORRECT
merci

Private Sub DelDoublons(lst As ListBox)
Dim f As Integer, i As Integer
Dim nbrList As Integer
nbrList = lst.ListCount - 1
'parcours de la liste
For f = 0 To nbrList
For i = 0 To nbrList
If lst.List(f) = lst.List(i) Then
'supprime le mot
lst.RemoveItem (f)
nbrList = nbrList - 1
lst.Refresh
End If
Next i
Next f

End Sub
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
tking
Le #15353041
Pascal a exprimé avec précision :
bien le bonsoir,

je cherche à supprimer les doublons de ma liste, mon code me fait parfois une
errreur sur la ligne
lst.removeitem(f)
pourriez-vous SVP m'indiquer ce qui cloche, le message est le suivant ;
ARGUMENT OU APPEL DE PROCEDURE INCORRECT
merci

Private Sub DelDoublons(lst As ListBox)
Dim f As Integer, i As Integer
Dim nbrList As Integer
nbrList = lst.ListCount - 1
'parcours de la liste
For f = 0 To nbrList
For i = 0 To nbrList
If lst.List(f) = lst.List(i) Then
'supprime le mot
lst.RemoveItem (f)
nbrList = nbrList - 1
lst.Refresh
End If
Next i
Next f

End Sub




Je pense que dans ce cas il faudrait éviter une boucle <For Next>
surtout avec un < nbrlist = nbrlist -1 >

Essaye plutot un

do while i < nbrlist

....

i=i+1
loop



A essayer ...

A+
François Picalausa
Le #15353031
On Oct 11, 9:03 pm, "Pascal"
bien le bonsoir,

je cherche à supprimer les doublons de ma liste, mon code me fait parfo is
une errreur sur la ligne
lst.removeitem(f)
pourriez-vous SVP m'indiquer ce qui cloche, le message est le suivant ;
ARGUMENT OU APPEL DE PROCEDURE INCORRECT
merci

Private Sub DelDoublons(lst As ListBox)
Dim f As Integer, i As Integer
Dim nbrList As Integer
nbrList = lst.ListCount - 1
'parcours de la liste
For f = 0 To nbrList
For i = 0 To nbrList
If lst.List(f) = lst.List(i) Then
'supprime le mot
lst.RemoveItem (f)
nbrList = nbrList - 1
lst.Refresh
End If
Next i
Next f

End Sub



Hello,

Voici les deux premières choses que font ton code pour la liste c, a,
a:
-> on compare c avec c (les deux élément d'indice 0 et 0). c sera
supprimé.
La liste devient : a, a

On continue avec l'élément d'indice 1 (i), qui est lui même comparé à
l'élément d'indice 0 (f).
-> on compare a avec a. le second (troisième dans la liste initiale) a
sera supprimé.

On s'arrête alors finalement par la décrémentation de nbrList.

Voici une implémentation plus correcte, basée sur le fait que l'indice
d'un élément donné ne change pas lorsqu'un élément d'indice sup érieur
est supprimé (ceci demande de parcourir le vecteur à l'envers). Les
indices ont aussi été corrigés pour:
1/ ne pas faire de comparaisons inutiles (par exemple, comparer les
éléments 1 et 3 ou les éléments 3 et 1 revient au même. Il s'agit donc
de comparer un élément avec tous les autres éléments d'indice
supérieur ou inférieur, ce dernier choix étant un choix arbitraire du
programmeur)
2/ ne pas comparer un élément avec lui-même.

Private Sub DelDoublons(lst As ListBox)
Dim j As Long, i As Long
Dim nbrList As Long

nbrList = lst.ListCount - 1

'Pour chaque entrée dans la liste (dans l'ordre inverse)
For j = nbrList To 1 Step -1
'Pour chaque autre entrée, avec laquelle la comparaison n'a
pas encore été effectuée
For i = j - 1 To 0 Step -1
'Compare la paire i,j
If lst.List(j) = lst.List(i) Then
'supprime le mot
lst.RemoveItem j
End If
Next i
Next j
End Sub

Il est naturellement possible de parcourir "en avant", mais il faut
alors jouer avec les indices de boucles pour compenser la suppression
d'un élément. C'est à dire que non seulement nbrList change, mais
aussi i et j. Il est alors conseillé d'utiliser un do/loop ou while/
wend, pour avoir une incrémentation explicite (et peut-être parce que
le For peut foirer si on modifie son indice? je ne me souviens plus
exactement).

Néanmoins, cette méthode repose sur le fait que les données sont
gérées par la Listbox. Une règle de bonne pratique est que la listbox
devrait être un "simple" élément d'interface et un tableau dans le
code (ou une autre structure de donnée appropriée) devrait contenir
les "véritables" données.

François
parci
Le #15353011
On Thu, 11 Oct 2007 21:57:52 +0200, tking
Pascal a exprimé avec précision :
bien le bonsoir,

je cherche à supprimer les doublons de ma liste, mon code me fait parfois une
errreur sur la ligne
lst.removeitem(f)
pourriez-vous SVP m'indiquer ce qui cloche, le message est le suivant ;
ARGUMENT OU APPEL DE PROCEDURE INCORRECT
merci

Private Sub DelDoublons(lst As ListBox)
Dim f As Integer, i As Integer
Dim nbrList As Integer
nbrList = lst.ListCount - 1
'parcours de la liste
For f = 0 To nbrList
For i = 0 To nbrList
If lst.List(f) = lst.List(i) Then
'supprime le mot
lst.RemoveItem (f)
nbrList = nbrList - 1
lst.Refresh
End If
Next i
Next f

End Sub




Je pense que dans ce cas il faudrait éviter une boucle <For Next>
surtout avec un < nbrlist = nbrlist -1 >

Essaye plutot un

do while i < nbrlist

....

i=i+1
loop



A essayer ...



Oui ou sinon (en supposant la liste triée - propriété Sorted = True) :

nbrList = lst.ListCount - 1
For f = nbrList To 1 Step -1
If lst.List(f) = lst.List(i) Then
lst.RemoveItem (f)
End If
Next f

En tous cas, aucun besoin de faire une double boucle. Ni besoin de
Refresh. Et puis c'est une ListBox, pas une ListView.
Pascal
Le #15352991
Merci à tous pour vos réponses et le cours gratuit!, j'apprécie beaucoup

Pascal


"François Picalausa"
On Oct 11, 9:03 pm, "Pascal"
bien le bonsoir,

je cherche à supprimer les doublons de ma liste, mon code me fait parfois
une errreur sur la ligne
lst.removeitem(f)
pourriez-vous SVP m'indiquer ce qui cloche, le message est le suivant ;
ARGUMENT OU APPEL DE PROCEDURE INCORRECT
merci

Private Sub DelDoublons(lst As ListBox)
Dim f As Integer, i As Integer
Dim nbrList As Integer
nbrList = lst.ListCount - 1
'parcours de la liste
For f = 0 To nbrList
For i = 0 To nbrList
If lst.List(f) = lst.List(i) Then
'supprime le mot
lst.RemoveItem (f)
nbrList = nbrList - 1
lst.Refresh
End If
Next i
Next f

End Sub



Hello,

Voici les deux premières choses que font ton code pour la liste c, a,
a:
-> on compare c avec c (les deux élément d'indice 0 et 0). c sera
supprimé.
La liste devient : a, a

On continue avec l'élément d'indice 1 (i), qui est lui même comparé à
l'élément d'indice 0 (f).
-> on compare a avec a. le second (troisième dans la liste initiale) a
sera supprimé.

On s'arrête alors finalement par la décrémentation de nbrList.

Voici une implémentation plus correcte, basée sur le fait que l'indice
d'un élément donné ne change pas lorsqu'un élément d'indice supérieur
est supprimé (ceci demande de parcourir le vecteur à l'envers). Les
indices ont aussi été corrigés pour:
1/ ne pas faire de comparaisons inutiles (par exemple, comparer les
éléments 1 et 3 ou les éléments 3 et 1 revient au même. Il s'agit donc
de comparer un élément avec tous les autres éléments d'indice
supérieur ou inférieur, ce dernier choix étant un choix arbitraire du
programmeur)
2/ ne pas comparer un élément avec lui-même.

Private Sub DelDoublons(lst As ListBox)
Dim j As Long, i As Long
Dim nbrList As Long

nbrList = lst.ListCount - 1

'Pour chaque entrée dans la liste (dans l'ordre inverse)
For j = nbrList To 1 Step -1
'Pour chaque autre entrée, avec laquelle la comparaison n'a
pas encore été effectuée
For i = j - 1 To 0 Step -1
'Compare la paire i,j
If lst.List(j) = lst.List(i) Then
'supprime le mot
lst.RemoveItem j
End If
Next i
Next j
End Sub

Il est naturellement possible de parcourir "en avant", mais il faut
alors jouer avec les indices de boucles pour compenser la suppression
d'un élément. C'est à dire que non seulement nbrList change, mais
aussi i et j. Il est alors conseillé d'utiliser un do/loop ou while/
wend, pour avoir une incrémentation explicite (et peut-être parce que
le For peut foirer si on modifie son indice? je ne me souviens plus
exactement).

Néanmoins, cette méthode repose sur le fait que les données sont
gérées par la Listbox. Une règle de bonne pratique est que la listbox
devrait être un "simple" élément d'interface et un tableau dans le
code (ou une autre structure de donnée appropriée) devrait contenir
les "véritables" données.

François
tking
Le #15352981
parci a utilisé son clavier pour écrire :


Oui ou sinon (en supposant la liste triée - propriété Sorted = True) :

nbrList = lst.ListCount - 1
For f = nbrList To 1 Step -1
If lst.List(f) = lst.List(i) Then
lst.RemoveItem (f)
End If
Next f

En tous cas, aucun besoin de faire une double boucle. Ni besoin de
Refresh. Et puis c'est une ListBox, pas une ListView.




Et perso quand j'ajoute un element à un contrôle list, je vérifie
*avant* l'ajout qu'il n'est pas déjà présent.

Bonne journée.
Publicité
Poster une réponse
Anonyme