Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

supprimer doublons dans listview

5 réponses
Avatar
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

5 réponses

Avatar
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 ...

A+
Avatar
François Picalausa
On Oct 11, 9:03 pm, "Pascal" wrote:
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
Avatar
parci
On Thu, 11 Oct 2007 21:57:52 +0200, tking wrote:

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.
Avatar
Pascal
Merci à tous pour vos réponses et le cours gratuit!, j'apprécie beaucoup

Pascal


"François Picalausa" a écrit dans le message de news:

On Oct 11, 9:03 pm, "Pascal" wrote:
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
Avatar
tking
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.