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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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+
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 >
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
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
On Oct 11, 9:03 pm, "Pascal" <inco...@hotmail.com> 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.
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
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.
On Thu, 11 Oct 2007 21:57:52 +0200, tking <thing@w.e> 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.
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
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
Merci à tous pour vos réponses et le cours gratuit!, j'apprécie beaucoup
Pascal
"François Picalausa" <fpicalausa@gmail.com> a écrit dans le message de news:
1192133324.347847.80030@o3g2000hsb.googlegroups.com...
On Oct 11, 9:03 pm, "Pascal" <inco...@hotmail.com> 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.
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
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.
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.