Option Explicit[/COLOR]
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'au changement de sélection dans l'onglet
Dim RS As Worksheet 'déclare la variable RS (onglet Ressources - Services)
Dim C As Worksheet 'déclare la variable C (onglet Congés)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim R As Range 'déclare la variable R (Recherche)
Dim COL As Byte 'déclare la variable COL (COLonne)
Dim I As Integer 'déclare la variable I (Incrément)
Dim LI As Integer 'déclare la variable LI (LIgne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim CEL As Range 'déclare la variable CEL (CELlule)
Dim L As String 'déclare la variable L (Liste)
'si la selection se trouve ailleurs que dans les colonnes 5, 8 ou 11 (E, H ou K), sort de la procédure
If Application.Intersect(Target, Application.Union(Columns(5), Columns(8), Columns(11))) Is Nothing Then Exit Sub
If Target.Row = 1 Then Exit Sub 'si la sélection se trouve dans la ligne 1, sort de la procédure
Set C = Worksheets("Congés") 'définit l'onglet C
TV = C.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
Set RS = Worksheets("Ressources - Services") 'définit l'onglet RS
If Target.Offset(0, -1).MergeArea(1).Value = "" Then Exit Sub 'si la valeur de la cellule sélectionnée décalée d'une colonne à gauche est vide, sort de la procédure
'définit la recherche R (recherche dans la ligne 1 de l'onglet C, la valeur exacte de la cellue sélectionnée décalée d'une colonne à gauche)
Set R = RS.Rows(1).Find(Target.Offset(0, -1).MergeArea(1).Value, , xlValues, xlWhole)
If Not R Is Nothing Then COL = R.Column 's'il existe au moins une occurrence trouvée, définit la colonne COL de la premiere occurrence trouvée
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 ligne I colonne 2 de TV est égale à la valeur de la cellule ligne = ligne de la cellule sélectionné, colonne B, définit la ligne LI, sort de la boucle
If TV(I, 2) = Cells(Target.Row, "B").Value Then LI = I: Exit For
Next I 'prochaine ligne de la boucle
If LI = 0 Then Exit Sub 'si LI est égale a zéro, sort de la procédure
Set PL = C.Range(C.Cells(LI, 3), C.Cells(LI, UBound(TV, 2))) 'définit la plage PL (la plage ees cellules des colonnes 3 à 12 de la ligne trouvée LI)
For I = 2 To RS.Cells(Application.Rows.Count, COL).End(xlUp).Row 'boucle 1 : sur toutes les cellules de la colonne COL de l'onglet RS (en partant de la seconde)
For Each CEL In PL 'Boucle 2 : sur toutes les cellule CEL de la plage PL
'condition : si la cellule CEL n'est pas vide et si la valeur de la cellule en ligne 1 et colonne COL de l'onglet C
'est égale à la valeur de la cellule ligne LI colonne COL de l'ongelt RS, va à l'étiquette "suite"
If CEL.Value <> "" And C.Cells(1, CEL.Column).Value = RS.Cells(I, COL).Value Then GoTo suite
Next CEL 'prochaine cellule de la boucle 2
L = IIf(L = "", RS.Cells(I, COL).Value, L & "," & RS.Cells(I, COL).Value) 'redéfinit la liste L
suite: 'étiquette
Next I 'prochaine cellule de la boucle 1
With Target.Validation 'prend en compte la validation de donnée de la cellule sélectionnée
.Delete 'efface une eventuelle validation existante
.Add xlValidateList, Formula1:=L 'définit la liste L comme liste de validation de données
End With 'fin de la prise en compte de la validation de donnée de la cellule sélectionnée
End Sub