comment filtrer une listbox au fur et à mesure des lettre du textbox

  • Initiateur de la discussion Initiateur de la discussion dindin
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

dindin

XLDnaute Occasionnel
bonjour
le forum
j'ai une listbox qui sert à, afficher une base .
comment puis-je la filtrer depuis un textbox au fur et à mesure que je tape de lettre (colonne des noms )
aussi les dates .
merci d'avance
voir pc jointe
 

Pièces jointes

Re : comment filtrer une listbox au fur et à mesure des lettre du textbox

Bonsoir dindin, Bernard,

Voyez le fichier joint avec ce code de l'USF :

Code:
Private Sub TextBox1_Change()
Dim x$, y$, t, ncol%, i&, a(), j%, n&
x = TextBox1: y = TextBox14
t = Sheets("bd").[A1].CurrentRegion
ncol = UBound(t, 2)
For i = 2 To UBound(t)
  If t(i, 2) <> "" And LCase(t(i, 2)) Like LCase(x) & "*" _
    And t(i, 14) Like "*" & y & "*" Then
    n = n + 1
    ReDim Preserve a(1 To ncol, 1 To n)
    For j = 1 To ncol
      a(j, n) = t(i, j)
    Next
  End If
Next
If n = 0 Then ListBox1.Clear: Exit Sub
ReDim Preserve a(1 To ncol, 1 To n + 1) 'au moins 2 lignes
ListBox1.List = Application.Transpose(a)
ListBox1.RemoveItem n
End Sub

Private Sub TextBox14_Change()
TextBox1_Change
End Sub

Private Sub UserForm_Initialize()
Dim cw$
cw = "30;60;50;90;50;50;70;50;50;50;50;50;50;50;50" 'largeurs à adapter
ListBox1.ColumnWidths = cw
ListBox1.Width = Evaluate("SUM({" & cw & "})") + 4
Me.Width = ListBox1.Width + 18
TextBox1_Change
End Sub
Bonne nuit.
 

Pièces jointes

Dernière édition:
Re : comment filtrer une listbox au fur et à mesure des lettre du textbox

Bonjour.

Je joins quand même ma version avec ComboBox liées
VB:
Option Explicit
Dim WithEvents CL As ComboBoxLiées
Dim TLgn() As Long
'

Private Sub UserForm_Initialize()
Dim cw$
cw = "30;60;50;90;50;50;70;50;50;50;50;50;50;50;50" 'largeurs à adapter
ListBox1.ColumnWidths = cw
ListBox1.Width = Evaluate("SUM({" & cw & "})") + 4
Me.Width = ListBox1.Width + 24
Set CL = New ComboBoxLiées
CL.Plage Feuil1.Rows(2)
CL.Add Me.CBxNom, "B"
CL.Add Me.CBxDate, "N"
CL.Actualiser
End Sub
'

Private Sub CL_Change(ByVal Complet As Boolean, ByVal NbrLgn As Long)
If NbrLgn = 0 Then ListBox1.Clear
End Sub
'

Private Sub CL_Résultat(Lignes() As Long)
Dim Te(), Le&, Ts(), Ls&, C&
TLgn = Lignes
Te = CL.PlgTablo.Resize(, 15).Value
ReDim Ts(1 To UBound(TLgn), 1 To 15)
For Ls = 1 To UBound(TLgn)
    Le = TLgn(Ls): For C = 1 To 15: Ts(Ls, C) = Te(Le, C): Next C, Ls
ListBox1.List = Ts
End Sub
 

Pièces jointes

Dernière édition:
Re : comment filtrer une listbox au fur et à mesure des lettre du textbox

Bonjour,

Affiche des en-têtes pour la ListBox
Sans titre.jpg

JB
 

Pièces jointes

  • Gest abbat-2.xls
    Gest abbat-2.xls
    101 KB · Affichages: 60
  • Sans titre.jpg
    Sans titre.jpg
    22.9 KB · Affichages: 60
Dernière édition:
Re : comment filtrer une listbox au fur et à mesure des lettre du textbox

Bonjour dindin, Bernard, JB,

Je rappelle qu'Application.Transpose ne fonctionne plus au-delà de 65536 lignes.

Mais à ce niveau-là les durées d'exécution (ouverture de l'USF) deviennent rédhibitoires.

