在VBA中,数组可以用于数据的读取清洗以及整理,而字典则用于数据的分析以及汇总,条件查询等
其中字典(Dictionary)具有独特的属性和方法,但该对象并非VBA内部集成的对象,需要添加引用才可以在VBA中使用
字典对象被集成在Scrrun.dll动态链接库中,在使用前需要先注册该动态链接库
绑定字典有两种方式,一种是前期绑定,另外一种则是后期绑定
前期绑定
在编辑器中,工具→引用→列表中找到"(Microsoft Scripting Runtime)"复选框,勾选确定即可


前期绑定的字段在代码窗口输入代码即可自动列出成员列表
Sub test()Dim Dic As New DictionaryEnd Sub

后期绑定字典
后期绑定指的是通过CreateObject函数创建字典对象的引用
Sub test()Dim Dic As ObjectSet 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 DictionaryDic.Add "ByVba", "每天学习一点点"MsgBox Dic("ByVba")Set Dic = NothingEnd Sub
输出结果

由于字典的关键字Key具有唯一性,如在同一对象中,就不能使用Add方法在此添加相同的关键字,否则会出现以下错误

所以可以这样写 ,直接给字典元素赋值
DicObject(Key)=Item
Sub test()Dim Dic As New DictionaryDic("ByVba") = "每天学习一点点"Dic("ByVba") = "再次添加"MsgBox Dic("ByVba")Set Dic = NothingEnd Sub

注意,如果字典中的关键字Key已存在,则会修改Key的Item值,若果关键字Key不存在则会添加新的关键字Key,如果不需要修改,就需要Exists方法
2.Exists
使用字典的Exists方法可以判断关键字Key是否存在字典中
语法为:
DicObject.Exists(Key)
如下图所示

Sub test()Dim Dic As New DictionaryDim aData, aKey, aItem, intX&aData = Range("A1").CurrentRegionFor intX = 2 To UBound(aData)If Not Dic.Exists(aData(intX, 1)) ThenDic(aData(intX, 1)) = aData(intX, 2)End IfNextaKey = Dic.KeysaItem = Dic.ItemsSet Dic = NothingStopEnd 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 DictionaryDim aData, Mat, intX&aData = Range("A1").CurrentRegionFor intX = 2 To UBound(aData)If Not Dic.Exists(aData(intX, 1)) ThenDic(aData(intX, 1)) = aData(intX, 2)End IfNextDebug.Print "关键字(Key)", vbTab, "条目(Item)"For Each Mat In Dic.KeysDebug.Print Mat, vbTab, Dic(Mat)NextSet Dic = NothingEnd Sub
或者在立即窗口查看

3.Remove
字典中的Remove方法用于删除字典对象中的一个关键字Key以及其对应的条目Item
DicObject.Remove Key
Sub test()Dim Dic As New DictionaryDim aData, aKey, aItem, intX&aData = Range("A1").CurrentRegionFor intX = 2 To UBound(aData)If Not Dic.Exists(aData(intX, 1)) ThenDic(aData(intX, 1)) = aData(intX, 2)End IfNextaKey = Dic.KeysaItem = Dic.ItemsDic.Remove "三星"MsgBox "字典中的关键字三星已" & IIf(Dic.Exists("三星"), "", "不") & "存在"Set Dic = NothingStopEnd Sub

第12行代码使用字典的Remove方法,删除了字典对象中的关键字Key"三星"
4.RemoveAll
当一个字典在循环中需要重复使用的时候,就需要使用到RemoveAll方法
DicObject.RemoveAll
Sub test()Dim Dic As New DictionaryDim aData, aKey, aItem, intX&aData = Range("A1").CurrentRegionFor intX = 2 To UBound(aData)If Not Dic.Exists(aData(intX, 1)) ThenDic(aData(intX, 1)) = aData(intX, 2)End IfNextDic.RemoveAllMsgBox "字典中的还剩 " & Dic.Count & " 条记录"StopSet Dic = NothingEnd Sub
第10行代码中,使用了字典的RemoveAll方法,将字典中的数据一次性清空

第11行使用了字典的Count属性,查看字典中的条数

收工!
如果觉得文章有用,点个赞+在看,你的每一次点赞和转发就是小编原创的动力




