我正在尝试在用户表单中设置3个ComboBox。
ComboBox2 =选项列表
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
答案 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列表值设置如我的示例所示(当然,替换具有您实际列表值的那些)。