filtre textbox comme dans Itune ......

kevenpom

XLDnaute Junior
Bonjour a tous,
voilà j'ai un textbox avec une listbox quand je tape mon texte dans ma textbox il recherche dans ma feuille colonne A.

Le problème ses que j'aimerait que ma recherche se fasse a partir de n'importe ou dans la chaine de caractère..... et non pas seulement a partir de la gauche...
exemple comme dans Itune quand ont tape "park lin"
bien il nous ressort tout le "linkin park"
pour l'instant si ma chaine de caractère est "salut 1234"
je doit absolument taper dans ma textbox "sal" pour qu'il me ressorte mon "salut 1234"
alors que j'aimerai pouvoir taper "12 sa" pour qu'il me sorte ma chaine "salut 1234".

Voici mon code ....
Merci encore pour votre support.
Code:
Private Sub TextBoxRechCode_Change()
ListBox1.Clear
ListBox2.Clear
N = 0
Recherche = TextBoxRechCode.Value
Ligne = Worksheets("vente").Range("a" & "65536").End(xlUp).Row
Set Plage = Worksheets("vente").Range("a" & "1:" & "a" & Ligne)
With Plage
Set C = .Find(Recherche)
If Not C Is Nothing Then
Adresse = C.Address
Do
    If UCase(Recherche) = UCase(Left(C, Len(Recherche))) Then
        ListBox1.AddItem C.Offset(0, 0), N
        ListBox1.List(N, 0) = C
        ListBox1.List(N, 1) = C.Offset(0, 1)
        ListBox1.List(N, 2) = C.Offset(0, 2)
        ListBox1.List(N, 3) = C.Offset(0, 3)
        ListBox1.List(N, 4) = C.Offset(0, 4)
        N = N + 1
    End If
    Set C = .FindNext(C)
    Loop While Not C Is Nothing And C.Address <> Adresse
    End If
End With
For x = 1 To 8
 Controls("Textbox" & x) = ""
Next x
If TextBoxRechCode = "" Then ListBox1.List = t
 
Dernière édition:

Banzai64

XLDnaute Accro
Re : filtre textbox comme dans Itune ......

Bonsoir

A tester

Private Sub TextBoxRechCode_Change()
ListBox1.Clear
ListBox2.Clear
N = 0
If Trim(TextBoxRechCode) = "" Then Exit Sub
Recherche = TextBoxRechCode.Value
Ligne = Worksheets("vente").Range("a" & "65536").End(xlUp).Row
Set Plage = Worksheets("vente").Range("a" & "1:" & "a" & Ligne)
With Plage
Set C = .Find("*" & Recherche & "*")
If Not C Is Nothing Then
Adresse = C.Address
Do
'If Recherche = UCase(Left(C, Len(Recherche))) Then
ListBox1.AddItem C.Offset(0, 0), N
ListBox1.List(N, 0) = C
ListBox1.List(N, 1) = C.Offset(0, 1)
ListBox1.List(N, 2) = C.Offset(0, 2)
ListBox1.List(N, 3) = C.Offset(0, 3)
ListBox1.List(N, 4) = C.Offset(0, 4)
N = N + 1
'End If
Set C = .FindNext(C)
Loop While Not C Is Nothing And C.Address <> Adresse
End If
End With
For x = 1 To 8
Controls("Textbox" & x) = ""
Next x
If TextBoxRechCode = "" Then ListBox1.List = t
End Sub
 

JNP

XLDnaute Barbatruc
Re : filtre textbox comme dans Itune ......

