これは、あなたが求めていることを正確に行うための私のコードです。
独立した列を名前付き範囲として定義しMajor_Category
、ドロップダウン検証をデータリストに設定しました。次に、 という名前の他のデータ リストがいくつかありますcat_subItems
。したがって、あなたの例では、主要なカテゴリにはアイテムがあります
それから私は呼ばれるより多くのリストに定義しました
果物や野菜の名前が含まれます。次に、主要なカテゴリの選択に基づいて、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