Private O As Worksheet 'déclare la variable O (Onglet)
Private TC As Variant 'déclare la variable TC (Tableau de Cellules)
Private NL As Integer 'déclare la variable NL (Nombre de Lignes)
Private NC As Byte 'déclare la variable NC (Nombre de colonnes)
Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Set O = Sheets("base de données") 'définit l'onglet O
TC = O.Range("A1").CurrentRegion 'définit le tableau de cellules TC
NL = UBound(TC, 1) 'définit le nombre de lignes de TC
NC = UBound(TC, 2) 'définit le nombre de colonnes de TC
Me.ListBox1.ColumnCount = NC 'définit le nombre de colonnes de la ListBox1 (à adapter, dans cet exemple je recherche dans la ligne entière. +1 pour le numéro de ligne)
End Sub
Private Sub TextBox1_Change() 'au changement dans la TesxBox1
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Me.ListBox1.Clear 'vide la ListBox1
K = 1 'initialise la variable K
For I = 2 To NL 'boucle 1 : sur toutes les lignes I du tabelau de cellules TC (en partant de la seconde)
For J = 1 To NC 'boucle 2 : sur toutes les colonnes J du tabelau de cellules TC
If InStr(1, TC(I, J), Me.TextBox1.Value, vbTextCompare) <> 0 Then 'condition : si le texte de la TextBox1 est contenu dans la donnée ligne I colonne J (sans tenir compte de la casse)
ReDim Preserve TL(1 To NC + 1, 1 To K) 'redimensionne le tableau de lignes TL
For L = 1 To NC 'boucle sur toutes les colonnes de TC
TL(L, K) = TC(I, L) 'récupère dans la ligne L, colonne K de TC la valeur de la ligne I , colonne L de TC (transposition)
Next L 'prochaine colonne de la boucle 2
K = K + 1 'incrémente K
Exit For 'sort de la boucle 2
End If 'fin de la condition
Next J 'prochaine colonne de la boucle 2
Next I 'prochaine ligne de la boucle 1
If K > 1 Then 'condition : si K est supérieur à 1 (au moins une occurrence a été trouvé)
If K = 2 Then ReDim Preserve TL(NC + 1, 1 To 2) 'si une seule occurrence trouvée, redimensionne TL pour pouvoir transposer
Me.ListBox1.List = Application.Transpose(TL) 'alimente la ListBox1 avec le tableau TL transposé
End If 'fin de la condition
End Sub
Private Sub ListBox1_Click() 'au clic dans la ListBox1
O.Rows(Me.ListBox1.Column(0, Me.ListBox1.ListIndex) + 1).Select 'sélectionne la ligne de l'élément sélectionné
Unload Me 'vide et ferme l'UserForm
End Sub