如何使组合框项目列表动态化?

Bhu*_*n K 2 excel vba combobox

我在工作表上使用“生成”按钮。当我单击该按钮时,会出现一个弹出窗口(表单),其中包含两个组合框。根据第一个组合框中的选择,填充第二个组合框选项列表。

对于第一个组合框,当我对项目值进行硬编码时,它工作正常。表单代码如下:

Private Sub UserForm_Initialize()

With ComboBox_DL
    .AddItem "DL1"
    .AddItem "DL2"
End With

End Sub
Run Code Online (Sandbox Code Playgroud)

我尝试通过使用以下表单代码从 Excel 工作表中的列中获取组合框项目值来使此项目列表动态化:

Private Sub UserForm_Initialize()

With ComboBox_DL
For Each c In ActiveSheet.Range(Range("AE"), Range("AE").End(xlDown))
 .AddItem c.Value
Next
End With

End Sub
Run Code Online (Sandbox Code Playgroud)

但上面的代码抛出错误:运行时错误'1004':对象'_Global'的方法'Range'失败

I modified the code adding sheet details: 
With ComboBox_DL
    For Each c In ThisWorkbook.Worksheets("Business_Input_Data").Range(Range("AE"), Range("AE").End(xlDown))
        .AddItem c.Value
Next
Run Code Online (Sandbox Code Playgroud)

它仍然抛出相同的错误。

有人可以帮忙吗?另外,我想知道如何查找与组合框1中的选择相对应的值并填充组合框2中的列表?

Wer*_*rrf 5

如果您的组合框条目是工作表上的列表,则根本不需要使用 VBA 来填充它们。相反,您可以创建动态命名范围,并将其用作组合框的行源。

假设您的列表从 Sheet3 的单元格 A1 开始。转到公式 | 名称管理器用于创建命名范围。给它一个有用的名称,例如“Combo”,然后将以下公式放入 RefersTo:=OFFSET(Sheet3!$A$1,0,0,COUNTA(Sheet3!$A:$A),1)保存并关闭“命名范围”对话框。

在组合框的属性中,查找“RowSource”行。将其设置为=Combo,或您用于命名范围的任何名称。

对列表的任何更改(包括延长或缩短列表)现在都将立即自动反映在组合框中。

编辑添加:

要使用第一个组合框中选择的值来确定第二个组合框中使用的列表,我们需要做两件事。

第一个是为第一个列表中的所有可能选择创建命名范围:
在此输入图像描述

在图中,A 列是我们第一个组合框的源;其他列包含第二个组合框的可能来源。

然后,我们只需在第一个组合框的 Change 事件中添加一些代码:

Private Sub ComboBox1_Change()
    Me.ComboBox2.Value = ""
    Me.ComboBox2.RowSource = "=" & Me.ComboBox1.Value
End Sub
Run Code Online (Sandbox Code Playgroud)

只要 ComboBox1 发生更改,就会触发此代码。首先,它清除 ComboBox2 中的所有现有值,然后将 ComboBox2 的行源属性设置为符号=与第一个框中选择的任何值的组合。由于这些值也是命名范围,因此第二个框现在将使用选定的命名范围作为其列表源。

如果需要,您可以添加更多级别的级联选项,每个级别都有不同的命名范围。然而,超过几个级别可能会变得难以管理 - 此时我们可能需要考虑另一种方法。