XL 2016 recherche dans listbox

borain

XLDnaute Nouveau
Bonjour,
j'aimerai faire des recherches dans ma listbox
donc j'ai une listbox avec 5 colonnes
outil, numéro, qté, marque et emplacement
j'ai rajouté 4 texbox au dessus pour faire des recherche sur ma listbox
textbox1 qui fait la recherche sur outil
textbox2 qui fait la recherche sur le numéro de l'outil qui est alpha-numérique
textbox3 qui fait la recherche sur la marque de l'outil
texbox4 qui fait la recherche sur emplacement de l'outil

j'aimerai que à chaque fois que j'écris un outil sur la texbox 1 dans ma listbox s'affiche juste l'outil commençant par la lettre frappé
te si je fait pareil dans mon texbox2 juste les numéro commencant par le numéro frappé
ainsi de suite

svp je vous remercie pour votre aide
j'ai besoin d'un code
je suis un peu novice en vba et je pense que c'est face à chaque difficulté qu'on apprends

cordialement,
 

jmfmarques

XLDnaute Accro
Bonjour
Tu ne précises pas si ta listbox est sur une feuille de calcul ou sur un userform (des différences existent).
Je te conseille quoi qu'il en soit de t'intéresser avant tout à ce qu'est la propriété TextColumn d'une listebox (rubrique TextColumn, propriété de l'aide interne VBA). Elle permet de définir quelle colonne est celle sur laquelle se font les interventions.
Il se peut par ailleurs que l'utilisation la plus simple d'une combobox, qui comporte une zone d'édition et des propriétés ad hoc) soit de nature à faciliter considérablement ta tâche. ;)
 

borain

XLDnaute Nouveau
VB:
Option Explicit
Option Compare Text

Dim Ws As Worksheet
Dim T1
Sub AlimenteListbox()
Dim j As variant, i As variant, Indice As variant, D As variant, T2()

  Me.ListBox1.Clear
  Indice = 1            ' Par défaut toujours 1 enregistrement
  For j = 1 To UBound(T1)
    If T1(j, 1) Like Me.textbox1 & "*" And T1(j, 2) Like Me.textbox2 & "*" And T1(j, 3) Like Me.textbox3 & "*" And T1(j, 4) Like Me.textbox4 & "*" Then
      Indice = Indice + 1
      ReDim Preserve T2(1 To 5, 1 To Indice)
      For i = 1 To UBound(T1, 2)
        T2(i, Indice) = T1(j, i)
      Next i
      For D = 1 To UBound(T1, 1)
      Next D
    End If
  Next j
  If Indice > 1 Then
    Me.ListBox1.List = Application.Transpose(T2)
    Me.ListBox1.RemoveItem 0          ' On supprime l'enregistrement par défaut
  End If

End Sub
private sub textbox1_Change()
  AlimenteListbox
End Sub

private sub textbox2_Change()
  AlimenteListbox
End Sub
private sub textbox3_Change()
  AlimenteListbox
End Sub
private sub textbox4_Change()
  AlimenteListbox
End Sub
Private Sub UserForm_Initialize()
Dim j As Long, Gauche As Double, Temp As String, i As Integer
Dim Mondico As Object

  Set Ws = Sheets("feuil4")
 
    T1 = Ws.Range("A2:e" & Ws.Range("A" & Rows.Count).End(xlUp).Row)
    For j = 1 To UBound(T1)
      T1(j, UBound(T1, 2)) = j + 1
      
    Next j
    
  Gauche = Me.ListBox1.Left + 5
  For i = 1 To 5
  
  Next i
 
  With Me.ListBox1
    
    .List = T1
    
end witch
end sub
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Bonsoir,

Avec un seul champ de recherche

Sans titre - Copie (6).png


Boisgontier
 

Pièces jointes

  • Copie de RechercheMulticolonnesMultiMotsaTableau.xlsm
    111.8 KB · Affichages: 12

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir @borain , @jmfmarques @BOISGONTIER le Forum

Dans ton UserForm4 :
1) Supprime les paramétrages faits en dûr dans les Propriétés de la ListBox1 (RowSource, RowHeader)
2) Dans le Private Module du UserForm1 copie et colle les 2 codes suivants :

INITIALISATION de l'USF :
VB:
Private Sub UserForm_Initialize()
Dim WS As Worksheet
Dim Plage As Range

Set WS = ThisWorkbook.Worksheets("Feuil4")
Set Plage = WS.Range("A4:E" & WS.Range("E5000").End(xlUp).Row)

With Me.ListBox1
.ColumnCount = 7
.ColumnWidths = ("300 pt;75.15 pt;49.95 pt;100 pt;49.95 pt;0 pt;0 pt")
.List = Plage.Value
End With

End Sub

ACTION sur la TextBox "RECHERCHE":
Code:
Private Sub RECHERCHE_Change()
Dim i As Integer, x As Integer
Dim c As Byte
Dim TabSearch() As String
Dim WS As Worksheet
Dim Plage As Range

Set WS = ThisWorkbook.Worksheets("Feuil4")
Set Plage = WS.Range("A4:E" & WS.Range("E5000").End(xlUp).Row)
With Me.ListBox1
.Clear
.List = Plage.Value
End With