Macro du post #3 testée sur Win 8 - Excel 2013 :

- 10000 lignes => 0,75 seconde

- 30000 lignes => 5,3 secondes

- 60000 lignes => 19 secondes.

A+
 
Re : comment filtrer une listbox au fur et à mesure des lettre du textbox

Pour 45.000 lignes, le temps de chargement du formulaire est environ 1 s

1-Au chargement du formulaire, il faut charger le listbox directement sans passer par change()
2-il ne faut pas calculer la clé de sélection dans la boucle mais avant donc 1 seule fois. Sinon le temps de calcul de la boucle de sélection est doublé (La vitesse de frappe est ralentie)
3-Il faut lire la bd dans le tableau bd() seulement dans Initialize() et non pas dans change().

JB
 

Pièces jointes

Dernière édition:
Re : comment filtrer une listbox au fur et à mesure des lettre du textbox

Re JB,

Tu as raison, dans ce fichier (2) j'ai modifié le calcul des clés et mémorisé le tableau dès l'ouverture.

Mais cela ne change rien à la durée d'exécution sur 60000 lignes, toujours 19 secondes chez moi.

Note que le fichier de ton post #7 ne contient que 10000 noms...

A+
 

Pièces jointes

Re : comment filtrer une listbox au fur et à mesure des lettre du textbox

>Note que le fichier de ton post #7 ne contient que 10000 noms...

-Je n'ai pas mis plus de lignes à cause de la taille limitée des PJ
-Il suffit de tirer sur une ligne pour obtenir 45.000 lignes (je confirme chargement du formulaire en 1 sec)

Private Sub UserForm_Initialize()
Set f = Sheets("bd")
Tbl= f.Range("a2😛" & [a65000].End(xlUp).Row).Value
Me.ListBox1.List = Tbl
End Sub

JB
 
Re : comment filtrer une listbox au fur et à mesure des lettre du textbox

Re,

Il n'est pas indispensable d'utiliser un UserForm, on peut filtrer directement sur la feuille :

Code:
Private Sub TextBox1_Change()
Dim t, x$, y$, f$
t = Timer
x = TextBox1: y = TextBox2
If x = "" And y = "" Then AfficherTout: Exit Sub
f = "=(LEFT(RC2," & Len(x) & ")=""" & x & """)*FIND(""" & y & """,TEXT(""""&RC14,""jj/mm/aaaa""))"
Application.ScreenUpdating = False
On Error Resume Next
Me.ShowAllData
With Range("A2:O" & Range("A" & Rows.Count).End(xlUp).Row)
  .Cells(2, .Columns.Count + 2).FormulaR1C1 = f
  .AdvancedFilter xlFilterInPlace, .Cells(1, .Columns.Count + 2).Resize(2)
  .Cells(2, .Columns.Count + 2) = ""
End With
'MsgBox "Durée " & Format(Timer - t, "0.00 \s") 'pour tester
End Sub

Private Sub TextBox2_Change()
TextBox1_Change
End Sub

Sub AfficherTout()
Application.EnableEvents = False
On Error Resume Next
Me.ShowAllData
TextBox1 = "": TextBox2 = ""
Application.EnableEvents = True
End Sub
Fichier (3).

Sur 60000 lignes le filtrage des "a" ou "b" est de l'ordre de la seconde.

A+
 

Pièces jointes

Dernière édition:
Re : comment filtrer une listbox au fur et à mesure des lettre du textbox

re
je suis en train d essayer la proposition de Dranreb qui je trouve formidable sachant que les autres aussi sont tres interessente , juste j aimerai bien qu il m'affiche la base dès l ouverture du form avant meme de commencer a filtrer et qu il ne signale pas une erreur si la base est vide (aucune ligne ).
merci d'avance à Dranreb.
 
Re : comment filtrer une listbox au fur et à mesure des lettre du textbox

Bonsoir,

-Le textbox pour le nom est remplacé par un combobox intuitif :
-En frappant les premières lettres du nom dans le combobox, les noms commençant par ces lettres apparaissent au fur et à mesure de la frappe des caractères)
-On peut faire la même chose pour les dates

Sans titre.jpg

http://boisgontierjacques.free.fr/fichiers/Formulaire/ListBoxInutuitif4.xls

JB
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
22
Affichages
878
Réponses
15
Affichages
868
Retour