作者 : 金人瑞(郑广学Excel VBA 175例实战教程学员)
本人为个人学习阶段性总结,如有错漏欢迎指正,希望可以帮助VBA初学者更好地理解字典
本文要点
(1)字典基础说明.
(2)字典的使用示例
(3)基本的字典封装(由于水平有限怕弄巧成拙,这里只提供最基础的部分,想学高级封装推荐excel880网站站长郑广学的教程)
一 字典的基础说明:
字典到底是个啥?不多说上图
我们把以上单元格填装至字典中,探求一下字典的特性,代码如下,使用字典有两种方法,新手推荐第一种,勾选:工具>>>引用>>>Microsoft Scripting Runtime,如下图.第二种方法看图二.字典如何填装图二中的代码
图一: 勾选:工具>>>引用>>>Microsoft Scripting Runtime
图二:字典的基本填装方法的代码:总结如下图
总结一下:
其实总共也就两步.核心问题是字典能将关键字和值一一对应,这也就是字典的第一大优点:方便调阅数据.这也是新手学习如何使用字典的时候必须要思考的课题之一:如何发挥字典关键字和值之间一一对应的特点(一组关键字和值对应以后,在字典里被称为条目).
接下来我们来看看字典填装以后有什么效果呢?我们先了解一下字典的常用属性方法
图三,字典的exists方法说明 :写法”字典.existe(关键字)”返回一个布尔值
图四:字典。 Exists(关键字)>>>返回一个布尔值确定字典中是否存在该关键字
我们现在通过监视窗口观察一下字典,字典中有Keys方法和Items方法,他们用法相似,都是返回一个一维数组,只不过Keys方法返回的是关键字数组,Items方法返回的是值数组.
通过监视窗口观察一下keys和items
图五:数据
可以观察到图五中关键字部分是有重复的,但是装入字典以后重复值并不重新填入,14条数据最终只填入了七条,且关键字之间不存在重复数据,这也是字典的第二个特点:关键字不重复,通常可以利用这个属性我们能去重,汇总,计数等
我们现在利用监视窗口来观察一下这些属性究竟是什么类型,有什么规则特点:
图六:监视窗口直接观察字典,数据不重复
图七:监视窗口观察字典的keys,关键字
从监视窗口来看,”字典.keys”返回的是一个0下标的一维数组,里面都是关键字。利用这个特点我们可以取出关键字的数据,也可以构建循环批量处理数据,同时也可以利用数组下标获取字典的条目数(一般获取字典的条目数可以利用count属性)。然后我们在观察一下数组里面的数据,我们可以清楚的看到,关键字都是不重复的数据,这就引发了一个思考,那些重复的数据字典里面做了什么处理呢?我们接下来看items属性。
图八:监视窗口观察字典的items属性演示
这是值数组,同样是一个0下标一维数组,我们观察下面的数据,星期一是116,并不是106,星期二是101,并不是116,这就说明字典是一一对应的,但是有一个特点:关键字于值之间的对应关系字典会采用最新的对应关系,通过这个特点我们其实可以利用累加的方式来汇总和计数。
例如:按循环的顺序,周一初始对应的是108,后面对应的是116,在字典里只取最后的对应关系,如果要取最初的对应关系,倒过来循环即可.
图九: RemoveAll方法用来清除字典所有数据.
一般RemoveAll方法用于字典重置,可以观察到监视窗口里面字典已经清空了. Remove 方法是清除单个关键字,写法是:”字典.Remove(关键字)”,关键字不存在就会出现一个错误
讲完了keys和items两种方法,我们就可以对比了解一下key属性和item属性,不多说,上图
图十:item属性的使用方法
Item属性和items方法区别很大,item属性总结起来其实是添加修改字典的对应目,items则返回一个结果数组
同样,key属性其实是用于修改关键字的,但是与item不同的是,key修改关键字,关键字不存在的话会报错.写法” 字典.Key(旧关键字) = 新关键字”
还有其他方法属性,个人用得不多就不说了。
接下来我们封装一下字典,代码如下,大家不需要了解代码的执行过程,只需要知道丢进去什么参数,传出来什么结果就好.
''***************************************************************************Public Function 计数字典填装(allar, Col As String)Dim alldic '创建字典,采用引用法 Set alldic = CreateObject("Scripting.Dictionary")'Dim alldic As New Dictionary '(勾选引用法)'1/字典两法Dim n As Integer'2/n为总数据数组的行数 n = UBound(allar, 1)'3/数组下标取出, 方便循环,字典装填Dim ckey ckey = Split(Col, ",") '一个关键字列号数组'4/构建一个一维数组,并将关键字所在数组的列号导入其中Dim key As String'5/钥匙关键字的定义,方便关键字数据导入 For i = 1 To n'6/双循环填充,第一层循环从数组的第一行到最后一行,用于数组数据导入字典 For g = LBound(ckey) To UBound(ckey)'7/双循环填充,第二层循环从ckey数组上下标开始,将关键字各字段拼接 key = key & allar(i, ckey(g)) Next'8/第一层循环结束后再开始add字典,将拼接好的关键字和数组行号对应,下方累积计数,也可以求和,记录行号等 alldic(key) = alldic(key) + 1'9/key字段重 置为空,避免将多行字段拼接.好大一过坑!!!!!!!!!!!!! key = "" Next'9/字典的填充完毕 Set 计数字典填装 = alldic'10/字典导出End Function'***************************************************************************
用法如下
函数使用方法:计数字典填装(需要装入字典的数据数组, 关键字段列)>>>>>返回一个计数字典(可以修改为求和汇总字典,查阅数据的行号字典等字典)
函数封装化的结果很明显,我们可以随时调用.不需要再造轮子,可以节约大量时间不过以上就是个例子过于简单,现实中有更复杂的函数,我们其实在很多时候是不需要了解运行过程的,只需要知道传入什么数据,传出什么结果就行,毕竟开车方便快捷,但是总不能会开车的都会造车,开车之前都要造车吧?
以上就是字典常用方法的说明,这儿需要提一点,数组中的元素其实也是可以是数组和字典的,这就是字典嵌套数组,字典嵌套字典,他们能处理更为复杂的数据,能构成更为复杂的数据调阅系统,但是由于笔者水平一般,文章篇幅限制以及技术难度稍大不易吸收就不做阐述