【问题标题】:Hide empty ComboBox list items隐藏空的 ComboBox 列表项
【发布时间】: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 我在问题中添加了一个数据示例
  • 有重复的空白让我现在不知所措。我正在考虑一种通过额外计数器跟踪每列空白的方法,但还没有可靠的解决方案......

标签: vba excel combobox


【解决方案1】:

好的,我想我已经想通了。此解决方案假定您的数组仍包含空值。它还假设,您可以通过某种方式将选定的 Control 匹配到相应的数组。

给定一列的索引(所选值),您想找出其他列的对应索引,考虑原始列中的空白数。

所以我们在(在这个例子中)对应的数组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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2014-02-02
    相关资源
    最近更新 更多