大家好,今日我们继续讲解VBA数组与字典解决方案,今日的内容是第56讲,利用字典的嵌套,完成三级下拉菜单的制作。

在第54讲中我讲了利用字典的嵌套,完成二级下拉菜单的制作,很多朋友来信反馈说不过瘾,可是三级下拉菜单自己却调试不出来.今日我就给大家讲解一下,其实这和二级菜单的制作是类似的,但是需要读者充分理解字典嵌套的含义,也就是说ITEM值可以是字典,要充分理解这时字典的意义,在大脑中模拟这个过程。

实例,如下数据,我要建立一个自定义的窗体,实现省、市、县三级菜单的互动相应,




mysql sql语句在指定行前面增加一行 sql表任意位置增加一行_键值


首先我们要建立一个窗体:


mysql sql语句在指定行前面增加一行 sql表任意位置增加一行_键值_02


下面看我给出的代码:

Private Sub ComboBox1_Change()
ComboBox2.Clear

'二级下拉框对应的是第一级字典的键值为键的字典

If ComboBox1.Value <> "" Then ComboBox2.List = mydic(ComboBox1.Value).keys
End Sub
Private Sub ComboBox2_Change()
ComboBox3.Clear

'二级下拉框对应的是第一级字典的键值为键的字典

If ComboBox2.Value <> "" Then ComboBox3.List = mydic(ComboBox1.Value)(ComboBox2.Value).keys
End Sub
Private Sub UserForm_Activate() '第56讲 利用字典的嵌套完成三级级下拉菜单的制作
'将数据装入数组
myarr = Range("a1").CurrentRegion.Value
Set mydic = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(myarr)
strF = myarr(i, 1)
strS = myarr(i, 2)
strT = myarr(i, 3)
If Not mydic.exists(strF) Then
'建立嵌套字典,第一重字典的键对应的键值为字典
Set mydicTemp = CreateObject("Scripting.Dictionary")
Set mydic(strF) = mydicTemp
End If
If Not mydic(strF).exists(strS) Then
Set mydicTemp2 = CreateObject("Scripting.Dictionary")
Set mydic(strF)(strS) = mydicTemp2
End If
mydic(strF)(strS)(strT) = ""
Next i
'一级下拉框对应的是第一级字典的键
ComboBox1.List = mydic.keys
End Sub
Sub mynzsz_56() '第56讲 利用字典的嵌套,完成三级下拉菜单的制作
UserForm2.Show
End Sub

代码截图:


mysql sql语句在指定行前面增加一行 sql表任意位置增加一行_嵌套_03


代码解析:1 上述过程实现了三级菜单的响应,在"省"的菜单中实现省一级名称菜单,在"市"一级菜单中出现对应于"省"的市级菜单,在点击"县"时会出现对应于"市"名称的县级菜单。

2 '将数据装入数组

myarr = Range("a1").CurrentRegion.Value

上述代码将所有备用数据放到数组中

3. For i = 2 To UBound(myarr)
strF = myarr(i, 1)
strS = myarr(i, 2)
strT = myarr(i, 3)

上述代码先建立了一个FOR NEXT的循环 ,提取每一行的数据

4 If Not mydic.exists(strF) Then

'建立嵌套字典,第一重字典的键对应的键值为字典

Set mydicTemp = CreateObject("Scripting.Dictionary")
Set mydic(strF) = mydicTemp
End If

上述代码将第一级数据放到字典中作为键,对应的键值建立字典对象

5 If Not mydic(strF).exists(strS) Then
Set mydicTemp2 = CreateObject("Scripting.Dictionary")
Set mydic(strF)(strS) = mydicTemp2
End If

上述代码将第二级数据放到字典中作为键,对应的键值建立字典对象

6 mydic(strF)(strS)(strT) = ""
Next i

上述代码完善第二级数据键值对应的字典,放入键,键值为空即可.

7 '一级下拉框对应的是第一级字典的键

ComboBox1.List = mydic.keys

上述代码给一级菜单赋值、

8 Private Sub ComboBox1_Change()
ComboBox2.Clear

'二级下拉框对应的是第一级字典的键值为键的字典

If ComboBox1.Value <> "" Then ComboBox2.List = mydic(ComboBox1.Value).keys
End Sub

上述代码给二级菜单赋值

9 Private Sub ComboBox2_Change()
ComboBox3.Clear

'二级下拉框对应的是第一级字典的键值为键的字典

If ComboBox2.Value <> "" Then ComboBox3.List = mydic(ComboBox1.Value)(ComboBox2.Value).keys
End Sub

上述代码给三级菜单赋值

代码的运行:


mysql sql语句在指定行前面增加一行 sql表任意位置增加一行_嵌套_04


mysql sql语句在指定行前面增加一行 sql表任意位置增加一行_sqlparameter多个赋值一行完成_05


大家可以看到,应用字典实现下拉三级菜单的过程,非常的简单。