Bonjour le fil :),
Sans fichier, difficile de tester :mad:...
VB:
Private Sub TextBoxRechCode_Change()
ListBox1.Clear
ListBox2.Clear
N = 0
recherche = Split(TextBoxRechCode.Value, " ")
Ligne = Worksheets("vente").Range("a" & "65536").End(xlUp).Row
Set Plage = Worksheets("vente").Range("a" & "1 : " & "a" & Ligne)
With Plage
Set c = .Find(recherche(0))
If Not c Is Nothing Then
Adresse = c.Address
Do
flag = True
If UBound(recherche) > 0 Then
For j = 1 To UBound(recherche)
If Not InStr(1, c, recherche(j), vbTextCompare) Then
flag = False
Exit For
End If
Next j
End If
If flag = True Then
ListBox1.AddItem c.Offset(0, 0), N
ListBox1.List(N, 0) = c
ListBox1.List(N, 1) = c.Offset(0, 1)
ListBox1.List(N, 2) = c.Offset(0, 2)
ListBox1.List(N, 3) = c.Offset(0, 3)
ListBox1.List(N, 4) = c.Offset(0, 4)
N = N + 1
End If
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> Adresse
End If
End With
For x = 1 To 8
Controls("Textbox" & x) = ""
Next x
If TextBoxRechCode = "" Then ListBox1.List = t
Bon dimanche :cool:
 
Dernière édition:

kevenpom

XLDnaute Junior
Re : filtre textbox comme dans Itune ......

Voici mon fichier

ChTi160 merci pour ton fichier j'ai mune partie de fait...
mais il gère seulement un seul mot il ne gère pas les mots inversés...

alors que j'aimerai pouvoir taper "12 sa" pour qu'il me sorte ma chaine "salut 1234".

merci encore.

JNP ton code marche excepter pour l'inversion...
et quand jefface mes caractère dans ma textbox bien au dernier il me donne une erreur?
 

Pièces jointes

  • keven.zip
    38.9 KB · Affichages: 46
  • keven.zip
    38.9 KB · Affichages: 48
  • keven.zip
    38.9 KB · Affichages: 46
Dernière édition:

kevenpom

XLDnaute Junior
Re : filtre textbox comme dans Itune ......

j'ai fait une recherche sur le net
mais j'ai rien trouver a par Levenshtein distance
mais sa ne me sera pas utile.
Je sais pas quelle est le nom de algorithme utilisé dans itune ou foobar2000
si quelle qu'un connait la réponse....


Merci et bonne journée
 

JNP

XLDnaute Barbatruc
Re : filtre textbox comme dans Itune ......

Re :),
A condition de modifier tes déclarations
Code:
Dim Plage As Range, C As Range, t, t2 As Variant
Dim Recherche, Adresse As String, x As Byte
Dim Ligne, Ligne2 As Integer, N, N2 As Integer
Dim I As Integer, J As Integer, Multi As Boolean, Flag As Boolean
Attention à Recherche qui ne doit pas être déclarée en String
Code:
Private Sub TextBoxRechCode_Change()
If TextBoxRechCode = "" Or Right(TextBoxRechCode, 1) = " " Then Exit Sub
ListBox1.Clear
ListBox2.Clear
N = 0
Recherche = Split(TextBoxRechCode.Value, " ")
If InStr(1, TextBoxRechCode, " ", vbTextCompare) <> 0 Then Multi = True Else Multi = False
Ligne = Worksheets("vente").Range("a" & "65536").End(xlUp).Row
Set Plage = Worksheets("vente").Range("a" & "1 : " & "a" & Ligne)
With Plage
If Multi Then Set C = .Find(Recherche(0), LookAt:=xlPart) Else Set C = .Find(Recherche, LookAt:=xlPart)
If Not C Is Nothing Then
Adresse = C.Address
Do
Flag = True
If Multi Then
For J = 1 To UBound(Recherche)
If InStr(1, C, Recherche(J), vbTextCompare) = 0 Then
Flag = False
Exit For
End If
Next J
End If
    If Flag = True Or Multi = False Then
        ListBox1.AddItem C.Offset(0, 0), N
        ListBox1.List(N, 0) = C
        ListBox1.List(N, 1) = C.Offset(0, 1)
        ListBox1.List(N, 2) = C.Offset(0, 2)
        ListBox1.List(N, 3) = C.Offset(0, 3)
        ListBox1.List(N, 4) = C.Offset(0, 4)
        N = N + 1
    End If
    Set C = .FindNext(C)
    Loop While Not C Is Nothing And C.Address <> Adresse
    End If
End With
For x = 1 To 8
 Controls("Textbox" & x) = ""
