Private Sub Worksheet_Change(ByVal Target As Range)
Dim BD As Worksheet 'déclare la varaible BD
Dim TV As Variant 'déclare la varaible TV (Tableau des Valeurs)
Dim D1 As Object 'déclare la varaible D1 (Dictionnaire 1)
Dim D2 As Object 'déclare la varaible D2 (Dictionnaire 2)
Dim D3 As Object 'déclare la varaible D3 (Dictionnaire 3)
Dim I As Integer 'déclare la varaible I (Incrément)
Dim J As Integer 'déclare la varaible J (incrément)
Dim L1 As String 'déclare la varaible L1 (Liste 1)
Dim L2 As String 'déclare la varaible L2 (Liste 2)
Dim L3 As String 'déclare la varaible L3 (Liste 3)
Set BD = Worksheets("BD") 'définit l'onglet BD
TV = BD.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
Set D1 = CreateObject("Scripting.Dictionary") 'définit le dictionnaire 1
Set D2 = CreateObject("Scripting.Dictionary") 'définit le dictionnaire 2
Set D3 = CreateObject("Scripting.Dictionary") 'définit le dictionnaire 3
If Target.Column = 2 And Target.Row > 2 Then 'condition 1 : si la cellule modifiée se trouve dans la colonne 2 (=> colonne B) et sur n'importe quelle ligne après la 2
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs en partant de la seconde
If TV(I, 1) = Target.Value Then 'condition 2 : si la donnée en colonne 1 de TV est égale à ma cellule modifiée [onglet]
If TV(I, 2) <> "" Then D1(TV(I, 2)) = "" 'si la cellule en colonne 2 de TV n'est pas vide, alimente le dictionaire D1
If TV(I, 3) <> "" Then D2(TV(I, 3)) = "" 'si la cellule en colonne 3 de TV n'est pas vide, alimente le dictionaire D2
If TV(I, 4) <> "" Then D3(TV(I, 4)) = "" 'si la cellule en colonne 4 de TV n'est pas vide, alimente le dictionaire D3
End If 'fin de la condition 2
Next I 'prochaine ligne de la boucle
L1 = Join(D1.Keys, ",") 'définit la liste L1 (D1.keys correpond à la liste des éléments du dictionnaire D1 sans doublons)
L2 = Join(D2.Keys, ",") 'définit la liste L2(D2.keys correpond à la liste des éléments du dictionnaire D2 sans doublons)
L3 = Join(D3.Keys, ",") 'définit la liste L3(D3.keys correpond à la liste des éléments du dictionnaire D3 sans doublons)
Target.Offset(0, 1).Resize(1, 3).ClearContents 'efface les cellules en colonnes C, D et E
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
Target.Offset(0, 1).Validation.Delete 'efface une éventuelle validation de donnée dans la cellule en colonne C
Target.Offset(0, 1).Validation.Add xlValidateList, Formula1:=L1 'utilise le liste L1 pour la validation de données en colonne C (génère une erreur si L1 est vide)
Target.Offset(0, 2).Validation.Delete 'efface une éventuelle validation de donnée dans la cellule en colonne D
Target.Offset(0, 2).Validation.Add xlValidateList, Formula1:=L2 'utilise le liste L2 pour la validation de données en colonne D (génère une erreur si L1 est vide)
Target.Offset(0, 3).Validation.Delete 'efface une éventuelle validation de donnée dans la cellule en colonne E
Target.Offset(0, 3).Validation.Add xlValidateList, Formula1:=L3 'utilise le liste L3 pour la validation de données en colonne E (génère une erreur si L1 est vide)
End If 'fin de la condition 1
End Sub