XL 2010 Filtrer un Combobox en VBA excel

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 !

aurelio.ewane

XLDnaute Occasionnel
Bonjour Chers Excellsiste,
je possède une listbox avec un grand nombre de données
et je voudrais a partir d'un textbox lorsque je saisie une valeur que mon liste se filtre
c'est à dire une sorte de saisie intuitive pour pouvoir faire des recherches

pour mieux faire la recherche
je peut rechercher en saisissant
son matricule
Son nom
Son prenom
Sa date de naissance
Son Lieu de Naissance
le nom d'un parent

voila les champs ou je voudrais que ma recherche s'effectue

je joins un fichier avec ce que jai fais que je trouve très lent
Sil vous plait pouvez vous me rendre cela plus rapide et plus digeste
et aussi ma plage peut être variable
bien vouloir tenir compte de cela

voici mon code qui ne fonctionne pas
Option Base 1

Private Sub TextBox1_Change()
Call RechercheItems(2, 110, 1)
End Sub

Private Sub UserForm_Initialize()
Dim Sh As Worksheet
Set Sh = ThisWorkbook.Sheets("Base")

'Derniere ligne vide
Let LigneFin = Sh.Cells(Sh.Rows.Count, 2).End(xlUp).Row
Table = Sh.Range("B6😀F" & LigneFin)
Me.ListBox1.List() = Table
Me.ListBox1.ColumnCount = 109
'Me.ListBox1.ColumnWidths = "100;100"

Set Sh = Nothing
End Sub

Sub RechercheItems(ByVal CD As Long, ByVal CF As Long, ByVal Item As Long)
Dim Sh As Worksheet
Dim Plage, EeACellule As Range
Dim EeACounter As Long, EeAFirstAddress As Long, EeALigneFin As Long, EeANbcol As Long, EeAIndex As Long, EeAColonne As Long
Dim EeATable()
Set Sh = ThisWorkbook.Worksheets("Base")

Let EeALigneFin = Sh.Cells(Sh.Rows.Count, CD + 1).End(xlUp).Row
Let EeANbcol = CF - CD + 1
Me.FrameListBox1.ScrollTop = 0

'Call DisableAll

If Me.Controls("Textbox" & Item).Text = "" Then 'Or Me.Controls("ComboBox" & N2).Text = "Clicquer pour effectuer une recherche" Then

If EeALigneFin = 50 Then
Me.ListBox1.Enabled = False
Else
Me.ListBox1.Enabled = True
'temp = Sh.Range(Sh.Cells(51, CD), Sh.Cells(LF, CF)).Value
Me.ListBox1.List() = Sh.Range(Sh.Cells(51, CD), Sh.Cells(EeALigneFin, CF)).Value
Me.FrameListBox1.ScrollTop = 0
Me.FrameListBox1.ScrollHeight = 15 * Me.ListBox1.ListCount
'Me.Info1.Caption = "" 'Me.ListBox1.ListCount & " occurence(s) trouvée(s)"
End If

Else

If Len(Me.Controls("Textbox" & Item).Text) >= 3 Then
Me.ListBox1.Clear
Me.ListBox1.RowSource = ""

EeACounter = 0
If EeALigneFin = 50 Then
Else


With Sh.Range(Sh.Cells(51, CD), Sh.Cells(EeALigneFin, CD + 1))
Set EeACellule = .Find(Me.Controls("Textbox" & Item).Text, _
LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, _
SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)


If Not EeACellule Is Nothing Then
EeAFirstAddress = EeACellule.Row
Do
EeACounter = EeACounter + 1
ReDim Preserve EeATable(EeANbcol, EeACounter)
EeAIndex = 1
For EeAColonne = CD To CF
EeATable(EeAIndex, EeACounter) = Sh.Cells(EeACellule.Row, EeAColonne).Value
EeAIndex = EeAIndex + 1
Next EeAColonne

Set EeACellule = .FindNext(EeACellule)
Loop While Not EeACellule Is Nothing And EeACellule.Row <> EeAFirstAddress 'C.Address <> FirstAddress

