(userform) Afficher résultats recherche multiple dans listbox
Bonjour à tous !
Du fait de mon emploi je ne peux pas joindre de fichier mais mon problème est simple à expliquer :
Je n'arrive pas à organiser mon userform... tous les codes que j'ai essayé me posent problème. Avant j'avais un code qui me donnait les résultats de ma recherche dans un label... mais que 2 colonnes affichées, c'était moche. Now, je doit basculer dans une listbox, mon tableau a légèrement changé.... et je suis bloqué
J'ai un userform avec une textbox et une listbox.
Je recherche dans ma colonne de A2:A la valeur de la textbox 1
En résultat Private sub TextBox1_Change() je souhaite afficher dans ma listbox tous les résultats correspondants au critère sélectionné, et les colonnes B, D et G de la même ligne...
Pouvez vous m'aider svp?
Merciiiiiii
(Si vous passez par là, Bonjour à Banzai, ThauTheme, Yvouille et Galopin ^^)
Avant mon code en listbox c'était ça :
Dim Cel As Range, Depart As String, Msg As String
Me.Label2.Caption = ""
With Sheets("Arrestations et Perquisitions")
Set Cel = .Columns("C").Find(what:=Me.TextBox1, LookIn:=xlValues, lookat:=xlWhole)
If Not Cel Is Nothing Then
Depart = Cel.Address
Do
Msg = Msg & vbLf & Cel.Offset(0, -2) & " " & Cel.Offset(0, -1) & " " & Cel
Set Cel = .Columns("C").FindNext(Cel)
Loop While Depart <> Cel.Address
End If
If Len(Msg) > 0 Then
Me.Label2.Caption = Mid(Msg, 2)
Else
Me.Label1.Caption = "Perquisition introuvable"
End If
End With
Bonjour,
une solution possible:
Private Sub TextBox1_Change()
Dim T, Ttemp, i As Long, j As Integer
Me.Label2.Caption = "" 'à conserver ??
ListBox1.ColumnCount = 4
ListBox1.ColumnWidths = "50;50;50;50" ' à adapter
With Sheets("Arrestations et Perquisitions")
T = .Range("A2:G" & .Range("A" & Rows.Count).End(xlUp).Row) 'tableau reprenant toutes les données
ReDim Ttemp(1 To 4, 1 To 1) 'tableau pour récupérer les données
For i = LBound(T, 1) To UBound(T, 1) 'on balaie toutes les données
If UCase(T(i, 3)) = UCase(TextBox1.Value) Then 'si colonne C = textbox les 2 en majuscules
j = j + 1
ReDim Preserve Ttemp(1 To 4, 1 To j)
Ttemp(1, j) = T(i, 1) 'colonne A
Ttemp(2, j) = T(i, 2) 'colonne B
Ttemp(3, j) = T(i, 4) 'colonne D
Ttemp(4, j) = T(i, 7) 'colonne G
End If
Next
End With
ListBox1.Column = Ttemp
End Sub
adapter éventuellement le nom de la listbox, la largeur des colonnes de la listbox
A+
Bonjour,
(Si vous passez par là, Bonjour à Banzai, ThauTheme, Yvouille et Galopin ^^)
Je ne suis ni les uns ni les autres, désolé !
Sheets("Arrestations et Perquisitions")
Déjà là, ça fait flipper, j'espère ne pas finir en zonzon avec la réponse que je vais te donner !
Tu dis :
Je recherche dans ma colonne de A2:A la valeur de la textbox 1
mais dans ton code, la recherche est faite sur la colonne C :
Set Cel = .Columns("C").Find(what:=Me.TextBox1, LookIn:=xlValues, lookat:=xlWhole)
donc
En résultat Private sub TextBox1_Change() je souhaite afficher dans ma listbox tous les résultats correspondants au critère sélectionné, et les colonnes B, D et G de la même ligne...
Tu utilises la procédure événementielle Change() du TextBox donc, à chaque saisie d'un caractère (ou même suppression) la procédure est exécutée mais avec l'argument "LookAt" à xlWhole, tu demandes une recherche exacte donc, t'en que tu n'as pas le mot exact, tu n'auras pas de proposition. Je pense que tu devrais utiliser, pour l'argument "LookAt", la valeur xlPart pour avoir au fur et à mesure les propositions correspondantes aux saisies que tu effectues !
donc au lieu de :
Set Cel = .Columns("C").Find(what:=Me.TextBox1, LookIn:=xlValues, lookat:=xlWhole)
plutôt :
Set Cel = .Columns("C").Find(what:=Me.TextBox1, LookIn:=xlValues, lookat:=xlPart)
Attention de vider la ListBox avant chaque remplissage !
Voici un code qui effectue une recherche partielle sur la colonne A et affiche sur 4 colonnes les résultats correspondants :
Private Sub UserForm_Initialize()
Me.ListBox1.ColumnCount = 4 '4 colonnes A, B, D et G
End Sub
Private Sub TextBox1_Change()
Dim Plage As Range
Dim Cel As Range
Dim Depart As String
Dim Msg As String
Dim I As Integer
' Me.Label2.Caption = ""
'défini la plage sur la colonne A de la feuille "Arrestations et Perquisitions" à partir de A2
With Worksheets("Arrestations et Perquisitions"): Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With
Set Cel = Plage.Find(Me.TextBox1, , xlValues, xlPart)
If Not Cel Is Nothing Then
With ListBox1
.Clear 'vide d'abords la liste !
Depart = Cel.Address
Do
.AddItem Cel.Value 'colonne A
.Column(1, I) = Cel.Offset(, 1).Value 'colonne B
.Column(2, I) = Cel.Offset(, 3).Value 'colonne D
.Column(3, I) = Cel.Offset(, 6).Value 'colonne G
I = I + 1
' Msg = Msg & vbLf & Cel.Offset(0, -2) & " " & Cel.Offset(0, -1) & " " & Cel
Set Cel = Plage.FindNext(Cel)
Loop While Depart <> Cel.Address
End With
End If
' If Len(Msg) > 0 Then
' Me.Label2.Caption = Mid(Msg, 2)
' Else
' Me.Label1.Caption = "Perquisition introuvable"
' End If
End Sub
Messieurs erci pour vos réponses. Je regarde ça lundi matin à l'embauche.
@Theze
- je cite c'est 4 membres parce que je leur ai déjà posé des sujets assez casse tête, et avant ça sur un ancien compte également. Mais c'est un plaisir de te voir également ^^
- le code ne correspond mais comme dit juste avant de le balancer c'était pour montrer un bout de code sur un fichier légèrement différent juste avant sa refonte. C'est plus montrer comment je code... Que déjà si vous voyez des erreurs là dessus vous vous rendiez compte de l'ampleur du travail d'apprentissage
- à priori ta solution semble pas mal du tout je te tiens au courant
Merci à vous deux
Bonjour,
- à priori ta solution semble pas mal du tout je te tiens au courant
Pas de problème
J'ai modifié un poil. Il y a un bug aléatoire qui se place dans la listbox mais j'ai fais quelques lignes pour sécuriser les résultats par derrière. Merci pour ton code c'est celui qui me plaît le mieux
J'ai modifié un poil. Il y a un bug aléatoire qui se place dans la listbox mais j'ai fais quelques lignes pour sécuriser les résultats par derrière. Merci pour ton code c'est celui qui me plaît le mieux
En fait, si je fais une recherche par date avec ce code j'ai un emplacement vide alors que si je fais avec d'autres items ça fonctionne parfaitement