隐藏空的ComboBox列表项

我有:

  • 3列与数据
  • 3个arrays
  • 3个combobox

这个想法是select一个combobox项目,并让另外两个combobox显示同一行其他单元格中的数据。 我有超过5000行的数据,并且在三列中有超过一百个空单元格。 有一些行只有三个单元格中的一个或两个包含数据。 如果我不包含空单元格,我会遇到错误的数据显示在combobox中,例如,如果Bar(3,5,10)为空,ComboBox1项目Foo(11)将不等于ComboBox2项目Bar(11) ,而是显示ComboBox2项目Bar(8)

我需要一种方法来隐藏下拉列表中的空combobox项目,但不能从列表中删除它们。

该代码作为示例

形成:

 Private Sub UserForm_Initialize() Set FooBar = ActiveWorkbook.Sheets("foobar") Call PopulateArray(FooBar, 1, Foo) Call PopulateControl(Foo, UserForm1.ComboBox1) Call PopulateArray(FooBar, 2, Bar) Call PopulateControl(Bar, UserForm1.ComboBox2) Call PopulateArray(FooBar, 2, Baz) Call PopulateControl(Baz, UserForm1.ComboBox3) End Sub Private Sub ComboBox_Change() ViewSelected UserForm1.ActiveControl End Sub 

模块:

 Public Foo(), _ Bar(), _ Baz() As Variant Public FooBar As Worksheet Function PopulateArray(Source As Worksheet, Columns as Integer, Target as Variant) With FooBar For i = 0 To .UsedRange.Rows.Count - 1 ReDim Preserve Target(i): Target(i) = Cells(i + 1, Column) Next i End With End Function Function PopulateControl(Source As Variant, Target As Control) For i = 0 To UBound(Source) Target.AddItem Source(i) Next i End Function Function ViewSelected(Selected As control) Dim i As Integer: i = Selected.ListIndex For Each control in UserForm1.Controls If TypeName(control) = "ComboBox" Then control.ListIndex = i Next control End Function 

数据的例子

 Column 1 Column 2 Column 3 Foo1 Bar1 Baz1 Foo1 Bar1 Baz2 Foo1 Bar2 Baz3 Foo1 Bar2 Baz4 Foo2 Bar11 Baz11 Foo2 Baz12 'missing Bar11 Foo2 Bar12 Baz13 Foo2 Bar12 'missing Baz14 

好的,我想我已经弄清楚了。 此解决scheme假定您的数组仍然包含空值。 它还假定,你可以以某种方式将选定的控件匹配到相应的数组。

给定一列(所选值)的索引,您需要找出与原始列中的空白数相关的其他列的相应索引。

所以我们在(在这个例子中)相应的数组Foo寻找原始索引:

 Dim i As Integer Dim j as Integer For i = 0 to Selected.ListIndex if Foo(i) = "" Then j = j + 1 j = j + 1 Next i 

我们只是计算空白的数量,直到选定的值。 现在您知道用户select的列的原始索引(包括空白)。 最后,我们在每个(其他)控件中查找对应的值,这里来自BarBaz

 UserForm1.ComboBox1.Text = Bar(j) Userform1.ComboBox2.Text = Baz(j)