Private O As Worksheet 'déclare la variable O (Onglet)
Private TV As Variant 'déclare la variable TV (Tableau des Valeurs)
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() 'a l'initialisation de l'UserForm
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)
Set O = Worksheets("Feuil1") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des Valeurs TV
NL = UBound(TV, 1) 'définit le nombre de lignes NL du tableau des valeurs TV
NC = UBound(TV, 2) 'définit le nombre de colonnes NC du tableau des valeurs TV
Me.ListBox1.ColumnCount = NC + 1 'définit le nombre de colonne de la Listbox1 (une de plus que NC)
Me.ListBox1.ColumnWidths = "0" 'masque la première colonne de la ListBox1
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To NL 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
D(TV(I, 1)) = "" 'alimente le dictionnaire avec la donnée en colonne 1 de TV
Next I 'prochaine ligne de la boucle
ComboBox1.List = D.keys 'alimente la ComboBox1 avec la liste des éléments du dictionnaire D sans doublon
End Sub
Private Sub ComboBox1_Click() 'au clic dans la ComboBox1
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)
Dim LI As Integer 'déclare la variable LI(LIgne)
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 tableau des valeurs TV (en partant de la seconde)
If TV(I, 1) = Me.ComboBox1.Value Then 'condition : si la données ligne I colonne 1 de TV est égale à la valeur de la CommboBox1
ReDim Preserve TL(1 To NC + 1, 1 To K) 'redimensionne le tableau des lignes TL (autant de lignes plus une que TV a de colonnes, K colonnes)
TL(1, K) = I 'récupère dans la ligne 1 de TL le numéro de ligne (cette donnée sera masquée)
For J = 1 To NC 'boucle 2 : sur toutes les colonnes J du tableau des valeurs TV
TL(J + 1, K) = TV(I, J) 'récupère dans la ligne J + 1 de TL la donnée en colonne J de TV (= Transposition)
Next J 'prochaine colonne de la boucle 2
K = K + 1 'incrémente K (ajoute une colonne au tableau de lignes TL)
End If 'fin de la condition
Next I 'prochaine ligne de la boucle 1
If K > 1 Then Me.ListBox1.Column = TL 'si K est supérierure à 1, alimente la ListBox1
If Me.ListBox1.ListCount = 1 Then 'condition : si la ListBox1 ne contien qu'une seule valeur
LI = Me.ListBox1.Column(0, 0) 'définit la Ligne LI (récupérée dans la colonne masquée de la ListBox1)
O.Activate 'active l'onglet O
O.Cells(LI, 1).Select 'sélectionne la cellule ligne LI colonne 1 de l'onglet O
Unload Me 'vide et ferme l'userForm en cours
End If 'fin de la condition
End Sub
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 'au double-clic dans un élément de la ListBox1
Dim LI As Integer 'déclare la variable LI(LIgne)
LI = Me.ListBox1.Column(0, Me.ListBox1.ListIndex) 'définit la variable LI (récupérée dans la colonne masquée de la ListBox1)
O.Activate 'actie l onglet O
O.Cells(LI, 1).Select 'sélectionne la cellule ligne LI colonne 1 de l'onglet O
Unload Me 'vide et ferme l'userForm en cours
End Sub