如何使combobox项目列表dynamic?

我正在使用工作表上的“生成”button。 当我点击button时,会popup一个窗体,其中包含两个combobox。 根据第一个combobox中的select,第二个combobox选项列表被填充。

对于第一个combobox,当我硬编码的项目值,它工作正常。 表格代码如下:

Private Sub UserForm_Initialize() With ComboBox_DL .AddItem "DL1" .AddItem "DL2" End With End Sub 

我试图通过使用下面的表单代码从Excel工作表中的列中获取combobox项目值使这个项目列表dynamic:

 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 

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

 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 

它仍然抛出相同的错误。

有人可以帮忙吗? 另外,我想知道如何查找与combobox1中的select对应的值,并填充combobox2中的列表?

如果您的combobox条目是工作表上的列表,则不需要使用VBA来填充它们。 相反,您可以创build一个dynamic命名范围,并将其用作ComboBox的Rowsource。

假设你的列表从Sheet3单元格A1开始。 转到公式| 名称pipe理器创build一个命名范围。 给它一个有用的名字,比如“Combo”,然后把下面的公式放入RefersTo: =OFFSET(Sheet3!$A$1,0,0,COUNTA(Sheet3!$A:$A),1)保存并closures命名范围对话。

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

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

编辑添加:

要使用第一个combobox中选定的值来确定在第二个combobox中使用的列表,我们需要做两件事情。

首先是为第一个列表中所有可能的select创build命名范围:
在这里输入图像说明

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

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

 Private Sub ComboBox1_Change() Me.ComboBox2.Value = "" Me.ComboBox2.RowSource = "=" & Me.ComboBox1.Value End Sub 

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

如果需要,可以添加更多级联选项,每个选项的命名范围不同。 然而,以上几个级别可能会变得难以pipe理 – 在这一点上,我们可能想要看另一种方法。

没有testing过这个,因为我还没有创builduserform在相同的条件下testing,但应该工作受到较小的改动。

 Dim n As Long n = Sheets("Business_Input_Data").Cells(Rows.Count, "AE").End(xlUp).Row With ComboBox_DL For Each c In ThisWorkbook.Worksheets("Business_Input_Data").Range("AE" & n) .AddItem c.Value Next 

您在“AE”中缺less行索引,而且在任何Range参考中始终使用明确的工作表限定

 Private Sub UserForm_Initialize() Dim c As Range With ComboBox_DL For Each c In For Each c In ThisWorkbook.Worksheets("Business_Input_Data").Range(ThisWorkbook.Worksheets("Business_Input_Data").Range("AE1"), ThisWorkbook.Worksheets("Business_Input_Data").Range("AE1").End(xlDown)) .AddItem c.Value Next End With End Sub 

但更优雅的解决scheme是:

 Private Sub UserForm_Initialize() With ThisWorkbook.Worksheets("Business_Input_Data") ComboBox_DL.RowSource = .Range("AE1", .Range("AE1").End(xlDown)).Address End With End Sub Private Sub UserForm_Initialize() With ThisWorkbook.Worksheets("Business_Input_Data") ComboBox_DL.List = .Range("AE1", .Range("AE1").End(xlDown)).Value End With End Sub 

哪里:

  • 前者您的ComboBox列表绑定到其地址为ComboBox RowSource属性的范围值

  • 后者将给定范围的值作为组合Combobox