Recherche dans listbox générée par 2 feuilles

Bonjour le forum,

J'ai pu réaliser sur un de mes formulaires des recherches via des textboxs dans une listbox multicolonne issue d'une base de donnée provenant d'une seule feuille en utilisant ce code :

Sub UserForm_Initialize()

  Me.Listbox1.Clear
  Set f = Sheets("DataStock")
  Set Rng = f.Range("a2:f" & [a65000].End(xlUp).Row)
  TblTmp = Rng.Value
  Ncol = Rng.Columns.Count
  Me.Listbox1.ColumnCount = Ncol

   For i = LBound(TblTmp) To UBound(TblTmp)
     ReDim Preserve choix(1 To i)
     For k = LBound(TblTmp) To UBound(TblTmp, 2)
       choix(i) = choix(i) & TblTmp(i, k) & " * "
     Next k
   Next i
   Me.Listbox1.List = Rng.Value

   Set d1 = CreateObject("scripting.dictionary")
   For i = LBound(TblTmp) To UBound(TblTmp)
     If TblTmp(i, 1) <> "" Then d1(TblTmp(i, 1)) = ""
   Next i
   a = d1.keys
   If d1.Count > 0 Then Call Tri(a, LBound(a), UBound(a))
   Me.ComboBox1.List = a

End Sub

Private Sub RechRefArt_Change()

     clé = "*" & UCase(Me.RechRefArt) & "*"
     Dim Tbl()
     n = 0: Ncol = UBound(TblTmp, 2)
     For i = LBound(TblTmp) To UBound(TblTmp)
       If UCase(TblTmp(i, 2)) Like clé Then
         n = n + 1: ReDim Preserve Tbl(1 To Ncol, 1 To n)
         For k = 1 To Ncol: Tbl(k, n) = TblTmp(i, k): Next
       End If
      Next i
      If n > 0 Then
        ReDim Preserve Tbl(1 To Ncol, 1 To n + 1)
        Me.Listbox1.List = Application.Transpose(Tbl)
        Me.Listbox1.RemoveItem n
      End If

End Sub

Je souhaiterais maintenant réaliser des recherches par mots clé mais cette fois sur une listbox générée par deux bases de données issue de deux feuilles. Cette recherche me permettrai de faire du tri sur la quatrieme colonne du fichier joint...Mon probléme est que je n'arrive pas à adapter ce code avec la listbox3 présente sur le fichier joint. Serait il possible d'avoir des pistes svp, est il possible de rendre compatible System.Collections.Sortedlist (utilisé pour trier par date ma listbox 3)avec ce type de code ?

Merci beaucoup

27rech-listbox.xlsm (23.25 Ko)

Bonjour,

Pourquoi vider la ListBox1 de la liste qu'elle ne contient pas à ce moment !

Pas de déclarations de variables !

Cordialement.

Bonjour Sébastien, bonjour le forum,

Pas très bien compris le code initial... Je te propose de le remplacer entièrement par celui-ci :

Option Explicit

Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
With Me.ListBox3 'prend en compte la ListBox3
    .ColumnCount = 4 'nombre de colonnes
    .ColumnWidths = "70;50;80;50" 'largeur des colonnes
End With 'fin de la prise en compte de la ListBox3
End Sub

Private Sub TextBox1_Change()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Long 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim K As Long 'déclare la variable K (incrément)
Dim L As Byte 'déclare la variable L (incrément)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)

Me.ListBox3.Clear 'vide la ListBox3
If Me.TextBox1.Value = "" Then Exit Sub 'si la TextBox1 est effacée sort de la procédure
K = 1 'initialise la variable K
For Each O In Sheets 'boucle 1 : sur touts les onglet O du classeur
    Select Case O.Name 'agit en fonction du nom de l'onglet
        Case "Feuil3" 'cas "Feuil3" (rien ne se passe)
        Case Else 'tous l;es autres cas
            TV = O.Range("A1").CurrentRegion 'définit le tableau TV
            For I = 2 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes I du tableu des valeurs TV (en partant de la seconde)
                For J = 1 To UBound(TV, 2) 'boucle 3 : sur toutes les colonnes J du tableu des valeurs TV
                    'si le texte édité dans la TextBox1 est contenu dans la donnée Ligne I colonne J de TV
                    If InStr(1, TV(I, J), Me.TextBox1.Value, vbTextCompare) > 0 Then
                        ReDim Preserve TL(1 To 4, 1 To K) 'redimentionne le tableau des lignes TL (4 lignes, K colonnes)
                        For L = 1 To 4 'boucles 4 : sur les 4 lignes L du tableau des lignes
                            TL(L, K) = TV(I, L) 'récupère dans la ligne L de TL la donnée en colonne L de TV (=Transposition)
                        Next L 'pochaine ligne de la boucle 4
                        K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes)
                        Exit For 'sort de la boucle 3
                    End If 'fin de la condition
                Next J 'prochaine colonne de la boucle 3
            Next I 'prochaine ligne de la boucle 2
    End Select 'fin de l'action en fonction du nom de l'onglet
Next O 'prochain onglet de la boucle 1
If K > 1 Then Me.ListBox3.Column = TL 'si K est supérieure à 1, alimente la Listbox3 avec le tabelau TL
End Sub

Ensuite, au fur et à mesure que tu tapes du texte dans la TextBox1, la ListBox3 se remplit avec les lignes contenant au moins une fois le texte...

[Édition]

Bonjour MFerrand !...

Bonjour à tous

Merci pour vos réponses...ThauThème merci pour le code, j'ai pu intégrer la recherche dans mon formulaire.

C'est vraiment génial d'avoir positionné des commentaires, trés instructif !!

Sébastien

Rechercher des sujets similaires à "recherche listbox generee feuilles"