If EeACounter <> 0 Then
Me.ListBox1.Column() = EeATable
Me.FrameListBox1.ScrollTop = 0
Me.FrameListBox1.ScrollHeight = 15 * Me.ListBox1.ListCount
End If

End If
'Me.Info1.Caption = Me.ListBox1.ListCount & " occurence(s) trouvée(s)"
'Me.Info1.Caption = Me.ListBox1.ListCount & " occurence(s) trouvée(s)"
End With

End If
End If
End If

'Call EnableAll
Set Sh = Nothing
Set Plage = Nothing
End Sub
 

Pièces jointes

Ajouté le lieu de naissance mentionné au poste #1.
Ce ne serait pas très compliqué d'ajouter une TextBox pour chaque colonne supplémentaire en tant que contrôle associé et d'en faire un outil de mise à jour en plus de la consultation. La ListBox pourrait devenir inutile si la combinaison des ComboBox était présumée toujours unique.
 

Pièces jointes

Chapeau Chef
ton code c'est la magie, c'est un pure nectar, mince tu est dans une autre dimension toi....
le plus dur pour moi c'est de comprendre tous ca ...
Vraiment désolé de te reposer quelque questions,
jaurais juste besooin du combobox de la classe c'est deja tres pratique puisque lorsquon selectionne une classe ca filtre deja..... c'est tres fort colle code.....
Mince je suis comblé
 
