字典对象三树型数据结构

「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

赞赏

人赞赏









































北京权威白癜风专科
白癜风治得好吗



转载请注明:http://www.92nongye.com/zyjs/204618487.html