Moteur de recherche via VBA
Bonjour, nous venons juste de remarquer un problème étrange. Dans la base de données, il y a le film X-men, et c'est le seul mit commençant par X. Mais quand on cherche "x", tous les films dand l'ordre de la base de données sont affichés dans la ListBox. Pouvez-vous nous aider s'il vous plaît?
Re,
Avec le code que j'utilise (voir plus bas), quand je tape X ou x, je n'ai que le film "X-Men Day of Futur Past" d'affiché (postez le fichier que vous utilisés pour voir le code car il n'est pas normal que tous les films soient retournés) mais par contre je viens de faire une correction sur le code ci-dessous car j'ai oublié de prendre en compte le décalage dû au fait que la plage commence à la ligne 2. La correction est faite sur la ligne suivante :
.AddItem Plage(Cel.Row - 1, 1).Value 'nom du film en colonne AVoici le code de recherche avec la définition de la plage à partir de A2 :
Private Sub CmdRechercher_Click()
Dim Plage As Range
Dim Cel As Range
Dim I As Long
Dim J As Long
Dim TblNomsVides
Dim Chaine As String
Dim TblChaine
Dim Trouver As Boolean
Dim Adr As String
'mot à éviter
TblNomsVides = Array("et", "ou", "la", "le", "les", "car", "de", "du") 'etc...
'vide au préalable...
ListBox1.Clear
'evite de récupérer tous les films si le TextBox est vide
If TextBox1.Text = "" Then Exit Sub
Set Plage = DefPlage(Worksheets("Feuil1"))
'supprime les éventuels espaces parasites
Chaine = Replace(TextBox1.Text, " ", " ") 'triple (là c'est Parkinson)
Chaine = Replace(Chaine, " ", " ") 'double
Chaine = Trim(Chaine) 'de début et/ou de fin
'splite la chaine dans un tableau pour le bouclage
TblChaine = Split(Chaine, " ")
'vide pour la suite
Chaine = ""
'épure la chaine des mots inutiles (les noms vides)
For I = 0 To UBound(TblChaine)
For J = 0 To UBound(TblNomsVides)
If TblChaine(I) = TblNomsVides(J) Then
Trouver = True
Exit For
End If
Next J
If Trouver = False Then Chaine = Chaine & TblChaine(I) & "-"
Trouver = False
Next I
I = 0 'pour la suite
'supprime le tiret de fin
Chaine = Left(Chaine, Len(Chaine) - 1)
'splite à nouveau pour la recherche de chaque mot
TblChaine = Split(Chaine, "-")
'boucle sur la plage
For Each Cel In Plage
'puis sur le tableau afin de rechercher chaque mot
For J = 0 To UBound(TblChaine)
If Cel.Value Like "*" & TblChaine(J) & "*" Then
'évite d'ajouter à nouveau le nom du film si une autre correspondance est trouvée sur la même ligne
If Cel.Row <> I Then
With ListBox1
'ici moins - à Cel.Row car la plage est définie à partir de A2 (la 1ère ligne étant les entêtes de colonnes)
.AddItem Plage(Cel.Row - 1, 1).Value 'nom du film en colonne A
.Column(1, .ListCount - 1) = Cel.Row 'mémorise le numéro de ligne
Select Case Cel.Column
'entre parenthèses, le numéro de colonne où a été trouvé le mot
Case 1, 3: .Column(2, .ListCount - 1) = "4 (" & Cel.Column & ")" 'pour le nom du film et la colonne des mots clé
Case Else: .Column(2, .ListCount - 1) = "1 (" & Cel.Column & ")" 'ailleurs que dans le nom du film ou la colonne des mots clés
End Select
End With
End If
I = Cel.Row 'mémorise le numéro de ligne
End If
Next J
Next Cel
TextBox2.Text = ListBox1.ListCount
End Sub
Function DefPlage(Fe As Worksheet) As Range
With Fe
Set DefPlage = .Range(.Cells(2, 1), _
.Cells(.Cells.Find("*", _
.Cells(1, 1), -4123, , 1, 2).Row, _
.Cells.Find("*", _
.Cells(2, 1), -4123, , 2, 2).Column))
End With
End FunctionMerci ça fonctionne