Private O As Worksheet 'déclare la variable O (Onglet)
Private TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Private Sub UserForm_Initialize() 'à 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 = Sheets("Feuil1") 'définit l'onglet O
TV = O.Range("A2").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 3 To UBound(TV, 1) 'boucles sur toutes les lignes I du tableau des valeurs TV (en partant de la troisième)
D(TV(I, 3)) = "" 'alimente le dictionnaire D avec les données ligne I colonne 3 du tableau des valeurs TV
Next I 'prochaine ligne de la boucle
Me.ComboBox1.List = D.Keys 'alimente la ComboBox1 avec la liste des données du dictionnaire D sans doublon
End Sub
Private Sub ComboBox1_Change() 'au changement dans la ComboBox1
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)
Me.ComboBox2.Clear 'vide la ComboBox2
Me.ComboBox3.Clear 'vide la ComboBox3
Me.ListBox1.Clear 'vide la ListBox1
If Me.ComboBox1.Value = "" Then Exit Sub 'si la ComboBox1 est effacée, sort de la procédure
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 3 To UBound(TV, 1) 'boucles sur toutes les lignes I du tableau des valeurs TV (en partant de la troisième)
'si la données ligne I colonne 3 du tableau des valeurs TV est égale à la valeur de la ComboBox1,
'alimente le dictionnaire D avec la donnée ligne I colonne 4 du tableau des valeurs TV
If TV(I, 3) = Me.ComboBox1.Value Then D(TV(I, 4)) = ""
Next I 'prochaine ligne de la boucle
Me.ComboBox2.List = D.Keys 'alimente la ComboBox2 avec la liste des données du dictionnaire D sans doublon
End Sub
Private Sub ComboBox2_Change() 'au changement dans la ComboBox2
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)
Me.ComboBox3.Clear 'vide la ComboBox3
Me.ListBox1.Clear 'vide la ListBox1
If Me.ComboBox2.Value = "" Then Exit Sub 'si la ComboBox2 est effacée, sort de la procédure
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 3 To UBound(TV, 1) 'boucles sur toutes les lignes I du tableau des valeurs TV (en partant de la troisième)
'si la données ligne I colonne 3 du tableau des valeurs TV est égale à la valeur de la ComboBox1,
'et la données ligne I colonne 4 du tableau des valeurs TV est égale à la ComboBox2
'alimente le dictionnaire D avec la donnée ligne I colonne 5 du tableau des valeurs TV
If TV(I, 3) = Me.ComboBox1.Value And TV(I, 4) = Me.ComboBox2.Value Then D(TV(I, 5)) = ""
Next I 'prochaine ligne de la boucle
Me.ComboBox3.List = D.Keys 'alimente la ComboBox3 avec la liste des données du dictionnaire D sans doublon
End Sub
Private Sub ComboBox3_Change() 'au changement dans la ComboBox3
Dim LI As Integer 'déclare la variable LI (LIgne)
Dim NC As Byte 'déclare la variable NC (Nombre de Colonnes)
Dim TL() As Variant 'déclare la variale TL (Tableau des Lignes)
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)
Me.ListBox1.Clear 'vide la ListBox1
If Me.ComboBox3.Value = "" Then Exit Sub 'si la ComboBox3 est effacée, sort de la procédure
For I = 3 To UBound(TV, 1) 'boucles sur toutes les lignes I du tableau des valeurs TV (en partant de la troisième)
'si la données ligne I colonne 3 du tableau des valeurs TV est égale à la valeur de la ComboBox1,
'et la données ligne I colonne 4 du tableau des valeurs TV est égale à la ComboBox2
'et la données ligne I colonne 5 du tableau des valeurs TV est égale à la ComboBox3
'définit la ligne I, sort de la boucle
If TV(I, 3) = Me.ComboBox1.Value And TV(I, 4) = Me.ComboBox2.Value And TV(I, 5) = Me.ComboBox3.Value Then LI = I: Exit For
Next I 'prochaine ligne de la boucle
For J = 6 To 26 Step 2 'boucle sur les colonnes 6 à 26 (= F à Z) par pas de deux
'si la donnée ligne LI colonne J du tableau des valeurs TV n'est pas vide, définit le nombre de colonnes NC
If TV(LI, J) <> "" Then NC = NC + 1
Next J 'prochaine colonne de la boucle
Me.ListBox1.ColumnCount = NC 'définit le nombre de colonnes de la ListBox1
K = 1 'initialise la variable K
For J = 6 To 26 Step 2 'boucle sur les colonnes 6 à 26 (= F à Z) par pas de deux
If TV(LI, J) <> "" Then 'condition : si la données ligne LI colonne J n'est pas vide
ReDim Preserve TL(1 To 2, 1 To K) 'redimensionne le tableau des lignes TL (2 lignes, K colonnes)
TL(1, K) = TV(1, J) 'récupère dans la ligne 1 colonne K de TL, le pays ligne 1 colonne J de TV
TL(2, K) = TV(LI, J) 'récupère dans la ligne 2 colonne K de TL, la réponse ligne LI colonne J de TV
K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL
End If 'fin de la condition
Next J 'prochaine colonne de la boucle
Me.ListBox1.List = TL 'alimente la ListBox1 avec le tableau TL
End Sub