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

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

  • Gest abbat.xlsm
    44.1 KB · Affichages: 64

job75

XLDnaute Barbatruc
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

  • Gest abbat(1).xlsm
    55 KB · Affichages: 69
Dernière édition:

Dranreb

XLDnaute Barbatruc
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

  • CBxLiéesDindin.xlsm
    117.2 KB · Affichages: 53
  • CBxLiéesDindin.xlsm
    117.2 KB · Affichages: 63
Dernière édition:

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
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
    101 KB · Affichages: 60
  • Sans titre.jpg
    Sans titre.jpg
    22.9 KB · Affichages: 60
Dernière édition:

job75

XLDnaute Barbatruc
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+
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
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

  • Gest abbat-2xx (2).zip
    801.3 KB · Affichages: 53
Dernière édition:

job75

XLDnaute Barbatruc
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

  • Gest abbat(2).xlsm
    33 KB · Affichages: 45

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
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:p" & [a65000].End(xlUp).Row).Value
Me.ListBox1.List = Tbl
End Sub

JB
 

job75

XLDnaute Barbatruc
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

  • Gest abbat(3).xlsm
    41.3 KB · Affichages: 43
Dernière édition:

dindin

XLDnaute Occasionnel
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.
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
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

  • Sans titre.jpg
    Sans titre.jpg
    24.2 KB · Affichages: 52
  • ListBoxInutuitif4.xls
    175.5 KB · Affichages: 66
Dernière édition:

Discussions similaires

  • Résolu(e)
Microsoft 365 Code de tri
Réponses
22
Affichages
502
Réponses
15
Affichages
651

Statistiques des forums

Discussions
312 932
Messages
2 093 725
Membres
105 798
dernier inscrit
Sly67