2009-04-08 13 views
1

c'est un peu déroutant d'écrire mon idée, mais je vais essayer. Voici ce que j'ai pu faire. J'ai une liste déroulante sur mes cellules verticales, donc j'ai une liste de noms à choisir, qui est liée par [nom] -> [définir] et [données] -> [validation]. ce que je voudrais est une autre cellule verticale pour remplir une autre liste déroulante en fonction de la condition de la première. Par exemple, j'ai une liste de fruits et légumes.Validation Dérouler sur une condition

Mon premier menu déroulant demande le type, donc je choisis des fruits. En raison de cette sélection, ma deuxième liste déroulante me donnera une liste de fruits seulement (pas de légumes) et vice versa. +

votre aide est grandement appréciée.

merci gang!


Si je veux nommer la cellule au lieu de légume mais 2009 et fruits 2010 j'obtiens une erreur. Y a-t-il un moyen? merci

Répondre

4

Fonctionnons avec certaines plages nommées.

Nom E7 "option"

PUT "légumes" dans E4 et "fruits" dans E5;

dans E7, Données> Validation> Liste, source $ E $ 4: $ E $ 5;

mettre quelques légumes dans H4: H7; nommez cette gamme "légumes";

mettre des fruits dans J4: J7; nommez cette gamme "fruits";

Maintenant, dans E8: Données> Validation> Liste, source "= INDIRECT (option)".

Lorsque vous effectuez un choix dans E7, les options pour E8 sont définies en conséquence.

+0

Salut Carl, très utile et très simple. chaque étape est vraiment bien expliquée. Merci beaucoup Carl –

0

Voici mon code pour faire exactement ce que vous demandez.

J'ai défini la colonne indépendante comme une plage nommée appelée Major_Category et définissez la validation déroulante sur une liste de données. J'ai alors plusieurs autres listes de données qui sont nommées cat_subItems. Donc, pour votre exemple, la catégorie principale aurait des articles

  • fruits
  • légumes

alors je définissais aux listes plus appelées

  • cat_fruit
  • cat_vegetable

qui contiendrait les noms des fruits ou des légumes. Ensuite, en fonction de la sélection de la catégorie principale , l'événement Worksheet_change modifiera la validation déroulante de la colonne suivante en cat_fruit ou cat_vegetable.

Remarque: Ce code ne fonctionne pas bien si vous utilisez la feuille de calcul d'Excel. Voir this question pour la protection de la feuille de calcul/livre d'Excel.

Public Sub Worksheet_Change(ByVal target As Range) 
On Error GoTo ErrHandler: 

Dim VRange As Range, cell As Range 
Dim msg As String 
Dim validateCode As Variant 
Dim modCell As Range 
Set VRange = Range("Major_Category") 

If Intersect(VRange, target) Is Nothing Then Exit Sub 

For Each cell In Intersect(VRange, target) 
    b = cell.Value 
    curRow = target.Row 

    Set modCell = cell.Offset(0, 1) 'cell to modify the validation' 

    If Not (b = "") Then 
     modCell.Validation.Delete 
     modCell.Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 

     'sets the validation formula to the list/range name' 
     xlBetween, Formula1:="=cat_" & b 

     modCell.Validation.IgnoreBlank = True 
     modCell.Validation.InCellDropdown = True 
     modCell.Validation.InputTitle = "" 
     modCell.Validation.ErrorTitle = "" 
     modCell.Validation.ErrorMessage = "" 
     modCell.Validation.ShowInput = True 
     modCell.Validation.ShowError = True 

    End If 
Next cell 


Cleanup: 

Exit Sub 

ErrHandler: 
MsgBox Err, vbOKOnly, "Error Occurred" 
Resume Cleanup: 

End Sub 
+0

Merci à Azim pour votre aide, mais il est un peu trop complexe pour moi: C mais merci encore: D –

0

Vous ne pouvez pas nommer une plage "2009" - car Excel aurait du mal à distinguer celle de la valeur entière 2009. Il y a aussi d'autres restrictions - vous ne pourriez pas nommer une plage "A1" car Excel obtiendrait confondu avec la cellule A1. Ce que vous pourriez faire à la place est d'avoir les 2009 et 2010 dans une table, et à côté d'eux, mettez les noms des plages, puis faites un VLOOKUP pour obtenir le nom de la plage. Alternativement, vous pouvez utiliser, par exemple, « _2009 » et votre formule

= INDIRECT (« _ » l'option &)