我希望有一个依赖的下拉框,该下拉框取决于对“父”下拉框的选择。全部放在一张纸上。但这似乎失败了。 错误,预期功能或变量.. 这是代码;
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
答案 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)
每当我不得不处理级联下拉菜单时,我总是在单独的表上设置范围。这样,我可以调整大小和管理选项和子选项,而无需返回代码。我在下面做了一个简单的例子:
代码:
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)。这可能不是最有效的方式(我敢肯定其他人的代码会更有效),但这至少意味着您不必对选项进行硬编码。
该代码位于工作表中,但可以很容易地在模块中使用。