大家好,今日我们继续讲解VBA数组与字典解决方案,今日的内容是第56讲,利用字典的嵌套,完成三级下拉菜单的制作。
在第54讲中我讲了利用字典的嵌套,完成二级下拉菜单的制作,很多朋友来信反馈说不过瘾,可是三级下拉菜单自己却调试不出来.今日我就给大家讲解一下,其实这和二级菜单的制作是类似的,但是需要读者充分理解字典嵌套的含义,也就是说ITEM值可以是字典,要充分理解这时字典的意义,在大脑中模拟这个过程。
实例,如下数据,我要建立一个自定义的窗体,实现省、市、县三级菜单的互动相应,
首先我们要建立一个窗体:
下面看我给出的代码:
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
代码截图:
代码解析: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
上述代码给三级菜单赋值
代码的运行:
大家可以看到,应用字典实现下拉三级菜单的过程,非常的简单。
今日内容回向:
1 如何实现三级下拉菜单的响应?思路是怎么样的?
2 要理解字典ITEM值是字典后的赋值方法。