VBA编程技巧之字典对象使用经验谈

上传人:博****1 文档编号:503811285 上传时间:2022-08-24 格式:DOC 页数:22 大小:190.50KB
返回 下载 相关 举报
VBA编程技巧之字典对象使用经验谈_第1页
第1页 / 共22页
VBA编程技巧之字典对象使用经验谈_第2页
第2页 / 共22页
VBA编程技巧之字典对象使用经验谈_第3页
第3页 / 共22页
VBA编程技巧之字典对象使用经验谈_第4页
第4页 / 共22页
VBA编程技巧之字典对象使用经验谈_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《VBA编程技巧之字典对象使用经验谈》由会员分享,可在线阅读,更多相关《VBA编程技巧之字典对象使用经验谈(22页珍藏版)》请在金锄头文库上搜索。

1、VBA编程技巧 之 字典对象使用经验谈(更新至四之一)字典对象使用经验谈目录前言_01 楼一、字典的基本功能_01 楼二、The Hardcore of Dictionary_02 楼二之一、多层字典对象应用案例分析 1 _16 楼二之二、多层字典对象应用案例分析 2 _30 楼三之一、动态的树形数据结构的构建_35 楼三之二、动态树形结构的遍历_54 楼三之三、送你把漂亮的解牛小刀_64 楼三之四、上帝的归上帝,凯撒的归凯撒_66 楼四之一、利用字典动态的构建自定义数据类型_68 楼前言 相信大家对字典对象已经是耳熟能详了。现在帮人写个代码如果不来个字典,出门都不好意思和人打招呼。EH里也有

