Private O As Worksheet 'déclare la variable O (Onglet)
Private TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Private D As Object 'déclare la variable D (Dictionnaire)
Private I As Integer 'déclare la variable I (Incrément)
Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Me.ListBox1.ColumnCount = 3 'définit le nombre de colonnes de la ListBox1
Set O = Worksheets("Base") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
D(TV(I, 1)) = "" 'alimente le dictionnaire D avec la données en colonne 1 du tableau des valeurs TV
Next I 'prochaine ligne de la boucle
Me.ComboBox1.List = D.keys 'alimente la ComboBox1 avec les données du dictionnaire D sans doublon
End Sub
Private Sub ComboBox1_Change() 'au changement de la Combobox1
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Dim K As Integer 'déclare la variable K (incrément)
Me.ComboBox2.Clear 'vide la ComboBox2
Me.ListBox1.Clear 'vide la ListBox1
Erase TL 'vide le tableau TL
K = 1 'initialise la variable K
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
'si la donnée en colonne 1 de la boucle est égale a la valeur de la ComboBox1, alimente la ComboBox2 avec la donnée en colonne 2 de la boucle
If TV(I, 1) = Me.ComboBox1.Value Then
Me.ComboBox2.AddItem TV(I, 2)
ReDim Preserve TL(1 To 3, 1 To K) 'redimensionne le tableau des lignes TL (3 lignes, K colonne)
TL(1, K) = TV(I, 1) 'récupère dans la ligne 1 de TL la donnée en colonne 1 de TV
TL(2, K) = TV(I, 2) 'récupère dans la ligne 2 de TL la donnée en colonne 2 de TV
TL(3, K) = TV(I, 3) 'récupère dans la ligne 3 de TL la donnée en colonne 3 de TV
K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL)
End If 'fin de la condition
Next I 'prochaine ligne de la boucle
If K > 1 Then Me.ListBox1.Column = TL 'si K est supérieure a un, alimente les colonnes de la ListBox1 avec le tableau TL
End Sub
Private Sub ComboBox2_Change() 'au changement de la Combobox1
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Dim K As Integer 'déclare la variable K (incrément)
Me.ListBox1.Clear 'vide la ListBox1
Erase TL 'vide le tableau TL
K = 1 'initialise la variable K
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
'condition : si la donnée en colonne 1 de la boucle est égale a la valeur de la ComboBox1 et si la donnée en colonne 2 de la boucle est égale à la ComboBox2
If TV(I, 1) = Me.ComboBox1.Value And TV(I, 2) = Me.ComboBox2.Value Then
ReDim Preserve TL(1 To 3, 1 To K) 'redimensionne le tableau des lignes TL (3 lignes, K colonne)
TL(1, K) = TV(I, 1) 'récupère dans la ligne 1 de TL la donnée en colonne 1 de TV
TL(2, K) = TV(I, 2) 'récupère dans la ligne 2 de TL la donnée en colonne 2 de TV
TL(3, K) = TV(I, 3) 'récupère dans la ligne 3 de TL la donnée en colonne 3 de TV
K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL)
End If 'fin de la condition
Next I 'prochaine ligne de la boucle
If K > 1 Then Me.ListBox1.Column = TL 'si K est supérieure a un, alimente les colonnes de la ListBox1 avec le tableau TL
End Sub