Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在vba中为组合框指定命名列表_Vba_Excel_Combobox - Fatal编程技术网

在vba中为组合框指定命名列表

在vba中为组合框指定命名列表,vba,excel,combobox,Vba,Excel,Combobox,我试图根据特定组合框的值动态地为每个组合框分配一个列表。其思想是用户从特定的组合框中选择一个类别,所有其他组合框以命名列表的形式从该类别中获取项目 所以结构就像 类别 第一类 第2类 第一类 项目1 项目2 等等。我在一组假名字上做了这个工作,但是现在我使用的是真实的命名范围,代码中断了。它正在“为ws.Range(str)中的每个rng”中断,并声明“对象的方法”“Range”“失败” 这段代码有效。或者说有效。然后我将ws改为指向不同的命名范围表,但现在什么都不起作用 CBOCategory

我试图根据特定组合框的值动态地为每个组合框分配一个列表。其思想是用户从特定的组合框中选择一个类别,所有其他组合框以命名列表的形式从该类别中获取项目

所以结构就像

类别 第一类

第2类

第一类 项目1 项目2

等等。我在一组假名字上做了这个工作,但是现在我使用的是真实的命名范围,代码中断了。它正在“为ws.Range(str)中的每个rng”中断,并声明“对象的方法”“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

代码运行正常。问题的根本原因是命名范围由公式动态设置。代码运行时公式计算不正确,因此vba无法使用动态设置的命名范围来查找另一个,也就是动态设置的命名范围


解决方案是显式设置命名范围。然后代码工作正常。

尽管我怀疑这是错误的原因,但您确实应该将
str
声明为
字符串
,而不是将其默认为
变量
,即
Dim str作为字符串,temp作为字符串,cbName作为字符串
。要添加到@YowE3K的注释中,它有点不直观,但是
Dim str,temp,cbName as String
并没有将所有这些声明为
String
,它只将
cbName
声明为
String
,其他的将是
Variant
,这是未给定类型时的默认值。命名范围的范围是什么?如果它们仅限于某个规范ific工作表,
ws
必须是位于ws/名为“Item Master”的工作表中的命名范围的工作表。命名范围设置为沿着列的整个高度(以便在添加时可以展开),使用以下格式=偏移量(Item Master!$AR$2,0,0,COUNTA(Item Master!$AR:$AR)-1,1)在本例中,AR是指定范围所在的列。尝试了ws.range(str.Cells)中的每个rng
?在循环之前,在即时窗口中得到了什么。