With Me.ListBox1
    For i = 0 To .ListCount - 1
        If InStr(UCase(.Column(0, i)), UCase(Me.RECHERCHE)) <> 0 Then
            ReDim Preserve TabSearch(5, x)
            For c = 0 To 4
            TabSearch(c, x) = .Column(c, i)
            Next c
           x = x + 1
        End If
    Next i
End With


With Me.ListBox1
.Clear

If x >= 1 Then
    .List = WorksheetFunction.Transpose(TabSearch)
End If
End With

End Sub

Ensuite tu auras ceci :

Search_TestBox.gif


Le désavantage de l'abandon de la Propriété RowSource est aussi la perte des "Columns Headings" en effet ça ne passe plus quand on insert une "Array" dans la ListBox1.List .... Mais tu pourras faire des Labels le cas échéant...

Bien toi, à vous
@+Thierry
 

Pièces jointes

  • Search_TestBox.gif
    Search_TestBox.gif
    269.6 KB · Affichages: 13

patricktoulon

XLDnaute Barbatruc
sinon exemple pour le textbox recherche
VB:
'option Compare Text à mettre en haut de module

Private Sub RECHERCHE_Change()
Dim tablo,col1,i&
tablo = ListBox1.List()
col1 = Application.Transpose(Application.Index(tablo, 0, 1))
For i = LBound(col1) To UBound(col1): col1(i) = col1(i) & "-lig" & i: Next
va = Filter(col1, RECHERCHE, True)
If UBound(va) > 0 Then With ListBox1: .ListIndex = Split(va(0), "-lig")(1) - 1: .TopIndex = Split(va(0), "-lig")(1) - 1: End With
End Sub

et faire pareil pour les autre textbox en changeant l'index dans col1 et le nom du textbox bien sur
 

patricktoulon

XLDnaute Barbatruc
re
tient celle la me plait bien

elle reprends l'idée de mon code (commence par/xlpart) sur DVP que j'avais transmis a @BOISGONTIER que je détourne pour chopper l'index

donc 2 options de recherche (xlpart ou commence par)

PS; considérer les indexs colonnes en base 1
FONCTION:

VB:
Private Function GetIndexList(ListBx As MSForms.ListBox, TxtB As MSForms.TextBox, Optional colonne As Long = 1, Optional optionReshearch As Long = 1) As Long
'*************************************
'optionReshearch
'1= xlpart 'nimporte ou dans le texte
'0=commence par  'le debut du texte
'*************************************
    Dim tablo, i&, x&
    x = -1
    tablo = ListBx.List()
    tablo = Application.Transpose(Application.Index(tablo, 0, colonne))
    For i = LBound(tablo) To UBound(tablo): tablo(i) = tablo(i) & "-lig" & i: Next
    tablo = Filter(tablo, TxtB.Text, True)
    If optionReshearch = 0 Then
        For i = LBound(tablo) To UBound(tablo)
            If Left(tablo(i), Len(TxtB.Text)) = TxtB.Text Then x = i: Exit For
        Next
    Else
        If UBound(tablo) > 0 Then x = 0
    End If
    If x > -1 Then GetIndexList = Val(Split(tablo(x), "-lig")(1) - 1) Else GetIndexList = -1
End Function

exemple d'utilisation dans le contexte présent
VB:
Private Sub MARQUE_Change()
    ListBox1.ListIndex = GetIndexList(ListBox1, MARQUE, 4, 0)
 End Sub

Private Sub RECHERCHE_Change()
      ListBox1.ListIndex = GetIndexList(ListBox1, RECHERCHE, 1, 0)
End Sub
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour @patricktoulon @borain @BOISGONTIER @jmfmarques , le Forum

Très très bien vu ton histoire d'index Patrick, c'est sympa, mais entretemps j'ai voulu régler le problème entre"clé" et "CLE", j'y parviens sur mon exemple (USF1), mais par sur le tien (USF2), pour les Majuscules, il suffit d'adjoindre l'Option Compare Text, mais pour les accents, je ne crois pas que ce soit intégré dans VBA mise à a part un fonction perso et donc pas évident de l'intégrer dans ta fonction...

Search_TestBox_USF1-USF2.gif


Ci-joint mon classeur de tests...

Je n'avais pas encore ouvert ton fichier du post #12, mais je vais regarder de ce pas !

Bien à toi, à vous
@+Thierry
 

Pièces jointes

  • XLD_Borain_Search_in_ListBox_V00.xlsm
    29.8 KB · Affichages: 9

patricktoulon

XLDnaute Barbatruc
re
bonjour _Tierry
en haut de module
Option Compare Text

;)


re
entre"clé" et "CLE",
ben si tu tape CLE pour chercher "clé" effectivement ca risque pas de marcher car avec mon model l'index -1 est réinitialisé a chaque touche tapé
donc tu tape
c ou C ok
l ou L ok
é ou E pas ok
c'est normal ;)
il faut faire des replace même avec la méthode boisgontier si il ne la pas fait
 
Dernière édition:

Statistiques des forums

Discussions
314 499
Messages
2 110 247
Membres
110 711
dernier inscrit
chmessi