在VBA中,数组可以用于数据的读取清洗以及整理,而字典则用于数据的分析以及汇总,条件查询等
其中字典(Dictionary)具有独特的属性和方法,但该对象并非VBA内部集成的对象,需要添加引用才可以在VBA中使用
字典对象被集成在Scrrun.dll动态链接库中,在使用前需要先注册该动态链接库
绑定字典有两种方式,一种是前期绑定,另外一种则是后期绑定
前期绑定
在编辑器中,工具→引用→列表中找到"(Microsoft Scripting Runtime)"复选框,勾选确定即可
前期绑定的字段在代码窗口输入代码即可自动列出成员列表
Sub test()
Dim Dic As New Dictionary
End Sub
后期绑定字典
后期绑定指的是通过CreateObject函数创建字典对象的引用
Sub test()
Dim Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
End Sub
前期绑定和后期绑定的区别
前期绑定,在写代码的时候可以自动列出成员列表,效率也较高些,而且有些属性前期绑定是支持的,而后期绑定则不支持,但是前期绑定的代码并不适合其他人使用,毕竟有些人不知道怎么去绑定,并且编辑器也会检测类库是否丢失,如没找到,将产生编译错误
后期绑定,后期绑定可以自动关联最佳版本的类库,使得代码的兼容性更强些,但在代码运行之前无法确定被引用对象的属性和方法,因此在输入代码时,不会列出成员列表,有些属性无法使用
字典对象的常用方法和属性
字典对象用于保存两个相关联的一维数组,分别以关键字Key组成的关键字列表与对应条目Item组成的元素列表
并且关键字Key具有唯一性,在关键字Key所在代表的数组中,不允许出现重复数据,而条目Item则无此限制
按照以上的解析参数Key可以指定任意数据类型的值,参数Item也可以指定任意数据类型的值,甚至可以是数组、集合或者字典
Add
使用字典对象的Add方法可以将一组关联的关键字(Key)与条目(Item)添加到字典对象中
语法为:
DicObject.Add Key,Item
示例
Sub test()
Dim Dic As New Dictionary
Dic.Add "ByVba", "每天学习一点点"
MsgBox Dic("ByVba")
Set Dic = Nothing
End Sub
输出结果
由于字典的关键字Key具有唯一性,如在同一对象中,就不能使用Add方法在此添加相同的关键字,否则会出现以下错误
所以可以这样写 ,直接给字典元素赋值
DicObject(Key)=Item
Sub test()
Dim Dic As New Dictionary
Dic("ByVba") = "每天学习一点点"
Dic("ByVba") = "再次添加"
MsgBox Dic("ByVba")
Set Dic = Nothing
End Sub
注意,如果字典中的关键字Key已存在,则会修改Key的Item值,若果关键字Key不存在则会添加新的关键字Key,如果不需要修改,就需要Exists方法
2.Exists
使用字典的Exists方法可以判断关键字Key是否存在字典中
语法为:
DicObject.Exists(Key)
如下图所示
Sub test()
Dim Dic As New Dictionary
Dim aData, aKey, aItem, intX&
aData = Range("A1").CurrentRegion
For intX = 2 To UBound(aData)
If Not Dic.Exists(aData(intX, 1)) Then
Dic(aData(intX, 1)) = aData(intX, 2)
End If
Next
aKey = Dic.Keys
aItem = Dic.Items
Set Dic = Nothing
Stop
End Sub
第6行代码使用字典的Exists方法判断以品牌作为关键字的Key是否存在字典中,如果不存在,则添加到字典中,并且相对应的数量作为Item,如果存在则忽略
第10和第11行,分别将Dic字典中所有的关键字Key以及条目Item转换为一维数组
取字典中所有的Key
DicObject=DicObject.Keys
取字典中所有的Item
DicObject=DicObject.Items
在本地窗口中可以看到字典中的所有Key以及Item
Sub test()
Dim Dic As New Dictionary
Dim aData, Mat, intX&
aData = Range("A1").CurrentRegion
For intX = 2 To UBound(aData)
If Not Dic.Exists(aData(intX, 1)) Then
Dic(aData(intX, 1)) = aData(intX, 2)
End If
Next
Debug.Print "关键字(Key)", vbTab, "条目(Item)"
For Each Mat In Dic.Keys
Debug.Print Mat, vbTab, Dic(Mat)
Next
Set Dic = Nothing
End Sub
或者在立即窗口查看
3.Remove
字典中的Remove方法用于删除字典对象中的一个关键字Key以及其对应的条目Item
DicObject.Remove Key
Sub test()
Dim Dic As New Dictionary
Dim aData, aKey, aItem, intX&
aData = Range("A1").CurrentRegion
For intX = 2 To UBound(aData)
If Not Dic.Exists(aData(intX, 1)) Then
Dic(aData(intX, 1)) = aData(intX, 2)
End If
Next
aKey = Dic.Keys
aItem = Dic.Items
Dic.Remove "三星"
MsgBox "字典中的关键字三星已" & IIf(Dic.Exists("三星"), "", "不") & "存在"
Set Dic = Nothing
Stop
End Sub
第12行代码使用字典的Remove方法,删除了字典对象中的关键字Key"三星"
4.RemoveAll
当一个字典在循环中需要重复使用的时候,就需要使用到RemoveAll方法
DicObject.RemoveAll
Sub test()
Dim Dic As New Dictionary
Dim aData, aKey, aItem, intX&
aData = Range("A1").CurrentRegion
For intX = 2 To UBound(aData)
If Not Dic.Exists(aData(intX, 1)) Then
Dic(aData(intX, 1)) = aData(intX, 2)
End If
Next
Dic.RemoveAll
MsgBox "字典中的还剩 " & Dic.Count & " 条记录"
Stop
Set Dic = Nothing
End Sub
第10行代码中,使用了字典的RemoveAll方法,将字典中的数据一次性清空
第11行使用了字典的Count属性,查看字典中的条数
收工!
如果觉得文章有用,点个赞+在看,你的每一次点赞和转发就是小编原创的动力