34、VBA数组与字典解决方案51字典嵌套下拉框
今日我们继续讲解VBA数组与字典解决方案,今日讲解第51讲:对字典嵌套的理解及二级下拉菜单的制作.
在讲字典的时候,我反复说明,字典看视非常简单,由于它具有直达性可以省略去我们大量的循环查找代码,所以使用起来要特别留意很多用法和常规思路是不一致的,对于字典的理解:
1:键key、键值(或者较项)item 是非常重要的,key 一定是字符串,具有唯一性,item 可以为任何类型的数据.
2:keys 和items 是一维数组,他们的开始是从0开始到count-1结束。
3:再次理解字典的直达性,对于给定的键,可以直接得出键值不必循环查找.
今日我们利用字典的嵌套完成一个两级下拉菜单的制作,大家要认真理解,如下面的数据:
我要在一级菜单中实现A列的数值,在二级下拉菜单中实现对应于A列的B列的值,下面看我给出的代码:
Private Sub ComboBox1_Change()
ComboBox2.Clear
'二级下拉框对应的是第一级字典的键值为键的字典
ComboBox2.List = mydic(ComboBox1.Value).keys
End Sub
Private Sub UserForm_Activate() '第51讲 字典的嵌套的理解及二级下拉菜单的制作
'将数据装入数组
myarr = Range('a1').CurrentRegion.Value
Set mydic = CreateObject('Scripting.Dictionary')
For i = 2 To UBound(myarr)
strF = myarr(i, 1)
strS = myarr(i, 2)
If Not mydic.Exists(strF) Then
'建立嵌套字典,第一重字典的键对应的键值为字典
Set mydicTemp = CreateObject('Scripting.Dictionary')
'注意下面的两种写法
'Set mydic.Item(strF) = mydicTemp
Set mydic(strF) = mydicTemp
End If
'注意下面的两种写法,嵌套字典的字典的键记入,键值为空
'mydic.Item(strF).Item(strS) = ''
mydic(strF)(strS) = ''
Next i
'一级下拉框对应的是第一级字典的键
ComboBox1.List = mydic.keys
End Sub
代码截图:
代码讲解:
1 上述代码利用了字典的嵌套,解决了两级下拉菜单的制作问题,在利用前要先加上一个窗体:
2 '将数据装入数组
myarr = Range('a1').CurrentRegion.Value
上述代码将源数据写入数组中备用
3 Set mydic = CreateObject('Scripting.Dictionary')
上述代码定义外层的字典.
4 For i = 2 To UBound(myarr)
strF = myarr(i, 1)
strS = myarr(i, 2)
If Not mydic.Exists(strF) Then
'建立嵌套字典,第一重字典的键对应的键值为字典
Set mydicTemp = CreateObject('Scripting.Dictionary')
'注意下面的两种写法
'Set mydic.Item(strF) = mydicTemp
Set mydic(strF) = mydicTemp
End If
'注意下面的两种写法,嵌套字典的字典的键记入,键值为空
'mydic.Item(strF).Item(strS) = ''
mydic(strF)(strS) = ''
Next i
上述代码中利用FOR NEXT在数组中建立循环,当Not mydic.Exists(strF),将数据存入字典,键是strF ,键值是一个字典:mydicTemp,如果能够找到外层字典的键,那么将建立内层字典的,即: mydic(strF)(strS)