「VBA」学习系列第18篇
这篇介绍如何用字典对象来对处理树型结构的数据。树型结构的数据可谓到处都是,比如公司的部门设置/人员结构、文件的归类整理和各类统计报表都是一种树型数据结构。如果简单用数组去遍历储存树型结构的数据,你会发现难度很大,因为你无法很方便地确定每一分支下的项目数量。那么字典对象的使用可以规避掉这个问题,从而大大提高处理树型结构数据的效率。
比如下面一张普通的数据表,这是一种典型的简单的常见多树型结构数据:有A/B两个部门,每个部门下有项目经理/高级项目经理两个职位,每个职位下有不同人数的职员,每个职员有基本工资和绩效奖金两个统计指标。
现在我们要把这么一张表装入一个数组或者对象,以方便根据“部门”“职位”和“职员”来获得对应的基本工资和绩效奖金。数据结构如下(部分显示):
那么如何用字典对象来构造这个数据结构呢?VBA程序如下:
代码详解
1、PublicConstDepartment="部门":前面5句是定义5个常数,也就是这张表的5个字段名。这么做只是为了程序的好看和可读性。
2、PublicFunctionParseData():定义一个无参数函数ParseData。
3、arr=[a1].CurrentRegion:单元格对象的CurrentRegion属性,就是将A1:E11这一区域的值赋值给arr数组。
4、SetdTitle=CreateObject("Scripting.Dictionary"):定义一个字典对象dTitle。
5、
Fori=1ToUBound(arr,2)
dTitle(arr(1,i))=i
Next
将5个字段名放入字典对象dTitle,这样循环后dTitle对象的Key就是:部门、职位、职员、基本工资和绩效奖金,Item则是各字段对应的位置:1、2、3、4和5。
6、Setdic=CreateObject("Scripting.Dictionary"):定义一个字典对象dic。
7、Fori=2ToUBound(arr):从arr到第2行开始遍历。
8、
IfNotdic.Exists(arr(i,dTitle(Department)))Then
Setdic(arr(i,dTitle(Department)))=CreateObject("Scripting.Dictionary")
EndIf
SetdTemp=dic(arr(i,dTitle(Department)))
这段VBA的难点所在。当i=2时,arr(i,dTitle(Department))返回arr的第2行第1列的数据“A”,这if语句的意思就是如果“A”不是dic对象的key的话,则把“A”作为key装入dic对象,其对应的item则定义成另一个字典对象,并赋值给dTemp变量。
9、
IfNotdTemp.Exists(arr(i,dTitle(Position)))Then
SetdTemp(arr(i,dTitle(Position)))=CreateObject("Scripting.Dictionary")
EndIf
SetdTemp=dTemp(arr(i,dTitle(Position)))
第8段代码中说明了dTemp是dic对象的item。当i=2时,arr(i,dTitle(Position))返回arr的第2行第2列的数据“项目经理”,这if语句的意思就是如果“项目经理”不是dTemp对象的key的话,则把“项目经理”作为key装入dTemp对象,其对应的item则定义成另一个字典对象,并赋值给dTemp变量。
10、
IfNotdTemp.Exists(arr(i,dTitle(Name)))Then
SetdTemp(arr(i,dTitle(Name)))=CreateObject("Scripting.Dictionary")
EndIf
SetdTemp=dTemp(arr(i,dTitle(Name)))
当i=2时,arr(i,dTitle(Name))返回arr的第2行第3列的数据“李三”,这if语句的意思就是如果“李三”不是dTemp对象的key的话,则把“李三”作为key装入dTemp对象,其对应的item则定义成另一个字典对象,并赋值给dTemp变量。
11、
dTemp(Base)=arr(i,dTitle(Base))
dTemp(Bonus)=arr(i,dTitle(Bonus))
这两句代码的意思是,dTemp对象的key“基本工资”的对应item赋值为arr(i,dTitle(Base)),当i=2时就是李三的基本工资;dTemp对象的key“绩效奖金”的对应item赋值为arr(i,dTitle(Bonus)),当i=2时就是李三的绩效奖金。
12、SetParseData=dic:将已经做好树型结构的数据复制给ParseData变量。
写好自定义函数后,如何使用呢?对于这样一个数据结构,我们调用张三的基本工资就会是这样子的:
SetdicSalary=ParseData()
s=dicSalary("A")("项目经理")("张三")("基本工资")
字典对象来处理树型结构数据是非常重要的应用,当然也是比较难的。如果有问题,欢迎留言一起讨论。
回复“tree”获得Excel的代码源文件。
Veni
赞赏
人赞赏
北京权威白癜风专科白癜风治得好吗