Liste de validation conditions particulières
Bonjour à la liste,
Pourriez-vous me donner une solution permettant de créer une liste de validation si une case de la colonne A contient un nom.
Explications
En colonne A, une ligne sur 5 à partir de la cellule A3 j'ai une liste déroulante.
Cette liste contient une les données correspondantes à une zone nommée sur une autre feuille "NOMS" est le nom de cette liste.
Je souhaite obtenir le résultat suivant :
Si en cellule A3 une valeur est sélectionnée dans la liste déroulante alors
je souhaite que les cellules de B3 à F3 contiennent la liste de validation définie par la zone nommée correspondant au nom sélectionné en A3
J'aimerais aussi que si ensuite on efface le nom en A3 alors les cellules de B3 à F3 ne contiennent plus la liste de validation
et j'aimerais que ce résultat s'obtiennent :
en A3 puis en A8, puis en A13 et ainsi de suite...de 5 en 5
Merci pour votre aide.
Un fichier test en pièce-jointe
Bonjour PG, bonjour le forum,
Je te propose la macro événementielle Change ci-dessous :
Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim PL As Range 'déclare la variable PL (PLage)
Dim OP As Worksheet 'déclare la variable OP (Onglet Pers)
Dim COL As Byte 'déclare la variable COL (COLonne)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Set PL = Application.Union(Range("A3"), Range("A8"), Range("A13"), Range("A18"), Range("A23"), Range("A28")) 'définit la palge PL
If Application.Intersect(PL, Target) Is Nothing Then Exit Sub 'si le changement a lieu ailleurs que dans PL, sort de la procédure
Target.Offset(0, 1).Resize(1, 5).ClearContents 'efface d'éventuelle enciennes valeurs
If Target.Value = "" Then Exit Sub 'si la cellule est effacée, sort de la procédure
Set OP = Worksheets("Pers") 'de'finit l'onglet OB
COL = OP.Rows(1).Find(Target.Value, , xlValues, xlWhole).Column 'définit la colonne COL (via la recherche du nom choisi dans la ligne 1 de l'onglet OP)
DL = OP.Cells(Application.Rows.Count, COL).End(xlUp).Row 'définit la dernière ligne DL de la colonne COL
'renvoie les couleurs du nom choisi
Target.Offset(0, 1).Resize(1, DL - 1).Value = Application.Transpose(OP.Range(OP.Cells(2, COL), OP.Cells(DL, COL)))
End SubTon fichier modifié :
Merci beaucoup,
J'aime beaucoup le bassin de Thau, je ne sais pas si ton nom vient de là...
ça n'est pas exactement le résultat que j'attends. Je me suis donc sans doute mal exprimé.
En fait, au lieu de voir apparaître les valeurs des éléments de la liste nommée correspondant au nom en colonne A dans les colonnes adjacentes, je souhaiterais obtenir le résultat suivant
En Colonne B une liste déroulante contenant les valeurs de la zone nommée
ce qui donnerait ici :
Pour le nom DIOU par exemple :
en B une liste déroulante avec les éléments de la zone nommée DIOU
en C idem
en D idem
en E idem
en F idem
Merci vraiment beaucoup pour ton aide.
Bonjour,
Ci-joint un essai, avec liste en 'cascade'
Dans donnée/validation/liste, tu veux une liste dont le nom est un des choix d'une autre, d'où la fonction indirect(), qui va lire le résultat d'une cellule dont tu spécifies l'adresse.
La modification d'un choix dans la première te proposera d'autre choix dans la seconde.
Attention, les changements ne se font pas en temps réel.
Il faut aussi que les noms de tes listes correspondent exactement au choix de la liste de niveau supérieur, sinon, ca ne marche pas.
j'ai aussi fait de tes listes, en plus des tableaux (vrais tableaux), ce qui te permets d'augmenter la taille en écrivant dessous automatiquement.
C'est génial, un grand merci à toi pour la qualité de ta réponse et la vitesse à laquelle tu viens de solutionner mon problème en allant même plus loin ce qui va me simplifier considérablement la vie.
Re,
En effet j'avais mal compris... Essaie comme ça :
Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim PL As Range 'déclare la variable PL (PLage)
Dim OP As Worksheet 'déclare la variable OP (Onglet Pers)
Dim COL As Byte 'déclare la variable COL (COLonne)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim I As Byte 'déclare la variable I (incrémet)
Dim L As String 'déclare la variable L (Liste)
Set PL = Application.Union(Range("A3"), Range("A8"), Range("A13"), Range("A18"), Range("A23"), Range("A28")) 'définit la palge PL
If Application.Intersect(PL, Target) Is Nothing Then Exit Sub 'si le changement a lieu ailleurs que dans PL, sort de la procédure
Target.Offset(0, 1).Resize(1, 5).ClearContents 'efface d'éventuelle enciennes valeurs
For I = 1 To 5 'boucle sur les 5 colonnes B à F
With Target.Offset(0, I).Validation 'prend en compte la cellule décalée de I colonne à droite de la cellule cible
.Delete 'supprime la validation de donnée
End With 'fin de la prise en compte...
Next I 'prochaine colonne de la boucle
If Target.Value = "" Then Exit Sub 'si la cellule est effacée, sort de la procédure
Set OP = Worksheets("Pers") 'définit l'onglet OP
COL = OP.Rows(1).Find(Target.Value, , xlValues, xlWhole).Column 'définit la colonne COL (via la recherche du nom choisi dans la ligne 1 de l'onglet OP)
DL = OP.Cells(Application.Rows.Count, COL).End(xlUp).Row 'définit la dernière ligne DL de la colonne COL
For I = 2 To DL
L = IIf(L = "", OP.Cells(I, COL) & ",", L & "," & OP.Cells(I, COL))
Next I
For I = 1 To 5 'boucle sur les 5 colonnes B à F
With Target.Offset(0, I).Validation 'prend en compte la cellule décalée de I colonne à droite de la cellule cible
.Delete 'supprime la validation de donnée
.Add xlValidateList, Formula1:=L 'ajoute la liste L comme liste de validation de donnée
End With 'fin de la prise en compte...
Next I 'prochaine colonne de la boucle
End Sub