相关下拉框(表单控件)Excel

时间:2018-10-29 12:52:33

标签: excel vba

我希望有一个依赖的下拉框,该下拉框取决于对“父”下拉框的选择。全部放在一张纸上。但这似乎失败了。 错误,预期功能或变量.. 这是代码;

Sub DropDown112_Change()
Dim index As Integer
index = DropDown112.ListIndex

DropDown56.Clear
Case Is = 0
   With DropDown56
    .AddItem "Yes"
    .AddItem "No"

End With

Case Is = 1
   With DropDown56
   .AddItem "Maybe"

 End With
 End Select
End Sub

2 个答案:

答案 0 :(得分:0)

您未指定要打开的内容。

Case Is = 0

什么是Is?您缺少Select Case {expression}语句/块:

Select Case foo
    Case 0
        'foo is 0
    Case 1
        'foo is 1
End Select

请注意,Is =是多余的。


对于“需要对象”错误,这是因为您没有在模块顶部指定Option Explicit,因此允许您执行代码而无需对标识符进行编译时验证。

DropDown56.Clear

如果DropDown56不存在,则没有Option Explicit的情况下,DropDown56标识符在运行时将变成Variant/Empty,而Variant/Empty则没有.Clear成员,因为它不是对象-因此是“必需对象”。

确保所有的下拉标识符都引用存在的实际控件名称。 Option Explicit将对此进行验证,并阻止成功编译和运行在变量名中带有错别字的代码。 始终如此。采用。选项。明确的。

答案 1 :(得分:0)

每当我不得不处理级联下拉菜单时,我总是在单独的表上设置范围。这样,我可以调整大小和管理选项和子选项,而无需返回代码。我在下面做了一个简单的例子:

Cascading DDs

代码:

Private Sub cmbContinents_Change()
    Dim rng As Range
    Dim countries() As String
    Dim i As Integer

    Me.cmbCountries.Clear
    i = 0
    ReDim countries(i)

    For Each rng In Range("ddCountries")
        If UBound(Filter(countries, rng.Value)) = -1 And rng.Offset(0, -1).Value = Me.cmbContinents.Value Then
            ReDim Preserve countries(i)
            countries(i) = rng.Value
            i = i + 1
        End If
    Next rng

    For j = 0 To UBound(countries)
        Me.cmbCountries.AddItem (countries(j))
    Next j
End Sub

Private Sub Worksheet_Activate()
    Dim rng As Range
    Dim continents() As String
    Dim i As Integer

    Me.cmbContinents.Clear
    i = 0
    ReDim continents(i)

    For Each rng In Range("ddContinents")
        If UBound(Filter(continents, rng.Value)) = -1 Then
            ReDim Preserve continents(i)
            continents(i) = rng.Value
            i = i + 1
        End If
    Next rng

    For j = 0 To UBound(continents)
        Me.cmbContinents.AddItem (continents(j))
    Next j
End Sub

此方法的工作方式是在激活工作表时设置Continents下拉列表的值(cmbContinents)。在“大陆”部分中进行选择之前,不会填充“国家”(cmbCountries)。这可能不是最有效的方式(我敢肯定其他人的代码会更有效),但这至少意味着您不必对选项进行硬编码。

该代码位于工作表中,但可以很容易地在模块中使用。