Next x
If TextBoxRechCode = "" Then ListBox1.List = t
End Sub
semble fonctionner chez moi ;).
A + :cool:
 

kevenpom

XLDnaute Junior
Re : filtre textbox comme dans Itune ......

oui désoler Banzai64,
ton code fonctionne mais malheureusement il ne gère pas les inversés
alors que j'aimerai pouvoir taper "12 sa" pour qu'il me sorte ma chaine "salut 1234".



JNP
Code:
If TextBoxRechCode = "" Or Right(TextBoxRechCode, 1) = " " Then Exit Sub
ses se petit bout de code que je n'avait pas :)

Merci JNP cela fonctionne a merveille

mais maintenant comment faire pour que mon TextBoxRechCode tienne compte de mon TextBoxRechLib et vice versa
car j'aimerait que mon filtre de ma listebox tienne compte de ma
TextBoxRechLib,
TextBoxRechCode,
TextBoxnocommande,
car pour l'instant il sont indépendant les un des autre j'aimerais que si j'ajoute un numéro dans le TextBoxRechCode il tienne compte de cette TextBoxRechCode et de la TextBoxRechLib.

thx
 

Pièces jointes

  • keven.zip
    45.3 KB · Affichages: 48
  • keven.zip
    45.3 KB · Affichages: 46
  • keven.zip
    45.3 KB · Affichages: 44
Dernière édition:

kevenpom

XLDnaute Junior
Re : filtre textbox comme dans Itune ......

mais maintenant comment faire pour que mon TextBoxRechCode tienne compte de mon TextBoxRechLib et vice versa
car j'aimerait que mon filtre de ma listebox tienne compte de ma
TextBoxRechLib,
TextBoxRechCode,
TextBoxnocommande,
car pour l'instant il sont indépendant les un des autre j'aimerais que si j'ajoute un numéro dans le TextBoxRechCode il tienne compte de cette TextBoxRechCode et de la TextBoxRechLib
:D
 

JNP

XLDnaute Barbatruc
Re : filtre textbox comme dans Itune ......

Re :),
Techniquement, je mettrais l'algorithme de recherche en fonction et suivant les cas, j'enverrais les bonnes requêtes.
Vu que tu as l'air de bien suivre la structure de mon code, jette un oeil au fil de david84 (et moi), où je filtre le chargement des combobox (un peu long à lire, mais enrichissant j'espère :p...). Je pense que tu pourras filtrer de même en fonction de tes résultats ;).
Bon courage :cool:
 

kevenpom

XLDnaute Junior
Re : filtre textbox comme dans Itune ......

Merci encore JNP j'ai lu ta gestion asociative mais ses que toi elle se déroule dans une liste déroulante et les matchs ne sont pas afficher dans une liste boxe...
Mon problème ses que en bas de 200 ligne de donnée aucun lag mais la jai 8000 ligne sur chaqu'une de mes 2 feuilles donc j'ai du changer des integer pour des long. et la sa rame a fond.... je ne suis pas asser caller en vba pour ajuster mon code a ta fonction....