2、大量的帖子详尽的介绍了字典对象的功能和各种使用方法,我大致翻过这些帖子,感觉很有必要和大家交流一下最近一段时间泡坛子、帮人家写代码得到的一些心得体会。可能更多的会聊一些编程思路的东西,所以我想这篇文章应该是给有一定基础的朋友看的,起码应该能不需要注释就能看懂代码,起码应该看过置顶贴里提到的那些帖子。一、字典的基本功能 相信字典对象最为出名的是它的关键字不重复特性,我们经常会看到这样的语句:For i=0 to UBound(arr) dic(arr(i,1)=Next 这段语句唯一的作用就是将数组的第一列数据去掉了重复项。但值得强调的是既然我们叫它字典对象,那么它就理所应当的具有翻译功能。 以

3、一个典型的EXCEL数据表为例,很多情况下会是类似于一个数据库中 表 这样的一个结构,即具有第一行的表头部分定义了每一列的内容是什么,其下每一行都是一条单独的纪录。那么这种情况下,我们完全可以用字典对象来创建由表头来翻译索引列号。这至少带来两个好处,1、使得你的代码更具有可看性,或则说更像自然语言;2、使得你的代码不会依赖于表格的地理位置,也就是说即便出于某种原因列的顺序有了变动,你也不需要去找出你的代码里涉及到相应列号并逐一改正。其实,更重要的一点,是你的代码会具有更大的适用性。 让我们来比较两段代码,设想我们需要读取一个月工资表并统计各班组的绩效奖金,其包含 姓名、班组、工位、基本工资、绩

4、效奖金等等信息,那么可能的代码会是这样的: 复制内容到剪贴板 代码:Dim dic, arr, i&, lRow&lRow = Sheet1.a65536.End(xlUp).Rowarr = Sheet1.Range(a2:e & lRow)Set dic = CreateObject(Scripting.Dictionary)For i = 1 To UBound(arr) dic(arr(i, 2) = dic(arr(i, 2) + dic(arr(i, 5)Next=Dim dTitle, arr, i&, dicarr = Sheet1.a1.CurrentRegionSet dT

5、itle = CreateObject(Scripting.Dictionary)For i = 1 To UBound(arr, 2) dTitle(arr(1, i) = iNextSet dic = CreateObject(Scripting.Dictionary)For i = 2 To UBound(arr) dic(arr(i, dTitle(班组) = dic(arr(i, dTitle(班组) + arr(i, dTitle(绩效奖金)Next第二段代码我们使用了一个名为dTitle的字典对象来记录表头名称和对应列号,这样当我们需要使用某列数据的时候,我们可以使用这个对象来将

6、表头名翻译成列号。很明显的是第一段代码完全依赖于表格内容的地理位置,而且如果不去看数据表的话,你根本不知道它在干什么。而相应的,对于第二段代码而言,我们完全可以不用去了解数据表是什么样的,只需要知道它有这样的两个表头就可以了。并且你不觉得它很接近自然语言了吗?哦,不吗,你确定?那我再稍微改一下: 复制内容到剪贴板 代码:数据 = Sheet1.a1.CurrentRegionSet 表头之列号 = CreateObject(Scripting.Dictionary)For i = 1 To UBound(数据, 2) 表头之列号(数据(1, i) = iNextSet 班组绩效奖金 = Cre

7、ateObject(Scripting.Dictionary)For i = 2 To UBound(数据) 班组名 = 数据(i, 表头之列号(班组) 成员绩效奖金 = 数据(i, 表头之列号(绩效奖金) 班组绩效奖金(班组名) = 班组绩效奖金(班组名) + 成员绩效奖金Next如果出于某些原因,原来的那个工资表在绩效奖金之前增加了一列,比如说老板大发善心为大家增发了住房津贴,显然作为劳资统计的你不会希望把它给漏了。那么这时,如果你的代码是前面第一种方法,那么你必须仔细检查你的代码,确保每一个数字对应的列是你需要的内容。但是如果你非常幸运的看过了这篇文章,并且使用了第二种方法,恭喜你,你不

8、用像前者那样心惊胆颤的一个个数列数了,开开心心的在一边数钱吧!可能有看官说了:嘿,我们老板才烦呢,他不会加发工资的,他会把那个绩效奖金的名字改成工作表现奖!你瞧,这下你要去改代码了吧。那么这里我想说的是,养成良好的编程习惯,使用常量设置。如果你经常写代码的话,你肯定会碰到前面这位看官提到的情况,那么你就会知道使用常量设置是多么方便的事情。千万不要为了少敲键盘而省略这个过程,我们要牢记我军的优良训练传统:训练多流汗,战时少流血!编写多常量,更改不挠头!想想还是把代码写出来看看效果吧: 复制内容到剪贴板 代码:Public Const PR_SALARY_GROUP = 班组Public Cons

9、t PR_SALARY_BONUS = 绩效奖金.Dim dTitle, arr, i&, dicarr = Sheet1.a1.CurrentRegionSet dTitle = CreateObject(Scripting.Dictionary)For i = 1 To UBound(arr, 2) dTitle(arr(1, i) = iNextSet dic = CreateObject(Scripting.Dictionary)For i = 2 To UBound(arr) dic(arr(i, dTitle(PR_SALARY_GROUP) = _ dic(arr(i, dTit

10、le(PR_SALARY_GROUP) + arr(i, dTitle(PR_SALARY_BONUS)Next二、The Hardcore of Dictionary 琢磨了半天,还真没想出什么中文词来表达Hardcore比较合适。(题外话,不建议去Google搜索这个关键字,但相信我这个词本身没有任何相关的含义,真的是个好词。) 我们知道字典对象由关键字 Key 和数据项 Item 构成。通常情况下 Key 是字符串,实际上也可以是其它数据类型,比如整数、小数等。而数据项则可以是任何数据类型,包括字典对象本身。这样我们就可以创建多层的字典对象了。利用多层字典对象,我们可以实现诸如级联菜单、

11、联动数据有效性序列、联动下拉框等等应用,这也常见于坛子里各个帖子。这里我不想重复谈这些应用,而是想着重强调其背后隐藏的一个概念。 我们到底用字典作了什么?一言以蔽之,所谓的多层字典,实际上你利用它构造了一个树型数据结构! 坛子里也有很多帖子在介绍TreeView这个控件,它和我们的多层字典何其相似。让我们还是以上面那个工资表来作为例子,我们可能希望把它处理成这样的一个形式: 复制内容到剪贴板 代码:Public Const PR_SALARY_GROUP = 班组Public Const PR_SALARY_POSITION = 工位Public Const PR_SALARY_NAME =

12、姓名Public Const PR_SALARY_BASE = 基本工资Public Const PR_SALARY_BONUS = 绩效奖金Public Function ParseData() Dim dTitle, arr, i&, dic, dTemp arr = Sheet1.a1.CurrentRegion Set dTitle = CreateObject(Scripting.Dictionary) For i = 1 To UBound(arr, 2) dTitle(arr(1, i) = i Next Set dic = CreateObject(Scripting.Dict

13、ionary) For i = 2 To UBound(arr) If Not dic.Exists(arr(i, dTitle(PR_SALARY_GROUP) Then _ Set dic(arr(i, dTitle(PR_SALARY_GROUP) = CreateObject(Scripting.Dictionary) Set dTemp = dic(arr(i, dTitle(PR_SALARY_GROUP) If Not dTemp.Exists(arr(i, dTitle(PR_SALARY_POSITION) Then _ Set dTemp(arr(i, dTitle(PR_

14、SALARY_POSITION) = CreateObject(Scripting.Dictionary) Set dTemp = dTemp(arr(i, dTitle(PR_SALARY_POSITION) If Not dTemp.Exists(arr(i, dTitle(PR_SALARY_NAME) Then _ Set dTemp(arr(i, dTitle(PR_SALARY_NAME) = CreateObject(Scripting.Dictionary) Set dTemp = dTemp(arr(i, dTitle(PR_SALARY_NAME) dTemp(PR_SALARY_BASE) = arr(i, dTitle(PR_SALARY_BASE) dTemp(PR_SALARY_BONUS) = arr(i, dTitle(PR_SALARY_BONUS)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号