Bonjour Nannek, Tulipe, bonjour le forum,
Une proposition VBA. J'ai un peu changé la structure du tableau dans l'onglet valeurs pour simplifier les codes... La liste de validation de données en D1 s'adapte a la famille choisie.
Sélectionne une famille en B1 puis un choix dans D1...
Le code :
Private COLD As Byte 'déclare la variable COLD (COLonne du Début)
Private COLF As Byte 'déclare la variable COLF (COLonne de Fin)
Private TEST As Boolean 'déclare la variable TEST
Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim I As Byte 'déclare la variable I (Incrément)
Dim L As String 'déclare la variable L (Liste)
Set O = Worksheets("valeurs") 'définit l'onglet O
Select Case Target.Address 'agit en fonction de l'adresse de la cellule modifiée
Case "$B$1" 'cas B1
Range("A8").CurrentRegion.Offset(1, 0).ClearContents 'efface d'eventuelles anciennes données
COLD = O.Rows(3).Find(Target.Value, , xlValues, xlWhole).Column 'définit la colonne de début (recherche la valeur de la cellule B1 dans la ligne 3 de l'onglet O et récupère sa colonne)
COLF = O.Cells(3, COLD).End(xlToRight).Column 'définit la colonne de fin COLF
For I = COLD + 1 To COLF 'bouce sur toutes les colonnes de COLD + 1 à COLF
L = IIf(L = "", O.Cells(3, I), L & "," & O.Cells(3, I)) 'définit la liste L
Next I 'prochaine colonne de la boucle
With Range("D1") 'prend en compte de la cellule D1
With .Validation 'prend en compte la validation de données de la cellule D1
.Delete 'suppruime la validation de données 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ées de la cellule D1
TEST = True 'définit la variable TEST
.Value = "" 'efface le contenu de la cellule D1
End With 'fin de la prise en compte de la cellule D1
Case "$D$1" 'cas D1
If TEST = True Then TEST = False: Exit Sub 'si TEST est [Vrai] redéfinit TEST à [Faux] et sort de la procédure
O.Range(O.Cells(4, COLD), O.Cells(Application.Rows.Count, COLD).End(xlUp)).Copy Range("A9") 'récupere la famille à partir de la A9
COLF = O.Rows(3).Find(Target.Value, , xlValues, xlWhole).Column 'définit la colonne COLF(recherche la valeur de la cellule D1 dans la ligne 3 de l'onglet O et récupère sa colonne)
O.Range(O.Cells(4, COLF), O.Cells(Application.Rows.Count, COLF).End(xlUp)).Copy Range("B9") 'récupere les données à partir de B9
End Select 'fin de l'action en fonction de l'adresse de la cellule modifiée
TEST = False 'réinitialise la variable TEST
End Sub
Le fichier :