Y a t'il quelque chose dans mon code qui serait la cause de se lag énorme..
(16 seconde a chaque fois je presse une touche dans mes textbox)
Merci encore :(
Voila mon code
Code:
Option Explicit
Option Compare Text
Dim Plage As Range, C As Range, t, t2 As Variant
Dim Recherche, Adresse As String, x As Byte
Dim ligne, Ligne2 As Integer, N, N2 As Long
Dim I As Integer, J As Integer, Multi As Boolean, Flag As Boolean



Private Sub btsortir_Click()
UserFormBiblio.Hide
End Sub
Private Sub ComboBox1_Change()
Sheets(ComboBox1.Value).Select
UserForm_Initialize
End Sub

Private Sub Label1_Click()

End Sub

Private Sub Label13_Click()

End Sub

Private Sub Label17_Click()

End Sub

Private Sub Label18_Click()

End Sub

Private Sub Label23_Click()

End Sub

Private Sub ListBox1_Click()
Controls("Textbox6") = ""
Controls("Textbox7") = ""
Controls("Textbox8") = ""
For x = 1 To 5
 Controls("Textbox" & x) = ListBox1.List(ListBox1.ListIndex, x - 1)
Next x
End Sub

Private Sub ListBox2_Click()
Controls("Textbox3") = ""
Controls("Textbox4") = ""
Controls("Textbox5") = ""
Controls("Textbox1") = ListBox2.List(ListBox2.ListIndex, 0)
Controls("Textbox2") = ListBox2.List(ListBox2.ListIndex, 1)
Controls("Textbox6") = ListBox2.List(ListBox2.ListIndex, 2)
Controls("Textbox7") = ListBox2.List(ListBox2.ListIndex, 3)
Controls("Textbox8") = ListBox2.List(ListBox2.ListIndex, 4)
End Sub

Private Sub TextBox11_Change()
End Sub

Private Sub Textbox2_Change()

End Sub

Private Sub TextBoxnoachat_Change()
End Sub

Private Sub TextBoxnocommande_Change()
End Sub

Private Sub TextBoxnofournisseur_Change()
End Sub

Private Sub TextBoxnomclient_Change()
End Sub

Private Sub TextBoxRechCode_Change()

'------------------- début no produit listbox1------------------'
If TextBoxRechCode = "" Or Right(TextBoxRechCode, 1) = " " Then Exit Sub
ListBox1.Clear
ListBox2.Clear
N = 0
Recherche = Split(TextBoxRechCode.Value, " ")
If InStr(1, TextBoxRechCode, " ", vbTextCompare) <> 0 Then Multi = True Else Multi = False
ligne = Worksheets("vente").Range("a" & "65536").End(xlUp).Row
Set Plage = Worksheets("vente").Range("a" & "1 : " & "a" & ligne)
With Plage
If Multi Then Set C = .Find(Recherche(0), LookAt:=xlPart) Else Set C = .Find(Recherche, LookAt:=xlPart)
If Not C Is Nothing Then
Adresse = C.Address
Do
Flag = True
If Multi Then
For J = 1 To UBound(Recherche)
If InStr(1, C, Recherche(J), vbTextCompare) = 0 Then
Flag = False
Exit For
End If
Next J
End If
    If Flag = True Or Multi = False Then
        ListBox1.AddItem C.Offset(0, 0), N
        ListBox1.List(N, 0) = C
        ListBox1.List(N, 1) = C.Offset(0, 1)
        ListBox1.List(N, 2) = C.Offset(0, 2)
        ListBox1.List(N, 3) = C.Offset(0, 3)
        ListBox1.List(N, 4) = C.Offset(0, 4)
        N = N + 1
    End If
    Set C = .FindNext(C)
    Loop While Not C Is Nothing And C.Address <> Adresse
    End If
End With
For x = 1 To 8
 Controls("Textbox" & x) = ""
Next x
If TextBoxRechCode = "" Then ListBox1.List = t
'------------------- fin no produit listbox1------------------'


'------------------- début no produit listbox2------------------'
N = 0
ligne = Worksheets("achat").Range("a" & "65536").End(xlUp).Row
Set Plage = Worksheets("achat").Range("a" & "1 : " & "a" & ligne)
With Plage
If Multi Then Set C = .Find(Recherche(0), LookAt:=xlPart) Else Set C = .Find(Recherche, LookAt:=xlPart)
If Not C Is Nothing Then
Adresse = C.Address
Do
Flag = True
If Multi Then
For J = 1 To UBound(Recherche)
If InStr(1, C, Recherche(J), vbTextCompare) = 0 Then
Flag = False
Exit For
End If
Next J
End If
    If Flag = True Or Multi = False Then
        ListBox2.AddItem C.Offset(0, 0), N
        ListBox2.List(N, 0) = C
        ListBox2.List(N, 1) = C.Offset(0, 1)
        ListBox2.List(N, 2) = C.Offset(0, 2)
        ListBox2.List(N, 3) = C.Offset(0, 3)
        ListBox2.List(N, 4) = C.Offset(0, 4)
        N = N + 1
    End If
    Set C = .FindNext(C)
    Loop While Not C Is Nothing And C.Address <> Adresse
    End If
End With
For x = 1 To 8
 Controls("Textbox" & x) = ""
Next x
If TextBoxRechCode = "" Then ListBox2.List = t2
'------------------- fin no produit listbox2------------------'

End Sub

Private Sub TextBoxRechLib_Change()
'------------------- début description listbox1------------------'
If TextBoxRechLib = "" Or Right(TextBoxRechLib, 1) = " " Then Exit Sub
ListBox1.Clear
ListBox2.Clear
N = 0
Recherche = Split(TextBoxRechLib.Value, " ")
If InStr(1, TextBoxRechLib, " ", vbTextCompare) <> 0 Then Multi = True Else Multi = False
ligne = Worksheets("vente").Range("b" & "65536").End(xlUp).Row
Set Plage = Worksheets("vente").Range("b" & "1 : " & "b" & ligne)
With Plage
If Multi Then Set C = .Find(Recherche(0), LookAt:=xlPart) Else Set C = .Find(Recherche, LookAt:=xlPart)
If Not C Is Nothing Then
Adresse = C.Address
Do
Flag = True
If Multi Then
For J = 1 To UBound(Recherche)
If InStr(1, C, Recherche(J), vbTextCompare) = 0 Then
Flag = False
Exit For
End If
Next J
End If
    If Flag = True Or Multi = False Then
         ListBox1.AddItem C.Offset(0, 0), N
         ListBox1.List(N, 1) = C
         ListBox1.List(N, 0) = C.Offset(0, -1)
         ListBox1.List(N, 2) = C.Offset(0, 1)
         ListBox1.List(N, 3) = C.Offset(0, 2)
         ListBox1.List(N, 4) = C.Offset(0, 3)
         N = N + 1
    End If
    Set C = .FindNext(C)
    Loop While Not C Is Nothing And C.Address <> Adresse
    End If
End With
For x = 1 To 8
 Controls("Textbox" & x) = ""
Next x
If TextBoxRechLib = "" Then ListBox1.List = t
'------------------- fin description listbox1------------------'



'------------------- debut description listbox2------------------'
N = 0
If InStr(1, TextBoxRechLib, " ", vbTextCompare) <> 0 Then Multi = True Else Multi = False
ligne = Worksheets("achat").Range("b" & "65536").End(xlUp).Row
Set Plage = Worksheets("achat").Range("b" & "1 : " & "b" & ligne)
With Plage
If Multi Then Set C = .Find(Recherche(0), LookAt:=xlPart) Else Set C = .Find(Recherche, LookAt:=xlPart)
If Not C Is Nothing Then
Adresse = C.Address
Do
Flag = True
If Multi Then
For J = 1 To UBound(Recherche)
If InStr(1, C, Recherche(J), vbTextCompare) = 0 Then
Flag = False
Exit For
End If
Next J
End If
    If Flag = True Or Multi = False Then
         ListBox2.AddItem C.Offset(0, 0), N
         ListBox2.List(N, 1) = C
         ListBox2.List(N, 0) = C.Offset(0, -1)
         ListBox2.List(N, 2) = C.Offset(0, 1)
         ListBox2.List(N, 3) = C.Offset(0, 2)
         ListBox2.List(N, 4) = C.Offset(0, 3)
         N = N + 1
    End If
    Set C = .FindNext(C)
    Loop While Not C Is Nothing And C.Address <> Adresse
    End If
End With
For x = 1 To 8
 Controls("Textbox" & x) = ""
Next x
If TextBoxRechLib = "" Then ListBox2.List = t2
'------------------- fin description listbox2------------------'
End Sub
Private Sub UserForm_Initialize()
ListBox1.ColumnCount = 5
ListBox1.ColumnWidths = "120;332;40;40;120"
t = Worksheets("vente").Range("a1:e" & Range("a65536").End(xlUp).Row)
ListBox1.List = t

ListBox2.ColumnCount = 5
ListBox2.ColumnWidths = "120;332;40;40;120"
t2 = Worksheets("achat").Range("a1:e" & Range("a65536").End(xlUp).Row)
ListBox2.List = t2
'ComboBox1.SetFocus
End Sub

Private Sub viderchamp_Click()
TextBoxRechCode.Value = ""
TextBoxRechLib.Value = ""
TextBoxnocommande.Value = ""
TextBoxnoclient.Value = ""
TextBoxnomclient.Value = ""
TextBoxnoachat.Value = ""
TextBoxnofournisseur.Value = ""
TextBoxnomfournisseur.Value = ""

End Sub
 
Dernière édition:

kevenpom

XLDnaute Junior
Re : filtre textbox comme dans Itune ......

Voici se que j'ai pu améliorer de mon code je fait tout rouler dans le même for au lieu de le faire rouler 2 fois.... mais la chu a 8 sec entre chaque touche...

Code:
Private Sub TextBoxRechCode_Change()

'------------------- début no produit listbox1------------------'
If TextBoxRechCode = "" Or Right(TextBoxRechCode, 1) = " " Then Exit Sub
ListBox1.Clear
ListBox2.Clear
N = 0
N2 = 0
Recherche = Split(TextBoxRechCode.Value, " ")
If InStr(1, TextBoxRechCode, " ", vbTextCompare) <> 0 Then Multi = True Else Multi = False
ligne = Worksheets("vente").Range("a" & "65536").End(xlUp).Row
Set Plage = Worksheets("vente").Range("a" & "1 : " & "a" & ligne)
Ligne2 = Worksheets("achat").Range("a" & "65536").End(xlUp).Row
Set Plage2 = Worksheets("achat").Range("a" & "1 : " & "a" & Ligne2)

With Plage
    If Multi Then Set C = .Find(Recherche(0), LookAt:=xlPart) Else Set C = .Find(Recherche, LookAt:=xlPart)
        If Not C Is Nothing Then
            Adresse = C.Address
            Do
                Flag = True
                If Multi Then
                    For J = 1 To UBound(Recherche)
                        If InStr(1, C, Recherche(J), vbTextCompare) = 0 Then
                            Flag = False
                            Exit For
                        End If
                    Next J
                End If
                If Flag = True Or Multi = False Then
                    ListBox1.AddItem C.Offset(0, 0), N
                    ListBox1.List(N, 0) = C
                    ListBox1.List(N, 1) = C.Offset(0, 1).Text
                    ListBox1.List(N, 2) = C.Offset(0, 2)
                    ListBox1.List(N, 3) = C.Offset(0, 3).Text
                    ListBox1.List(N, 4) = C.Offset(0, 4).Text
                    N = N + 1
                End If
                Set C = .FindNext(C)
            Loop While Not C Is Nothing And C.Address <> Adresse
        End If
End With
With Plage2
    If Multi Then Set D = .Find(Recherche(0), LookAt:=xlPart) Else Set D = .Find(Recherche, LookAt:=xlPart)
        If Not D Is Nothing Then
            Adresse2 = D.Address
            Do
                Flag = True
                If Multi Then
                    For J = 1 To UBound(Recherche)
                        If InStr(1, D, Recherche(J), vbTextCompare) = 0 Then
                            Flag = False
                            Exit For
                        End If
                    Next J
                End If
                If Flag = True Or Multi = False Then
                    ListBox2.AddItem D.Offset(0, 0), N2
                    ListBox2.List(N2, 0) = D
                    ListBox2.List(N2, 1) = D.Offset(0, 1)
                    ListBox2.List(N2, 2) = D.Offset(0, 2)
                    ListBox2.List(N2, 3) = D.Offset(0, 3)
                    ListBox2.List(N2, 4) = D.Offset(0, 4)
                    N2 = N2 + 1
                End If
                Set D = .FindNext(D)
            Loop While Not D Is Nothing And D.Address <> Adresse2
        End If
End With


For x = 1 To 8
 Controls("Textbox" & x) = ""
Next x
If TextBoxRechCode = "" Then ListBox1.List = t
If TextBoxRechCode = "" Then ListBox2.List = t2
 

Discussions similaires

Statistiques des forums

Discussions
312 228
Messages
2 086 421
Membres
103 206
dernier inscrit
diambote