Вот мой код для выполнения именно того, что вы просите.
Я определил независимый столбец как именованный диапазон с именем Major_Category
и установил проверку в раскрывающемся списке на список данных. Затем у меня есть несколько других списков данных с именем cat_subItems
. Итак, для вашего примера основная категория будет иметь элементы
- фрукты
- 1010 * растительное *
тогда я определил другие списки под названием
который будет содержать названия фруктов или овощей. Затем на основе выбора основной категории событие Worksheet_change изменит проверку раскрывающегося списка в следующем столбце на cat_fruit
или cat_vegetable
.
Примечание: Этот код не очень удобен, если вы используете рабочую таблицу Excel.
См. в этом вопросе о работе с таблицей 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