【问题标题】:Excel VBA UserForm Dependant ComboBox for Multiple Options用于多个选项的 Excel VBA 用户窗体相关组合框
【发布时间】:2015-05-26 19:27:56
【问题描述】:

我正在尝试在用户窗体中设置 3 个组合框。

  1. ComboBox1 = 是/否/空白
  2. ComboBox2 = 选项列表

    • 选项1
    • 选项2
    • 选项3
    • 选项4
    • 选项5
    • 选项6
    • 选项7
    • 选项8
  3. ComboBox3 = 是我遇到问题并需要帮助的地方。

ComboBox3 依赖于 ComboBox1 和 ComboBox2 的组合

我希望我能解释清楚。

例如。

如果 ComboBox1 = "" 那么在 ComboBox2 和 Combobox3 中不显示任何选项

如果 ComboBox1 = Yes 并且 ComboBox2 = Option1 然后给我这个选项列表

如果 ComboBox1 = No 并且 ComboBox2 = Option1 然后给我这个其他选项列表。

如果 ComboBox1 = Yes 并且 ComboBox2 = Option2 然后给我这个选项列表

如果 ComboBox1 = No 并且 ComboBox2 = Option2 然后给我这个其他选项列表。

每个选项都以此类推。

希望这是有道理的,有人可以对此有所了解。

如果需要更多详细信息,请告诉我。

谢谢。

更新

经过研究,我发现了一个可以完成这项工作的脚本,但我在将它实施到我当前的代码时遇到了问题。我在一个单独的表格上对其进行了测试,一切都按预期工作。如何将它集成到我当前的 UserForm_Initialize() 中?

我将此部分放置在表单的开头 UserForm_Initialize() Sub 之前。 (我也尝试过添加它)

Private dic As Object

Private Sub ComboBox1_Change()
    With Me
        .ComboBox2.Clear
        .ComboBox3.Clear
        If .ComboBox1.ListIndex <> -1 Then
            .ComboBox2.List = dic(.ComboBox1.Value).keys
        End If
    End With
End Sub

Private Sub ComboBox2_Change()
    With Me
        .ComboBox3.Clear
        If .ComboBox2.ListIndex <> -1 Then
            .ComboBox3.List = dic(.ComboBox1.Value)(.ComboBox2.Value).keys
        End If
    End With
End Sub

这是进入 UserForm_Initialize() 子的第二部分,我不断收到错误“运行时错误 9。下标超出范围”。工作表“列表”存在,它包含所有必要的信息。如果我在另一个表单上单独尝试,它会起作用。

Private Sub UserForm_Initialize()
    Dim a, i As Long
    Set dic = CreateObject("Scripting.Dictionary")
    dic.CompareMode = 1
    a = Sheets("Lists").Cells(1).CurrentRegion.Value
    For i = 2 To UBound(a, 1)
        If Not dic.exists(a(i, 2)) Then
            Set dic(a(i, 2)) = CreateObject("Scripting.Dictionary")
        End If
        If Not dic(a(i, 2)).exists(a(i, 1)) Then
            Set dic(a(i, 2))(a(i, 1)) = CreateObject("Scripting.Dictionary")
        End If
        dic(a(i, 2))(a(i, 1))(a(i, 3)) = i
    Next
    Me.ComboBox1.List = dic.keys
End Sub

这就是我的 UserForm_Initialize() 在没有此代码的情况下最初的样子。这是让我加载一些其他组合框。

Private Sub UserForm_Initialize()

    Dim rngResponse As Range
    Dim ws As Worksheet

    Set ws = Worksheets("Lists")

    For Each rngResponse In ws.Range("Response")

    Me.cbRes1.AddItem rngResponse.Value
    Me.cbRes2.AddItem rngResponse.Value
    Me.cbRes3.AddItem rngResponse.Value
    Me.cbRes4.AddItem rngResponse.Value
    Me.cbRes5.AddItem rngResponse.Value
    Me.cbRes1.AddItem rngResponse.Value

    Next rngResponse

    End Sub

【问题讨论】:

  • 使用用户窗体上的ComboBox_Change 事件对此进行编程。首先对 ComboBox1 执行此操作,如果它为空白,则将其他两个空白并清除 ComboBox 3 的列表。然后在 ComboBox2 上设置一个更改事件,以根据在 ComboBoxes 1 和 2 中选择的内容调整 ComboBox3 的选项。如果您遇到特定问题,请使用您提出的代码以及您遇到问题的位置更新您的问题。
  • 感谢tigeravatar。我已经尽我所能,但我没有想法,我已经发布了我迄今为止所做的更新。
  • 在您的描述和发布的示例脚本中,它只讨论了 3 个组合框。但是,在您原来的 UserForm_Initialize 代码中,它显示了五个组合框。我们是在使用三个还是五个组合框?
  • 您在我在更新中发布的 UserForm_Initialize 代码中看到的 5 个是用于其他目的的其他组合框,它们与我试图开始工作的其他 3 个无关。我发布了我的 userform_initialize 代码,因为我不知道如何将其他 3 个代码集成到我当前的工作中。
  • 我终于让它工作了。我让脚本查看所选工作表中超出范围的列。

标签: excel userform vba


【解决方案1】:

该脚本正在执行的操作是转到工作表“列表”并查看信息表。 A 列是 combobox1 的值,B 列是 combobox2 的值,C 列是 combobox3 的结果值,如下所示:

_______A_______    _______B_______    _______C______
ComboBox1 Value    ComboBox2 Value    ComboBox3 List
Yes                1                  Y1a
Yes                1                  Y1b
Yes                1                  Y1c
Yes                2                  Y2a
Yes                2                  Y2b
Yes                2                  Y2c
Yes                3                  Y3a
Yes                3                  Y3b
Yes                3                  Y3c
No                 1                  N1a
No                 1                  N1b
No                 1                  N1c
No                 2                  N2a
No                 2                  N2b
No                 2                  N2c
No                 3                  N3a
No                 3                  N3b
No                 3                  N3c

然后,它使用列 A 和 B 的唯一组合编译字典对象(例如 Dictionary("Yes")(1)Dictionary("No")(3) 并将 ComboBox3 列表的值存储为对应的唯一列 A 和 B 集的键。

我个人认为这是一个非常聪明的解决方案,并且会满足您的需求,尽管它相当先进。要使代码正常工作,您需要在 Visual Basic 编辑器中设置对 Microsoft Scripting Runtime 的引用:工具 -> 引用 -> 向下滚动,直到看到“Microsoft Scripting Runtime”并选中其框 -> 单击确定

您还需要确保工作表“列表”中的数据格式如图所示,第 1 行是标题行,值和相应的 ComboBox3 列表值设置如我的示例所示(当然,替换那些与你的实际列表值)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多