别怕!VBA中的字典用法,其实也很简单。花5分钟看完,一篇文章全部给你讲清楚!【附案例代码和解释】

别怕!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种属性。

6种方法
4种属性

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的唯一性,如何编写数据去重的小工具?

案例1
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窗口控件中,如何给下拉列表框提供不重复的选项数据?

案例2

插入模块,增加以下代码:

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、字典用在数据统计上,如何实现透视表般的统计效果?

案例3
Sub 字典用法_统计数据()
    Dim i%
    Dim d As Object  '定义字典变量
    Dim arr          '定义存放待处理数据的数组变量
    Set d = CreateObject("Scripting.Dictionary")   '申明1个字典变量
    arr = Range("A2:C14")   'A列数据写入数组(多行一列的二维数组),进一步提高数据运行的效率