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
alors je définissais aux listes plus appelées
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
Salut Carl, très utile et très simple. chaque étape est vraiment bien expliquée. Merci beaucoup Carl –