Listes déroulantes dépendantes
Bonjour,
J'ai un fichier qui contient des fournisseurs et de No de produits et je veux faire une liste déroulante qui liste les fournisseurs de façon unique.
Je veux une liste déroulante de produits qui est dépendante du fournisseur sélectionné.
Comment faire pour avoir une liste déroulante de produits qui liste toujours les produits du fournisseur sélectionné même qui j'ai sélectionné un fournisseur différent 10 lignes plus bas, les listes déroulantes plus haut affichent toujours les bons produits du fournisseurs de gauche.
Je joins un fichier.
Merci,
Oiseau bleu
Merci beaucoup, tout à fait génial.
Oiseau bleu
Bonsoir le fil, bonsoir le forum,
Une proposition VBA dans ton fichier modifié.
Le code se trouve dans le composant ThisWorkbook, pour définir la validation de données en D13 à l'ouverture du classeur :
Private Sub Workbook_Open()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim L As String 'déclare la variable L (Liste)
Set O = Worksheets("Feuil1") '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 valeurts TV (en partant de la seconde)
D(TV(I, 1)) = "" 'alimente le dictionnaire D avec les données en colonne 1 de TV
Next I 'prochaine ligne de la boucle
L = Join(D.Keys, ",") 'définit la liste L en joignant la liste des éléments du dictionnaire D sans doublon (les clés) séparés par une virgule
With O.Range("D13").Validation 'prend en compte la validation de données de la cellule D13 de l'onglet O
.Delete 'efface une éventuelle ancienne validation de données
.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 cellule D13 de l'onglet O
End SubEt dans le composant Feuil1(Feuil1) avec l'événement Change, pour définir la liste de validation de données de F13 à chaque changement de D13 :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim L As String 'déclare la variable L (Liste)
If Target.Address <> "$D$13" Then Exit Sub 'si le changement a lieu ailleurs qu'en D13, sort de la procédure
If Target.Value = "" Then 'condition : si la cible (D13) est effacée
With Target.Offset(0, 2) 'prend en compte F13
.Validation.Delete 'supprime une éventuelle validation de données
.Value = "" 'efface la celljule
End With 'fin de la prise en compte de F13
Else 'sinon
Target.Offset(0, 2).Value = "" 'efface F13
TV = 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 valeurts TV (en partant de la seconde)
'si la données ligbne I colonne 1 de TV est égale à la cible (D13), alimente le dictionnaire D avec les données en colonne 2 de TV
If TV(I, 1) = Target.Value Then D(TV(I, 2)) = ""
Next I 'prochaine ligne de la boucle
L = Join(D.Keys, ",") 'définit la liste L en joignant la liste des éléments du dictionnaire D sans doublon (les clés) séparés par une virgule
With Range("F13").Validation 'prend en compte la validation de données de la cellule F13
.Delete 'efface une éventuelle ancienne validation de données
.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 cellule D13 de l'onglet O
Range("F13").Select 'sélectionne F13
End If 'fin de la condition
End SubJe n'ai pas compris pourquoi il y avait plusieurs lignes...