用于多个选项的Excel VBA用户窗体相关组合框

时间:2015-03-23 17:23:31

标签: excel excel-vba userform vba

我正在尝试在用户表单中设置3个ComboBox。

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

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

  4. 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
    

1 个答案:

答案 0 :(得分:0)

该脚本正在做的是工作表“列表”并查看信息表。 A列是组合框1的值,B组是组合框2的值,C组是组合框3的结果值,如下所示:

_______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:Tools - &gt;参考文献 - &gt;向下滚动,直到看到“Microsoft Scripting Runtime”并选中其框 - &gt;单击“确定”

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