PLusieur mots pour 1 textbox pour filtre Listbox
Bonjour, j'ai actuellement un code me permettant de filtrer les valeurs d'une listbox grâce a un textbox, mais je ne peux pas ecrire dans ma texbox box des valeurx sur deux colonne d'une ligne.
Je m'explique ,
Si jai par exemple les lignes :
HYD 2 MrDupond Pompe1 2rue des petunias
HYD 3 MrJoli Pompe1 4rue de Rome
Et que je rentre dans mon textbox " Pompe1" , les deux lignes ressortent , mais si je met "MrDupond Pompe1" rien ne s'affiche dans le tableau ... et c'est ici qu'est le problème car aujourd'hui je dois rechercher dans 200 ligne de "pompe1" un mrdupond ...
Et je ne sais pas comment adapter mon code à ce critère ... Donc je fais appel à vous !
Voici le code :
Private O As Worksheet 'déclare la variable O (Onglet)
Private TC As Variant 'déclare la variable TC (Tableau de Cellules)
Private NL As Integer 'déclare la variable NL (Nombre de Lignes)
Private NC As Integer 'déclare la variable NC (Nombre de Colonnes)
Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Set O = Sheets("RECAPITULATIF") 'définit l'onglet O
TC = O.Cells(2, 1).Resize(O.UsedRange.Rows.Count - 2, 17) 'définit le tableau de cellules TC
NL = UBound(TC, 1) 'définit le nombre de ligne NL
NC = UBound(TC, 2) 'définit le nombre de colonnes NC
Me.ListBox1.ColumnCount = NC 'définit le nombre de colonne de la ListBox1
End Sub
Private Sub TextBox1_Change() 'au changement dans la Textbox1
Dim i As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable L (incrément)
Dim TOT() As Variant 'déclare la variable TOT (Tableau des Occcurrences Trouvées)
Dim l As Integer 'déclare la variable L (incrément)
If Me.TextBox1.Value = "" Then 'condition : si la Textbox1 est effacée
Me.ListBox1.Clear 'vide la ListBox1
Me.Label1.Caption = "" 'efface la Label1
Exit Sub 'sort de la procédure
End If 'fin de la condition
Me.ListBox1.Clear 'vide la ListBox1
K = 1 'initialise la variable K
For i = 2 To NL 'boucle 1 : sur toutes les lignes I du tableau de cellule TC (en partant de la seconde)
For J = 1 To NC 'boucle 2 : sur toutes les colonnes J du tableau de cellules TC
'condition : si la valeur de la TetxBox1 est contenue dans la valeur ligne I colonne J de TC
If UCase(TC(i, J)) Like "*" & UCase(Me.TextBox1.Value) & "*" Then
'redimensionne le tableau des occurrences trouvées TOT (autant de lignes que TC a de colonnes, K colonnes)
ReDim Preserve TOT(1 To NC, 1 To K)
For l = 1 To NC 'boucle 3 : sur toutes les colonnes de TC
TOT(l, K) = TC(i, l) 'alimente la ligne du tableau TOT avec la colonne du tableau TC
Next l 'prochaine colonne de la boucle 3
K = K + 1 'incrémete K (nouvelle colonne pour TOT)
Exit For 'sort de la boucle 2
End If 'fin de la condition
Next J 'prochaine colonne de la boucle 2
Next i 'prochaine ligne de la boucle 1
On Error Resume Next 'gestion des erreur (en cas d'erreur passe à la ligne suivante)
'si le tableau TOT ne contient qu'une seule ligne, ajoute une seconde ligne vide (sinon les données sans dans une seule colonne...)
If UBound(TOT, 2) = 1 Then ReDim Preserve TOT(1 To NC, 1 To 2)
'alimente la ListBox1 avec le tableau TOT transposé (ligne/Colonne)
Me.ListBox1.List = Application.Transpose(TOT) 'génère une erreur si TOT est vide
'si une erreur a été générée, message, sort de la procédure
If Err <> 0 Then Me.Label1.Caption = "Aucune occurrence trouvée !": Exit Sub
Me.Label1.Caption = K - 1 & IIf(K - 1 = 1, " occurrence trouvé !", " occurrences trouvées !")
End SubMerci de votre aide !
Cordialement,
Bonjour et bienvenue sur le forum
Tu devrais joindre ton fichier...
Bye !
Un essai à tester.
La recherche doit porter sur les colonnes C et D. ex "rennes moi"
Cela te convient-il ?
Bye !
Re,
C'est exactement ce que je veux , mais n'est il pas possible d'appliquer cela pour les colonnes E, F,G,J ??
J'ai trouvé la ligne que tu a modifiée mais je ne la comprend pas ( n'étant pas expérimenté..) donc je ne saurais pas la modifier :/
Merci de ton aide !!
Bonjour
Pour 2 colonnes, ça va mais pour plus ... je ne vois pas.
A moins de saisir dans plusieurs textbox, chacune correspondant à une colonne précise : cà, on peut essayer si cela te convient.
Bye !
Bonjour ,
Je crois qu'il n'y aurait rien de mieux que ça . Bon je pense que cela suffira pour le bouton rechercher , je changerais juste la deuxième colonne de recherche .
Mais ce que tu m'as dis m'intéresse beaucoup , je galère depuis deux jours à faire un userform statistique .
Celui-ci consiste à me donner là somme d'euro de me différentes interventions ,en fonction de la date , de la marques et de l'agence.
J'envoie mes essais en dessous, j'ai essayé de repartir du même code , je l'ai copié 3 fois pour chaque critères , mais lorsque je filtre , le dernier critère choisi dans la textbox n'est pas pris en compte ...
A noter que je ne remplit pas forcément les 3 textbox , je peux remplir par exemple que la date (2016 ) et l'agence (Rouen)..
Merci de ton aide précieuse !!!
Cordialement
Bonjour
Un essai à tester.
J'ai changé les noms des TexBox2 et TextBox3 qui en fait étaient des "ComboBox'', ou liste déroulantes, ce qui prêtait à confusion.
Bye !
bonjour, je viens de tester ton code, malheureusement celui ci ne fonctionne pas bien, je m'explique.
Lorsque je choisi une agence une marque et une date, puis que je change l'agence , les dates et les marque ne sont plus filtrer , et je suis obliger de les re-sélectionner . Mais le plus gênant est que je peux pas choisir uniquement une date , ou uniquement une marque ...
Merci énormément pour le temps que tu accorde pour m'aider !!
Cordialement,
Bonjour,
Sur cette version, on peut rechercher plusieurs mots dans toutes les colonnes dans un ordre quelconque.
Dim f, choix(), Rng
Private Sub UserForm_Initialize()
Set f = Sheets("bd")
Set Rng = f.Range("a3:f" & f.[a65000].End(xlUp).Row)
TblTmp = Rng.Value
For i = LBound(TblTmp) To UBound(TblTmp)
ReDim Preserve choix(1 To i)
For k = LBound(TblTmp) To UBound(TblTmp, 2)
choix(i) = choix(i) & TblTmp(i, k) & " * "
Next k
Next i
Me.ListBox1.List = choix
End Sub
Private Sub TextBox1_Change()
mots = Split(Trim(Me.TextBox1), " ")
Tbl = choix
For i = LBound(mots) To UBound(mots)
Tbl = Filter(Tbl, mots(i), True, vbTextCompare)
Next i
Me.ListBox1.List = Tbl
Me.Label1.Caption = UBound(Tbl) + 1
End Sub
Private Sub ListBox1_Click()
a = Split(ListBox1, "*")
For k = LBound(a) To UBound(a) - 1
Me("TextBox" & k + 2) = a(k)
Next k
End SubCeuzin
Bonjour,
Merci pour ton fichier, il est parfait tout marche la perfection , mais lorsque j'ai copié le code de l'userform sur mon ficher principal, un message d’erreur apparaît, il s’agit d'une incompatibilité de type ...
Le message est localisé sur les ligne suivantes :
If (TC(I, 3) = ComboBox1 Or ComboBox1 = "") _
And (UCase(TC(I, 6)) = ComboBox2 Or ComboBox2 = "") _
And (Val(TextBox1) = Year(TC(I, 10)) Or TextBox1 = "") ThenJe ne comprend vraiment pas pourquoi il se passe cela...
Je remet le code en entier :
Private O As Worksheet 'déclare la variable O (Onglet)
Private TC As Variant 'déclare la variable TC (Tableau de Cellules)
Private NL As Integer 'déclare la variable NL (Nombre de Lignes)
Private NC As Integer 'déclare la variable NC (Nombre de Colonnes)
Dim dico As Object, C, temp, a, gauc, droi, d, g, ref, tempo
Private Sub userform_initialize()
Me.ListBox1.ColumnCount = 10
ComboBox1.List() = Array("", "ROUEN", "ANGERS", "TOURS", "NANTES", "RENNES", "BREST")
ComboBox2.List() = Array("", "COCA", "LABAS", "ICI")
Set O = Sheets("RECAPITULATIF") 'définit l'onglet O
'TC = O.Cells(2, 1).Resize(O.UsedRange.Rows.Count - 2, 17) 'définit le tableau de cellules TC
TC = O.Range("A2:S" & O.Range("A" & Rows.Count).End(xlUp).Row)
NL = UBound(TC, 1) 'définit le nombre de ligne NL
NC = UBound(TC, 2) 'définit le nombre de colonnes NC
End Sub
Sub Tri(a, gauc, droi) ' Quick sort
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
Do While a(g) < ref: g = g + 1: Loop
Do While ref < a(d): d = d - 1: Loop
If g <= d Then
tempo = a(g): a(g) = a(d): a(d) = tempo
g = g + 1: d = d - 1
End If
Loop While g <= d
If g < droi Then Call Tri(a, g, droi)
If gauc < d Then Call Tri(a, gauc, d)
End Sub
Private Sub TextBox1_Change() 'au changement dans la Textbox1
Call Choix
Exit Sub
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable L (incrément)
Dim TOT() As Variant 'déclare la variable TOT (Tableau des Occcurrences Trouvées)
Dim L As Integer 'déclare la variable L (incrément)
K = 1 'initialise la variable K
For I = 2 To NL 'boucle 1 : sur toutes les lignes I du tableau de cellule TC (en partant de la seconde)
'For J = 10 To 10 'boucle 2 : sur toutes les colonnes J du tableau de cellules TC
'condition : si la valeur de la TetxBox1 est contenue dans la valeur ligne I colonne J de TC
'If UCase(TC(I, 10)) Like "*" & UCase(Me.TextBox1.Value) & "*" Then
If Year(TC(I, 10)) = Val(TextBox1) And UCase(TC(I, 6)) = ComboBox2 And TC(I, 3) = ComboBox1 Then
'redimensionne le tableau des occurrences trouvées TOT (autant de lignes que TC a de colonnes, K colonnes)
ReDim Preserve TOT(1 To NC, 1 To K)
For L = 1 To NC 'boucle 3 : sur toutes les colonnes de TC
TOT(L, K) = TC(I, L) 'alimente la ligne du tableau TOT avec la colonne du tableau TC
Next L 'prochaine colonne de la boucle 3
K = K + 1 'incrémete K (nouvelle colonne pour TOT)
'Exit For 'sort de la boucle 2
End If 'fin de la condition
'Next J 'prochaine colonne de la boucle 2
Next I 'prochaine ligne de la boucle 1
On Error Resume Next 'gestion des erreur (en cas d'erreur passe à la ligne suivante)
'si le tableau TOT ne contient qu'une seule ligne, ajoute une seconde ligne vide (sinon les données sans dans une seule colonne...)
If UBound(TOT, 2) = 1 Then ReDim Preserve TOT(1 To NC, 1 To 2)
'alimente la ListBox1 avec le tableau TOT transposé (ligne/Colonne)
Me.ListBox1.List = Application.Transpose(TOT) 'génère une erreur si TOT est vide
End Sub
Private Sub ComboBox1_Change() 'au changement dans la ComboBox1
Call Choix
End Sub
Sub Choix()
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable L (incrément)
Dim TOT() As Variant 'déclare la variable TOT (Tableau des Occcurrences Trouvées)
Dim L As Integer 'déclare la variable L (incrément)
K = 1 'initialise la variable K
For I = 2 To NL 'boucle 1 : sur toutes les lignes I du tableau de cellule TC (en partant de la seconde)
'For J = 3 To 3 'boucle 2 : sur toutes les colonnes J du tableau de cellules TC
'condition : si la valeur de la TetxBox1 est contenue dans la valeur ligne I colonne J de TC
'If UCase(TC(I, 3)) Like "*" & UCase(Me.ComboBox1.Value) & "*" Then
If (TC(I, 3) = ComboBox1 Or ComboBox1 = "") _
And (UCase(TC(I, 6)) = ComboBox2 Or ComboBox2 = "") _
And (Val(TextBox1) = Year(TC(I, 10)) Or TextBox1 = "") Then
'redimensionne le tableau des occurrences trouvées TOT (autant de lignes que TC a de colonnes, K colonnes)
ReDim Preserve TOT(1 To NC, 1 To K)
For L = 1 To NC 'boucle 3 : sur toutes les colonnes de TC
TOT(L, K) = TC(I, L) 'alimente la ligne du tableau TOT avec la colonne du tableau TC
Next L 'prochaine colonne de la boucle 3
K = K + 1 'incrémete K (nouvelle colonne pour TOT)
'Exit For 'sort de la boucle 2
End If 'fin de la condition
'Next J 'prochaine colonne de la boucle 2
Next I 'prochaine ligne de la boucle 1
On Error Resume Next 'gestion des erreur (en cas d'erreur passe à la ligne suivante)
'si le tableau TOT ne contient qu'une seule ligne, ajoute une seconde ligne vide (sinon les données sans dans une seule colonne...)
If UBound(TOT, 2) = 1 Then ReDim Preserve TOT(1 To NC, 1 To 2)
'alimente la ListBox1 avec le tableau TOT transposé (ligne/Colonne)
Me.ListBox1.List = Application.Transpose(TOT) 'génère une erreur si TOT est vide
End Sub
Private Sub ComboBox2_Change() 'au changement dans la Textbox1
Call Choix
Exit Sub
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable L (incrément)
Dim TOT() As Variant 'déclare la variable TOT (Tableau des Occcurrences Trouvées)
Dim L As Integer 'déclare la variable L (incrément)
K = 1 'initialise la variable K
For I = 2 To NL 'boucle 1 : sur toutes les lignes I du tableau de cellule TC (en partant de la seconde)
'For J = 6 To 6 'boucle 2 : sur toutes les colonnes J du tableau de cellules TC
'condition : si la valeur de la TetxBox1 est contenue dans la valeur ligne I colonne J de TC
'If UCase(TC(I, 2)) Like "*" & UCase(Me.ComboBox2.Value) & "*" Then
If UCase(TC(I, 6)) = ComboBox2 And TC(I, 3) = ComboBox1 Then
'redimensionne le tableau des occurrences trouvées TOT (autant de lignes que TC a de colonnes, K colonnes)
ReDim Preserve TOT(1 To NC, 1 To K)
For L = 1 To NC 'boucle 3 : sur toutes les colonnes de TC
TOT(L, K) = TC(I, L) 'alimente la ligne du tableau TOT avec la colonne du tableau TC
Next L 'prochaine colonne de la boucle 3
K = K + 1 'incrémete K (nouvelle colonne pour TOT)
'Exit For 'sort de la boucle 2
End If 'fin de la condition
'Next J 'prochaine colonne de la boucle 2
Next I 'prochaine ligne de la boucle 1
On Error Resume Next 'gestion des erreur (en cas d'erreur passe à la ligne suivante)
'si le tableau TOT ne contient qu'une seule ligne, ajoute une seconde ligne vide (sinon les données sans dans une seule colonne...)
If UBound(TOT, 2) = 1 Then ReDim Preserve TOT(1 To NC, 1 To 2)
'alimente la ListBox1 avec le tableau TOT transposé (ligne/Colonne)
Me.ListBox1.List = Application.Transpose(TOT) 'génère une erreur si TOT est vide
End SubMerci de ton aide !!
Cordialement,
Bonjour
Sans le fichier qui va avec le code, je ne puis pas faire grand-chose.
Désolé !
Bye !
Bonjour,
Nouvelle version
Les mots peuvent être saisis dans un ordre quelconque.
Lz recherche se fait dans toutes les colonnes de la BD
Dim f, choix(), Rng, Ncol
Private Sub UserForm_Initialize()
Set f = Sheets("bd")
Set Rng = f.Range("a3:R" & f.[a65000].End(xlUp).Row)
TblTmp = Rng.Value
Ncol = Rng.Columns.Count
For i = LBound(TblTmp) To UBound(TblTmp)
ReDim Preserve choix(1 To i)
For k = LBound(TblTmp) To UBound(TblTmp, 2)
choix(i) = choix(i) & TblTmp(i, k) & " * "
Next k
Next i
Me.ListBox1.List = Rng.Value
End Sub
Private Sub TextBox1_Change()
If Me.TextBox1 <> "" Then
mots = Split(Trim(Me.TextBox1), " ")
Tbl = choix
For i = LBound(mots) To UBound(mots)
Tbl = Filter(Tbl, mots(i), True, vbTextCompare)
Next i
n = 0: Dim b()
For i = LBound(Tbl) To UBound(Tbl)
a = Split(Tbl(i), "*")
n = n + 1: ReDim Preserve b(1 To Ncol, 1 To n)
For k = 1 To Ncol
b(k, i + 1) = a(k - 1)
Next k
Next i
If n > 0 Then
ReDim Preserve b(1 To Ncol, 1 To n + 1)
Me.ListBox1.List = Application.Transpose(b)
Me.ListBox1.RemoveItem n
End If
Me.Label1.Caption = UBound(Tbl) + 1
Else
UserForm_Initialize
End If
End SubCeuzin
Bonjour gmd ,
Voici le fichier avec l'erreur, j'ai remarqué que si le nombre de ligne était faible, cela marchait...
Voici le ficher :
Merci de ton aide!
Bonjour ceuzin , merci pour ta version du bouton recherche !