【发布时间】:2015-08-11 08:41:21
【问题描述】:
我有:
- 3 列数据
- 3 个数组
- 3 个组合框
这个想法是选择一个组合框项目,让其他两个组合框显示同一行的其他单元格中的数据。我有超过 5000 行数据,以及所有三列中的一百多个空单元格。在某些行中,三个单元格中只有一两个包含数据。如果我不包含空单元格,我会遇到组合框中显示错误数据的问题,例如,如果 Bar(3,5,10) 为空,则 ComboBox1 项目 Foo(11) 将不等于 ComboBox2 项目 Bar(11),而是显示 ComboBox2 项目Bar(8).
我需要一种方法来隐藏下拉列表中的空组合框项目,但不将它们从列表中删除。
作为示例的代码
表格:
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
【问题讨论】:
-
如果一个单元格为空,是否意味着该行中的所有其他单元格也是空的?如果没有,如果用户从包含空单元格的行中选择一个值,您想向用户显示什么?
-
不,有些行中只有三分之二的单元格包含数据,有时三个单元格都包含数据。如果用户在包含空单元格的行上选择一个值,则“空单元格组合框”应为空白
-
您的价值观是否独一无二(每列)?如果是,您可以将空值保留在数组中(从而保留顺序和匹配),并在
ViewSelected中查找所选值(在数组中,而不是控件中!),记下索引并将其匹配到您的对应的数组。 -
@Verzweifler 我在问题中添加了一个数据示例
-
有重复的和空白让我现在不知所措。我正在考虑一种通过额外计数器跟踪每列空白的方法,但还没有可靠的解决方案......