Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2261 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1744832
adelotti
Posté le 11-06-2008 à 15:00:15  profilanswer
 

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!

mood
Publicité
Posté le 11-06-2008 à 15:00:15  profilanswer
 

n°1746890
tegu
Posté le 16-06-2008 à 09:54:17  profilanswer
 

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
n°1747427
adelotti
Posté le 17-06-2008 à 11:16:10  profilanswer
 

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!

n°1747435
adelotti
Posté le 17-06-2008 à 11:26:48  profilanswer
 

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

n°1748220
tegu
Posté le 18-06-2008 à 15:07:31  profilanswer
 

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 ?

n°1748463
adelotti
Posté le 18-06-2008 à 17:44:33  profilanswer
 

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  :??:

n°1748764
tegu
Posté le 19-06-2008 à 10:41:36  profilanswer
 

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.

n°1748870
adelotti
Posté le 19-06-2008 à 13:42:26  profilanswer
 

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!


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 

Sujets relatifs
Somme d'elements de differentes tables[VBA] Boîte qui se ferme toute seule au bout de 5 s.
[VBA] Sélectionner une TextBoxRecherche programmateur
[VBA] Probleme sur une macroRecensement de fichiers en utilisant VBA
[Access VBA] Créer une requête[Excel VBA]_Importer un fichier texte
Besoin d'aide programme VBA cellulesJe recherche des personnes pour créer un site internet
Plus de sujets relatifs à : [VBA] Recherche dans les éléments d'une liste


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR