别怕!VBA中的字典用法,其实也很简单。花5分钟看完,一篇文章全部给你讲清楚!【附案例代码和解释】
一、导读
字典在各种编程语言中,都会被使用,当然在VBA中,字典也是使用频率较高的一种对象。
字典,与数组一样,在VBA中数组属于进阶用法,高级用法。通俗地讲,能理解和熟练使用字典和数组,才能真正理解VBA用于日常办公,数据处理实战的意义。
二、VBA中,为何要使用字典?
1、疑问1,VBA中,数组、字典究竟有何不同,是否有必要2个都掌握?
数组,只相当于一个数据容器,目的是给把处理的数据写入内存,让VBA处理数据的效率得到明显的提速。
字典,与数组的作用不一样,运用字典经常用于处理数据去重,或者数据成对匹配的场景使用。
二者的作用不同,应用场景也不一样。但二者会经常一起出现,才能更高效处理数据。
2、疑问2,字典有哪些特性?
- 第1特性,关键字key值,具体唯一性,同一个字典变量中,不允许存在重复的key值。
- 第2个特性,关键字key与item条目是成对出现,这个是字典特有的关联性,可以通过key值查找到对应的条目Item。item值是可以存在重复的。
字典有6种方法、4种属性。
最常用的是Items、Keys、Exists 3种方法。
最常用的是Item、Key、count 3种属性。
3、疑问3,字典处理后的数据,会返回什么类型?
- 返回值1,可以通过字典d.keys的方法,获取所有关键字kes的集合,是一个一维数组,数组的下标从0开始。
- 返回值2,可以通过字典d.items的方法,获取所有条目Item的集合,是一个一维数组,数组的下标从0开始。
- d.Exists(key)方法,判断字典中是否存在关键字,返回逻辑值True、False;
- 通过Item(key),可以修改1条Item条目的值;
- 通过key(key),可以修改1条Key关键字的值;
- d.count可以返回字典的条目数大小
三、字典,在VBA中有哪些经典的使用场景?
下面通过3个经典案例,详细说明字典在数据处理中的用法。
1、利用字典关键字key的唯一性,如何编写数据去重的小工具?
Sub 字典数据去重()
Dim i%
Dim d As Object '定义字典变量
Dim arr '定义存放待处理数据的数组变量
Dim brr '定义存放处理结果数据的数组变量
Set d = CreateObject("Scripting.Dictionary") '申明1个字典变量
arr = Range("A2:A19") 'A列数据写入数组(多行一列的二维数组),进一步提高数据运行的效率
For i = 1 To UBound(arr) '遍历每个数组里面的值,并写入字典里面,达到数据去重的效果
d(arr(i, 1)) = "" '字典的关键字key:arr(i,1),字典的Item值:赋空值(因为这里不需要做任何一一对应的处理)
brr = d.keys '字典处理的结果是个1行多列的一维数组【注意数组的下标从0开始】
Range("B2").Resize(UBound(brr) + 1, 1) = WorksheetFunction.Transpose(brr) 'brr一维数组,通过函数Transpose转置后,返回给B2开始的单元格区域。
End Sub
代码解释:
Set d = CreateObject("Scripting.Dictionary") :后期绑定字典对象
然后,通过for循环,把存入内存数组arr中的数据,逐个判断并写入字典,如果遇到重复的数据,字典会直接忽略掉,只会保留不重复的数据。
brr = d.keys,通过字典的keys方法,一次性把已写入字典变量d中的所有关键字key,全部存到结果数组中brr。
2、字典在VBA窗口控件中,如何给下拉列表框提供不重复的选项数据?
插入模块,增加以下代码:
Sub 字典用法_给下拉列添加选项()
UserForm1.Show '调用窗口
End Sub
然后插入1个窗体,点击窗体右键查看代码,添加以下的代码:
'窗体代码编辑栏,如下以下的代码:
Private Sub UserForm_Activate()
Dim i%
Dim d As Object '定义字典变量
Dim arr '定义存放待处理数据的数组变量
Dim brr '定义存放处理结果数据的数组变量
Set d = CreateObject("Scripting.Dictionary") '申明1个字典变量
arr = Range("A2:A19") 'A列数据写入数组(多行一列的二维数组),进一步提高数据运行的效率
For i = 1 To UBound(arr) '遍历每个数组里面的值,并写入字典里面,达到数据去重的效果
d(arr(i, 1)) = "" '字典的关键字key:arr(i,1),字典的Item值:赋空值(因为这里不需要做任何一一对应的处理)
brr = d.keys '字典处理的结果是个1行多列的一维数组【注意数组的下标从0开始】
Me.ComboBox1.List = brr
End Sub
代码解释:
前面的代码与案例1数据去重的代码,基本是一样的,后面添加一句代码,把去重的数据作为列表框的数据来源:
brr = d.keys
Me.ComboBox1.List = brr
上面2句,字典变量的关键字,通过brr数组变量保存后,可以直接写入给复合列表框ComboBox1的列表属性list。
3、字典用在数据统计上,如何实现透视表般的统计效果?
Sub 字典用法_统计数据()
Dim i%
Dim d As Object '定义字典变量
Dim arr '定义存放待处理数据的数组变量
Set d = CreateObject("Scripting.Dictionary") '申明1个字典变量
arr = Range("A2:C14") 'A列数据写入数组(多行一列的二维数组),进一步提高数据运行的效率