Je reste à l'écoute de vos questions …
Okeyy jai essayé de regarder tous cela
ton code me satisfait un grand bravooooo a vous
mais
j'aimerais que au lancement du userform
toute la liste sois affiché dans le listbox
et comme certains l'on dis je ne vais plus afficher toutes les colonnes j'affiche seulement les deux premiers colonnes matricules et Noms et prénoms
Donc la jai un listbox avec juste 02 colonnes (c'est plus rapide).

et maintenant jai juste besoin du combobox CBxClasse qui contiendra evidement comme vous lavez fait (bravoooo) la liste de toute les classes sans doublons (vraiment c'est excellent), c'est vrai que jai la table des classe dans mon fichier je le prends generalement labas


et maintenant quand on selectionne une classe ca affiche tous les eleves de cette classe dans la list box

pas besoin des autres combobox
je les ai deja dans mon fichier final
Pouvez vous adapter comme ceci?
 
Ben, qui peut le plus peut le moins. Mais les autres ComboBox pourraient toujours servir un jour, non ? Sinon supprimez les, ainsi que les CLs.Add correspondants dans la Sub UserForm_Initialize. Si c'est vraiment définitif on pourrait aussi se passer de l'Objet ComboBoxLiées. Mais rappelez vous de ma proposition de transformer tout ça en un outil de Mise à jour et consultation, où un nombre de critères suffisant pour éviter les risques de doublons est nécessaire.
La version qui affiche l'ensemble de la liste au lancement :
 

Pièces jointes

Le code complet sans le ComboBoxLiées :
VB:
Option Explicit
Private LOt As ListObject, Suj, TLgn() As Long
Private Sub UserForm_Initialize()
   Set LOt = Feuil1.ListObjects(1)
   Suj = SujetCBx(LOt.ListColumns("Classe"))
   CBxClasse.List = Suj(0)
   AfficherTout
   End Sub
Private Sub CBxClasse_Change()
   Dim TDon(), TLBx(), LLBx As Long, LDon As Long
   If CBxClasse.MatchFound Then
      TLgn = Suj(1)(CBxClasse.ListIndex)
      GarnirLBx
   Else
      AfficherTout
      End If
   End Sub
Private Sub AfficherTout()
   Dim L As Long
   ReDim TLgn(1 To LOt.ListRows.Count)
   For L = 1 To UBound(TLgn): TLgn(L) = L: Next L
   GarnirLBx
   End Sub
Private Sub GarnirLBx()
   Dim TDon(), TLBx(), LLBx As Long, LDon As Long
   TDon = LOt.DataBodyRange.Resize(, 2).Value
   ReDim TLBx(1 To UBound(TLgn), 1 To 2)
   For LLBx = 1 To UBound(TLBx, 1)
      LDon = TLgn(LLBx)
      TLBx(LLBx, 1) = TDon(LDon, 1)
      TLBx(LLBx, 2) = TDon(LDon, 2)
      Next LLBx
   ListBox1.List = TLBx
   End Sub
Private Sub ListBox1_Click()
   Dim LDon As Long
   LDon = TLgn(ListBox1.ListIndex + 1)
   Application.Goto LOt.ListRows(LDon).Range
   End Sub
 
Le code complet sans le ComboBoxLiées :
VB:
Option Explicit
Private LOt As ListObject, Suj, TLgn() As Long
Private Sub UserForm_Initialize()
   Set LOt = Feuil1.ListObjects(1)
   Suj = SujetCBx(LOt.ListColumns("Classe"))
   CBxClasse.List = Suj(0)
   AfficherTout
   End Sub
Private Sub CBxClasse_Change()
   Dim TDon(), TLBx(), LLBx As Long, LDon As Long
   If CBxClasse.MatchFound Then
      TLgn = Suj(1)(CBxClasse.ListIndex)
      GarnirLBx
   Else
      AfficherTout
      End If
   End Sub
Private Sub AfficherTout()
   Dim L As Long
   ReDim TLgn(1 To LOt.ListRows.Count)
   For L = 1 To UBound(TLgn): TLgn(L) = L: Next L
   GarnirLBx
   End Sub
Private Sub GarnirLBx()
   Dim TDon(), TLBx(), LLBx As Long, LDon As Long
   TDon = LOt.DataBodyRange.Resize(, 2).Value
   ReDim TLBx(1 To UBound(TLgn), 1 To 2)
   For LLBx = 1 To UBound(TLBx, 1)
      LDon = TLgn(LLBx)
      TLBx(LLBx, 1) = TDon(LDon, 1)
      TLBx(LLBx, 2) = TDon(LDon, 2)
      Next LLBx
   ListBox1.List = TLBx
   End Sub
Private Sub ListBox1_Click()
   Dim LDon As Long
   LDon = TLgn(ListBox1.ListIndex + 1)
   Application.Goto LOt.ListRows(LDon).Range
   End Sub
Mince... suis Bleuffe tu est d'une autre planete toi.
C'st du oufff je comprends rien du tout mais ca marche nickell et très rapide... je dois me mettre à la formation aux tableaux, moi je n'utilisais pas vraiment les tableaux je vois qu'il sont très rapides et aussi très intéressant.

Alors mes questions
je voudrais que la liste affiche les matricules et les Noms et prénoms
mais que les matricules soient masquées avec le columnwidths

mais la quand je mets un columnwidths plus rien ne marche..

vous etes a un autre niveau du VBA..
humblement j'aimerais qu vous puissiez me former...
 
Mince... suis Bleuffe tu est d'une autre planete toi.
C'st du oufff je comprends rien du tout mais ca marche nickell et très rapide... je dois me mettre à la formation aux tableaux, moi je n'utilisais pas vraiment les tableaux je vois qu'il sont très rapides et aussi très intéressant.

Alors mes questions
je voudrais que la liste affiche les matricules et les Noms et prénoms
mais que les matricules soient masquées avec le columnwidths

mais la quand je mets un columnwidths plus rien ne marche..

vous etes a un autre niveau du VBA..
humblement j'aimerais qu vous puissiez me former...

Ne mettez pas les matricules dans la ListBox, si vous ne voulez pas les voir ! C'est absurde !
En fait c'est une clé primaire, j'avoue qua à la lecture de vos message et de tous ce que vous avez ecris je mets rends compte que peut etre ai je mal analysé mon projet.
Puis je le partager avec vous afin que vous puissiez me donner vos impressions?

Parceque je pense que des le depart j'ai pas bien elaborer mes tables du coup je me retrouvé coincé et c'est essouflant.
 
- 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
5
Affichages
238
Réponses
3
Affichages
729
Réponses
4
Affichages
549
  • Question Question
XL 2021 VBA excel
Réponses
4
Affichages
244
Retour