Recherche par mots clés multiples
Bonjour à tous,
J'ai réaliser un code VBA pour la recherche d'articles d'une base de donnée par mot clé
Cela fonctionne très bien pour un seul mot de recherche.
j'aimerai peaufiner ce code VBA afin de faire une recherche sur plusieurs mots
Je m'explique :
je peux rechercher dans une liste d'article le mot "alimentation", j'ai donc en retour toute les lignes comprenant le mot "alimentation"
Mais comment faire pour rechercher "alimentation 12V" alors que le mot "12V" serait ailleurs dans la cellule de recherche
La cellule dans laquelle je recherche "alimentation 12V" serait "boitier d'alimentation de secours 12V"
Je vous remercie d'avance
bonjour,
j'aimerai peaufiner ce code VBA afin de faire une recherche sur plusieurs mots
tu isoles chacun des mots de ta phrase de recherche.
tu recherches si le premier mot est présent, si oui
tu vérifies que chacun des autres mots est également présent, tu arrêtes la vérification sur la cellule dès que tu as un mot qui n'est plus présent, tu passes à la cellule suivante qui contient le premier mot.
Après on peut envisager des optimisations comme par exemple supprimer les mots non significatifs pour la recherche (les articles, les prépositions, etc ...), faire un tableau des fréquences, faire un index ...
tu peux également t'inspirer des filtres.
Bonjour h2so4,
Merci pour cette réponse
Je ne vois pas comment pouvoir décomposer la clé de recherche
Auriez vous un petit exemple à me donner
voici ma méthode de recherche
If UCase(Feuil1.Cells(ligne, 20)) Like "*" & UCase(Me.txtmot_cle) & "*" Then
If (InStr(1, chaine_categ, Cells(ligne, 14).Value, 1) = 0) Then
chaine_categ = chaine_categ & "-" & Cells(ligne, 14).Value
Sheets("Construction").Cells(ligne_construct, 2).Value = Cells(ligne, 14).Value
ligne_construct = ligne_construct + 1
End If
Merci d'avance
bonjour,
un exemple d'algorithme possible.
Option Compare Text
Sub aargh()
Dim articles() 'tableau qui contiendra la liste des articles correspondant aux mots clés
motsclés = Split(Sheets("accueil").Range("B1"), " ") 'on isole les mots (un mot est une suite de caractères séparée par un espace)
With Sheets("liste")
dl = .Cells(Rows.Count, 20).End(xlUp).Row 'nombre d'articles dans l'inventaire
ReDim articles(1 To dl, 1 To 2) 'redimensionner le tableau résultats au maximum possible
tabliste = .Range("T1").Resize(dl, 1) ' charger l'inventaire dans un tableau VBA (performances !)
For i = 1 To dl 'on parcourt l'inventaire
ok = True 'par défaut l'article en cours correspond aux critères
For j = LBound(motsclés) To UBound(motsclés) 'on vérifie chaque mots clés
If InStr(tabliste(i, 1), motsclés(j)) = 0 Then ok = False: Exit For 'si pas trouvé, l'article en cours ne satisfait pas aux mots clés, on arrête la vérification des mots clés pour cet article
Next j
If ok Then 'l'article satisfait à tous les mots clés
ctr = ctr + 1 'on l'ajoute à la liste d'articles correspondant aux mots clés
articles(ctr, 1) = i 'n° de ligne de l'article dans l'inventaire
articles(ctr, 2) = tabliste(i, 1) ' libellé de l'article
End If
Next i
' on a parcouru tout l'inventaire
'on affiche le résultat
Sheets("accueil").Range("A2").Resize(dl, 2).ClearContents 'efface résultat précédent
If ctr > 0 Then
Sheets("accueil").Range("A2").Resize(ctr, 2) = articles 'on affiche le résultat si au moins un article
Else
Sheets("accueil").Range("b2") = "pas d'article correspondant aux mots clés"
End If
End With
End SubBonjour h2so4,
Un tout grand merci pour cet exemple qui fonctionne parfaitement
J'ai quand même un soucis pour modifier mon Tool :
J'utilise un Useform qui me permet d'afficher les résultats de la recherche par mot clé dans une ListBox
Lorsque l'on Click sur l'un des résultat, d'autres TextBox sont alimentées par d'autres information du tableau source ( se fait dans une autre fonction Private Sub Txtselect_Change() )
Je n'arrive pas à transcrire votre solution vers la ListBox ainsi que de faire en sorte que la recherche puisse se faire sans devoir faire attention aux majuscules minuscules et accents
bonjour,
pour une recherche sans accent indépendante de la casse, le plus performant est d'ajouter une colonne dans laquelle tu mets ton libellé sans accent et en majuscule ou en minuscule. et tu fais tes recherches avec tes mots clés (sans accent dans la casse qui convient) sur cette colonne.
je t'ai mis une fonction qui convertit un texte en minuscule sans accent, avec exemple d'utilisation. Pour la mise du résultat dans la listbox, cela doit se faire à la place de l'affichage des résultats.