[VBA] Recherche dans les éléments d'une liste

Recherche dans les éléments d'une liste [VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 11-06-2008 à 15:00:15    

Bonjour,
 
J'ai vu qq topics a ce sujet, mais aucune des solutions proposées ne convient donc je me permet de poster ...
 
J'aimerai faire une recherche au sein de plusieurs listes (à 2 colonnes) d'un formulaire. En gros, l'utilisateur rentre un mot et ca lui retourne toutes les lignes de ces différentes listes dont la premiere colonne contient ce mot.
Jusque la tout va bien, ca marche bien sauf 2 bugs :
 
1) Je n'arrive pas à ne pas différencier majuscule et minuscule.
J'ai essayé avec Ucase et Lcase mais rien a faire : "Can't find project or library"
 
Voici mon code (en commentaire le différentes lignes que j'ai essayé) :
 

Code :
  1. recherche = "*" & search_text.Value & "*"
  2. list_search.ColumnCount = 2
  3. i = 0
  4. w = 0
  5. list_search.Clear
  6. For j = 0 To List_electrical.ListCount - 1 Step 1
  7.    'blabla = List_electrical.List(j, 0)
  8.    'If UCase(blabla) Like UCase(recherche) Then
  9.      
  10.    'corrig = LCase(blabla)
  11.    'If corrig Like recherche Then
  12.        
  13.    'If UCase(List_electrical.List(j, 0)) Like "*" & UCase(search_text.Value) & "*" Then
  14.      
  15.    If List_electrical.List(j, 0) Like recherche Then
  16.         trouve = List_electrical.List(j, 0)
  17.         trouve2 = List_electrical.List(j, 1)
  18.         list_search.AddItem trouve
  19.         list_search.List(i, 1) = trouve2
  20.         i = i + 1
  21.    End If
  22. Next j


 
 
 
2) Par l'intermédiaire de plusieurs boucles ma recherche s'effectue donc dans plusieurs liste ayant parfois des éléments communs. j'aimerais donc rajouter un boucle a la fin pour supprimer les éléments multiples dans la liste ou s'affichent les résultats de la recherche.
 
Voici mon code (qui ne fonctionne pas! "Invalid argument" ) :
 

Code :
  1. For v = 0 To list_search.ListCount - 1 Step 1
  2.     For w = 0 To list_search.ListCount - 1 Step 1
  3.        If list_search.List(v, 0) = list_search.List(w, 0) And v <> w Then
  4.        list_search.RemoveItem (list_search.List(w, 0))
  5.        list_search.RemoveItem (list_search.List(w, 1))
  6.        End If
  7.     Next w
  8. Next v


 
 
 
Merci pour votre aide!

Reply

Marsh Posté le 11-06-2008 à 15:00:15   

Reply

Marsh Posté le 16-06-2008 à 09:54:17    

Le comportement d'un LIKE dépend de la déclaration de la méthode de comparaison du module : Option Compare Binary (valeur par défaut, sensible à la casse) ou Option Compare Text (insensible à la casse).
Dans ton deuxième bout de code, peux-tu nous dire sur quelle ligne se produit l'erreur « invalid argument » ?

Message cité 1 fois
Message édité par tegu le 16-06-2008 à 09:54:37
Reply

Marsh Posté le 17-06-2008 à 11:16:10    

Yahoooooo!
J'avais bien repéré ce petit passage dans l'aide mais j'en avais pas vraiment compris le sens...
Ca marche!!
Merci énormément!

Reply

Marsh Posté le 17-06-2008 à 11:26:48    

tegu a écrit :


Dans ton deuxième bout de code, peux-tu nous dire sur quelle ligne se produit l'erreur « invalid argument » ?


 
Finalement j'ai essayé de passer par des boucles do until qui semblent plus appropriées...
Mais encore une fois ca me laisse tout le temps un doublon (sauf quand la liste des éléments trouvés ne regroupe que 2 éléments identiques, dans ce cas elle en supprime bien un des 2)
Je pense que je n'arrive pas a bien fixer les valeurs de départ de mes variables qui sont incrémenté par la suite...
 

Code :
  1. v = 0
  2. w = list_search.ListCount - 1
  3. If list_search.ListCount > 1 Then
  4.     Do Until v = list_search.ListCount
  5.         Do Until w = 0
  6.             If list_search.List(v, 0) = list_search.List(w, 0) And v <> w Then
  7.             list_search.RemoveItem (v)
  8.             End If
  9.         w = w - 1
  10.         Loop
  11.      v = v + 1
  12.      Loop
  13. End If

Reply

Marsh Posté le 18-06-2008 à 15:07:31    

