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 SubJe 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
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 SubEnsuite, 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