2016-11-15 96 views
0

我在工作表上使用'生成'按钮。当我点击按钮时,会弹出一个窗体(窗体),其中包含两个组合框。根据第一个组合框中的选择,第二个组合框选项列表已填充。如何使组合框项目列表动态化?

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

Private Sub UserForm_Initialize() 

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

End Sub 

我试图使这个项目清单动态由一列获取组合框项值的使用下面的表单代码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 

但上面的代码抛出错误:运行时错误“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中的选择对应的值,并在combobox2中填充列表?

回答

0

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

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

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

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

编辑补充:

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

首先是在第一列表中的所有可能的选择创建一个名为范围:
enter image description here

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

然后我们只需要把代码一点点在第一组合框Change事件:每当ComboBox1改变

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

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

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

+0

谢谢Werf。如何显示包含第一个组合框中的选择列表的第二个组合框? –

+0

通常情况下,如果我们使用数据验证下拉菜单执行此操作,则只需根据第一个范围内的可能值创建其他命名范围,然后使用指向第一个范围的源结果的间接公式其他。 Comboboxes在表单上,​​它稍微复杂一些;我将编辑为您包含一些代码。 – Werrf

+0

@Werf - 它工作。干杯! –

1

未经测试,因为我还没有创建用户表单在相同的条件下测试,但应该工作受到较小的改动。

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 
+0

感谢mo.h如何显示第二个组合框,其中包含列表的基础上第一个组合框的选择?假设我有一个DL名称和相应的combobox2列表选项的表格? –

+0

不是问题!如果您发现它有用,请将其标记为答案:)。关于你上面的问题,你是什么意思?请澄清 – user1

+0

在同样的形式中,我有另一个combobox2,它列出了取决于我在combobox1中选择的值。假设DL1对应于A1,B1,C1项目。而DL2对应于A2,B2,C2。如果我在组合框1中选择DL1,组合框应仅列出选项A1,B1和C1。类似地,对于combobox1中选择的DL2,combbox2应列出A2,B2和C2。 –

1

你错过了行索引 “AE” 任何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 

但更优雅的解决方案是:

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列表的范围值,其地址是作为ComboBoxRowSource财产

  • 后者则采用给定范围的值作为Combobox

+0

非常感谢。如何只填充组合框2中的特定值基于combobox1中的选择? –

+0

这是一个新问题,然后发布新问题 – user3598756