J'ai un problème avec ton code.
Ton « Do Until v = list_search.ListCount » va être impacté par « list_search.RemoveItem (v) » car à chaque suppression dans la liste, la propriété .ListCount sera décrémentée, alors que v est lui-même incrémenté à chaque fois par « v = v + 1 » : c'est voulu ?

Reply

Marsh Posté le 18-06-2008 à 17:44:33    

tegu a écrit :

J'ai un problème avec ton code.
Ton « Do Until v = list_search.ListCount » va être impacté par « list_search.RemoveItem (v) » car à chaque suppression dans la liste, la propriété .ListCount sera décrémentée, alors que v est lui-même incrémenté à chaque fois par « v = v + 1 » : c'est voulu ?


 
Je venais d'y penser pour w! En effet quand je supprime un element, le Listcount diminue et donc w aussi, du coup je décrémente w 2 fois dans la meme étape.
 
J'ai réparé ca en mettant un else dans la boucle et en supprimant l'élément w (et non pas v):
 

Code :
  1. v = 0
  2. w = list_search.ListCount - 1
  3. If list_search.ListCount > 1 Then
  4.     Do Until v = list_search.ListCount - 1
  5.     w = list_search.ListCount - 1
  6.         Do Until w = 0
  7.             If list_search.List(v, 0) = list_search.List(w, 0) And v <> w Then
  8.             list_search.RemoveItem (w)
  9.             Else
  10.             w = w - 1
  11.             End If
  12.         Loop
  13.      v = v + 1
  14.      Loop
  15. End If


 
 
 
Les élements sont bien supprimés mais ca bug : invalid property array index.
Le bug vient de la ligne  

Code :
  1. If list_search.List(v, 0) = list_search.List(w, 0) And v <> w Then

où w prend une valeur trop élevée (ex: w=5 alors qu'il ne reste que 5 élément et que donc w ne peut aller que jusqu'à 4...)
 
Je sais pas si je suis très clair, moi même j'ai du mal a me comprendre  :??:

Reply

Marsh Posté le 19-06-2008 à 10:41:36    

Parce que tu n'as pas résolu le problème du .RemoveItem et du .ListCount, même si c'est plus subtil maintenant.
Si j'extrais la boucle de ton code on a

Do Until w = 0
   If list_search.List(v, 0) = list_search.List(w, 0) And v <> w Then
      list_search.RemoveItem (w)
   Else
      w = w - 1
   End If
Loop


Tu effectues un test entre deux éléments non stables d'une itération de boucle à l'autre.
Suivant si v > w, ou l'inverse, ou si w est le dernier élément de la liste (par exemple) ton .RemoveItem(w) va avoir des interférences différentes sur ton test « list_search.List(v, 0) = list_search.List(w, 0)  »
C'est une mauvaise méthode de programmation.
Il vaudrait mieux remplir un tableau de référence avec les éléments de ta liste pour effectuer la comparaison.
Le contenu du tableau ne variant pas, les itérations de ta boucle seraient stables.

Reply

Marsh Posté le 19-06-2008 à 13:42:26    

Merci pour tous ces conseils... malheuresement la prog ce n'est pas trop mon truc et je n'ai pas trop le temps...
Mais apperement j'ai eu un coup de chance du débutant : en essayant de bidouiller, et de revoir la méthode d'incrémentation, j'ai par erreur oublié de mettre en commentaire une boucle... Résultat je lance avec 2 boucles l'une a la suite de l'autre et... ca marche!!
 
 

Code :
  1. aNbItems = list_search.ListCount
  2. If aNbItems > 1 Then
  3.     v = 0
  4.     Do Until v = aNbItems - 1
  5.         w = v + 1
  6.         Do Until w = aNbItems - 1
  7.             If list_search.List(v, 0) = list_search.List(w, 0) Then
  8.                 list_search.RemoveItem (w)
  9.                 aNbItems = aNbItems - 1
  10.             Else
  11.                 w = w + 1
  12.             End If
  13.         Loop
  14.      v = v + 1
  15.     Loop
  16. End If
  17. v = 0
  18. aNbItems = list_search.ListCount
  19. w = aNbItems - 1
  20. If aNbItems > 1 Then
  21.     Do Until v = aNbItems - 1
  22.     w = aNbItems - 1
  23.         Do Until w = 0
  24.             If list_search.List(v, 0) = list_search.List(w, 0) And v <> w Then
  25.             list_search.RemoveItem (w)
  26.             w = aNbItems - 2
  27.             Else
  28.             w = w - 1
  29.             End If
  30.         Loop
  31.      v = v + 1
  32.      Loop
  33. End If


 
 
 
COntente que ca marche mais j'aimerais quand meme comprendre pourquoi!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed