【发布时间】:2017-03-21 21:46:10
【问题描述】:
我正在尝试根据特定组合框的值为每个组合框动态分配一个列表。这个想法是用户从特定组合框中选择一个类别,所有其他组合框以命名列表的形式从该类别中获取项目。
所以结构是这样的
类别
第 1 类
第 2 类
类别 1
项目 1 第 2 项
等等。我在一组假名称上进行了这项工作,但现在我使用的是真实命名范围,代码中断了。它打破了“For Each rng In ws.Range(str)”,并指出“对象 '_worksheet' 的方法 'range' 失败。
此代码有效。或者工作。然后我将 ws 更改为指向不同的命名范围表,现在没有任何效果。
CBOCategory 的值是所有命名范围列表中的任何值,但 Excel 似乎没有看到它们中的任何一个!我什至尝试触发 listfill 分配而不是添加每个项目并得到类似的错误
Private Sub CBOCategory_Change()
'Populate dependent combo box with appropriate list items
'according to selection in cboCategoryList.
Dim rng As Range
Dim ws As Worksheet
Dim str, temp, cbName As String
Dim counter As Integer
Set ws = Worksheets("Item Master")
Dim obj As OLEObject
str = CBOCategory.Value
For Each obj In ActiveSheet.OLEObjects
If obj.Name = "CBOCategory" Then
' nothing
Else
temp = obj.Object.Value
obj.Object.Value = ""
For Each rng In ws.Range(str)
obj.Object.AddItem rng.Value
Next rng
obj.Object.Value = temp
End If
'MsgBox ("updated!")
Next obj
End Sub
【问题讨论】:
-
虽然我怀疑它会导致错误,但您确实应该将
str声明为String,而不是让它默认为Variant,即Dim str As String, temp As String, cbName As String。 -
要添加到@YowE3K 的评论中,这有点不直观,但
Dim str, temp, cbName as String确实不将所有这些声明为String,它仅将cbName声明为@ 987654329@,其他为Variant,这是未指定类型时的默认值。 -
您的命名范围的范围是什么?如果它们仅适用于特定工作表,
ws必须是该工作表 -
所有命名范围都存在于 ws / 名为“Item Master”的工作表中。命名范围设置为列的整个高度(以便在添加时可以扩展),使用以下格式 =OFFSET(Item Master!$AR$2,0,0,COUNTA(Item Master!$ AR:$AR)-1,1) 在这种情况下,AR 是命名范围所在的列。
-
试过
For Each rng In ws.Range(str).Cells?在 For 循环之前,您在Debug.Print str的即时窗口中得到了什么?确保不是""。