1、VBA字典用法集锦及代码详解1前言 2一、 字典对象的方法 .3(一) Add 方法 .3(二) Exists 方法 .4(三) Keys 方法 4(四) Items 方法 .5(五) Remove 方法 .6(六) RemoveAll 方法 .6二、 字典对象的属性 .7(一) Count 属性 7(二) Key 属性 7(三) Item 属性 8(四) CompareMode 属性 9VBA字典用法集锦及代码详解2前言凡是上过学校的人都使用过字典,从新华字典、成语词典,到英汉字典以及各种各样数不胜数的专业字典,字典是上学必备的、经常查阅的工具书。有了它们,我们可以很方便的通过查找某个关键字
2、,进而查到这个关键字的种种解释,非常快捷实用。凡是上过 EH 论坛的想学习 VBA 里面字典用法的,几乎都看过研究过 northwolves 狼版主、oobird 版主的有关字典的精华贴和经典代码。我也是从这里接触到和学习到字典的,在此,对他们表示深深的谢意,同时也对很多把字典用得出神入化的高手们致敬,从他们那里我们也学到了很多,也得到了提高。字典对象只有 4 个属性和 6 个方法,相对其它的对象要简洁得多,而且容易理解使用方便,功能强大,运行速度非常快,效率极高。深受大家的喜爱。本文希望通过对一些字典应用的典型实例的代码的详细解释来给初次接触字典和想要进一步了解字典用法的朋友提供一点备查的参
3、考资料,希望大家能喜欢。给代码注释估计是大家都怕做的,因为往往是出力不讨好的,稍不留神或者自己确实理解得不对,还会贻误他人。所以下面的这些注释如果有不对或者不妥当的地方,请大家跟帖时指正批评,及时改正。字典的简介字典(Dictionary)对象是微软 Windows 脚本语言中的一个很有用的对象。附带提一下,有名的正则表达式(RegExp)对象和能方便处理驱动器、文件夹和文件的(FileSystemObject )对象也是微软 Windows 脚本语言中的一份子。字典对象相当于一种联合数组,它是由具有唯一性的关键字(Key)和它的项(Item)联合组成。就好像一本字典书一样,是由很多生字和对它
4、们对应的注解所组成。比如字典的“典”字的解释是这样的:“典”字就是具有唯一性的关键字,后面的解释就是它的项,和 “典”字联合组成一对数据。VBA字典用法集锦及代码详解3常用关键字英汉对照:Dictionary 字典Key 关键字Item 项,或者译为 条目一、 字典对象的方法字典对象的方法有 6 个:Add 方法、Keys 方法、Items 方法、Exists 方法、Remove方法、RemoveAll 方法。(一) Add 方法向 Dictionary 对象中添加一个关键字项目对。object.Add (key, item)参数object :必选项。总是一个 Dictionary 对象的名
5、称。key :必选项。与被添加的 item 相关联的 key。 item :必选项。与被添加的 key 相关联的 item。 说明如果 key 已经存在,那么将导致一个错误。常用语句:Dim d Set d = CreateObject(“Scripting.Dictionary“) d.Add “a“, “Athens“ d.Add “b“, “Belgrade“d.Add “c“, “Cairo“代码详解1、Dim d :创建变量,也称为声明变量。变量 d 声明为可变型数据类型(Variant),d 后面没有写数据类型,默认就是可变型数据类型 (Variant)。也有写成Dim d As
6、Object 的,声明为对象。2、Set d = CreateObject(“Scripting.Dictionary“):创建字典对象,并把字典对象赋给变量 d。这是最常用的一句代码。所谓的 “后期绑定”。用了这句代码就不用先引用 c:windowssystem32scrrun.dll 了。3、d.Add “a“, “Athens“:添加一关键字”a” 和对应于它的项”Athens” 。 4、d.Add “b“, “Belgrade”:添加一关键字”b” 和对应于它的项”Belgrade”。 5、d.Add “c“, “Cairo”:添加一关键字”c” 和对应于它的项”Cairo” 。 VB
7、A字典用法集锦及代码详解4(二) Exists 方法如果 Dictionary 对象中存在所指定的关键字则返回 true,否则返回 false。object.Exists(key) 参数object :必选项。总是一个 Dictionary 对象的名称。 key :必选项。需要在 Dictionary 对象中搜索的 key 值。常用语句:Dim d, msg$ Set d = CreateObject(“Scripting.Dictionary“) d.Add “a“, “Athens“ d.Add “b“, “Belgrade“ d.Add “c“, “Cairo“ If d.Exists(
8、“c“) Then msg = “指定的关键字已经存在。 “ Else msg = “指定的关键字不存在。 “ End If 代码详解1、Dim d,msg$ :声明变量, d 见前例;msg$ 声明为字符串数据类型(String),一般写法为 Dim msg As String。String 类型声明字符为美元号 ($)。2、If d.Exists(“c“) Then:若字典中存在关键字”c” ,那么执行下面的语句。3、msg = “指定的关键字已经存在。“ :把“ 指定的关键字已经存在。“字符串赋给变量 msg。4、Else :否则执行下面的语句。5、msg = “指定的关键字不存在。“
9、:把“ 指定的关键字不存在。“字符串赋给变量 msg。6、End If :结束 If ElseEndif 判断。(三) Keys 方法返回一个数组,其中包含了一个 Dictionary 对象中的全部现有的关键字。object.Keys( ) 其中 object 总是一个 Dictionary 对象的名称。常用语句:Dim d, k Set d = CreateObject(“Scripting.Dictionary“) d.Add “a“, “Athens“ VBA字典用法集锦及代码详解5d.Add “b“, “Belgrade“ d.Add “c“, “Cairo“ k=d.Keys B1.
10、Resize(d.Count,1)=Application.Transpose(k) 代码详解1、Dim d, k :声明变量,d 见前例;k 默认是可变型数据类型(Variant)。2、k=d.Keys:把字典中存在的所有的关键字赋给变量 k。得到的是一个一维数组,下限为 0,上限为 d.Count-1。这是数组的默认形式。3、B1.Resize(d.Count, 1)=Application.Transpose(k) :这句代码是很常用很经典的代码,所以这里要多说一些。Resize 是 Range 对象的一个属性,用于调整指定区域的大小,它有两个参数,第一个是行数,本例是 d.Count,
11、指字典中关键字的数量,整本字典中有多少个关键字,本例 d.Count=3,因为有 3 个关键字。第二个是列数,本例是 1。这样“” 左边的意思就是:把一个单元格 B1 调整为以 B1 开始的一列单元格区域,行数等于字典中关键字的数量 d.Count,就是把单元格 B1 调整为单元格区域B1:B3 了。“” 右边的 k 是个一维数组,是水平排列的,我们知道 Excel 工作表函数里面有个转置函数 Transpose,用它可以把水平排列的置换成竖向排列。但是在 VBA 中不能直接使用该工作表函数,需要通过 Application 对象的 WorksheetFunction 属性来使用它。所以完整的
12、写法是 Application. WorksheetFunction.Transpose(k),中间的WorksheetFunction 可省略。现在可以解释这句代码了:把字典中所有的关键字赋给以 B1 单元格开始的单元格区域中。(四) Items 方法返回一个数组,其中包含了一个 Dictionary 对象中的所有项目。object.Items( )其中 object 总是一个 Dictionary 对象的名称。常用语句:Dim d, t Set d = CreateObject(“Scripting.Dictionary“) d.Add “a“, “Athens“ d.Add “b“, “
13、Belgrade“ d.Add “c“, “Cairo“ VBA字典用法集锦及代码详解6t=d.Items C1.Resize(d.Count,1)=Application.Transpose(t)代码详解1、Dim d, t :声明变量,d 见前例;t 默认是可变型数据类型(Variant)。2、t=d.Items :把字典中所有的关键字对应的项赋给变量 t。得到的也是一个一维数组,下限为 0,上限为 d.Count-1。这是数组的默认形式。3、C1.Resize(d.Count,1)=Application.Transpose(t) :有了上面 Keys 方法的解释这句代码就不用多说了,就
14、是把字典中所有的关键字对应的项赋给以 C1 单元格开始的单元格区域中。(五) Remove 方法Remove 方法从一个 Dictionary 对象中清除一个关键字,项目对。object.Remove(key ) 其中 object 总是一个 Dictionary 对象的名称。key : 必选项。key 与要从 Dictionary 对象中删除的关键字、项目对相关联。 说明如果所指定的关键字,项目对不存在,那么将导致一个错误。常用语句:Dim d Set d = CreateObject(“Scripting.Dictionary“) d.Add “a“, “Athens“ d.Add “b“
15、, “Belgrade“ d.Add “c“, “Cairo“ d.Remove(“b”)代码详解1、d.Remove(“b”):清除字典中 ”b”关键字和与它对应的项。清除之后,现在字典里只有 2 个关键字了。(六) RemoveAll 方法RemoveAll 方法从一个 Dictionary 对象中清除所有的关键字,项目对。object.RemoveAll( ) 其中 object 总是一个 Dictionary 对象的名称。常用语句:Dim d Set d = CreateObject(“Scripting.Dictionary“) VBA字典用法集锦及代码详解7d.Add “a“, “
16、Athens“ d.Add “b“, “Belgrade“ d.Add “c“, “Cairo“ d.RemoveAll代码详解1、d.RemoveAll:清除字典中所有的数据。也就是清空这字典,然后可以添加新的关键字和项,形成一本新字典。二、 字典对象的属性字典对象的属性有 4 个:Count 属性、Key 属性、Item 属性、CompareMode 属性。(一) Count 属性返回一个 Dictionary 对象中的项目数。只读属性。object.Count其中 object 一个字典对象的名称。常用语句:Dim d,n% Set d = CreateObject(“Scripting
17、.Dictionary“) d.Add “a“, “Athens“ d.Add “b“, “Belgrade“ d.Add “c“, “Cairo“ n = d.Count 代码详解1、Dim d, n% :声明变量,d 见前例;n 被声明为整型数据类型 (Integer)。一般写法为 Dim n As Integer 。 Integer 类型声明字符为百分比号 (%)。2、n = d.Count:把字典中所有的关键字的数量赋给变量 n。得到的是 3。(二) Key 属性在 Dictionary 对象中设置一个 key。object.Key(key) = newkey 参数:object :必
18、选项。总是一个字典 (Dictionary) 对象的名称。 key :必选项。被改变的 key 值。 VBA字典用法集锦及代码详解8newkey :必选项。替换所指定的 key 的新值。 说明:如果在改变一个 key 时没有发现该 key,那么将创建一个新的 key 并且其相关联的 item 被设置为空。常用语句:Dim d Set d = CreateObject(“Scripting.Dictionary“) d.Add “a“, “Athens“ d.Add “b“, “Belgrade“ d.Add “c“, “Cairo“ d.Key(“c“) = “d“ 代码详解1、d.Key(“
19、c“) = “d“ :用新的关键字”d” 来替换指定的关键字”c” ,这时,字典中就没有关键字 c 了,只有关键字 d 了,与 d 对应的项是”Cairo”。 (三) Item 属性在一个 Dictionary 对象中设置或者返回所指定 key 的 item。对于集合则根据所指定的 key 返回一个 item。读/写。object.Item(key) = newitem 参数object :必选项。总是一个 Dictionary 对象的名称。 key :必选项。与要被查找或添加的 item 相关联的 key。newitem :可选项。仅适用于 Dictionary 对象;newitem 就是与
20、所指定的 key 相关联的新值。 说明如果在改变一个 key 的时候没有找到该 item,那么将利用所指定的 newitem 创建一个新的 key。如果在试图返回一个已有项目的时候没有找到 key,那么将创建一个新的 key 且其相关的项目被设置为空。常用语句:Dim d Set d = CreateObject(“Scripting.Dictionary“) d.Add “a“, “Athens“ d.Add “b“, “Belgrade“ d.Add “c“, “Cairo“ MsgBox d.Item(“c“) 代码详解1、d.Item(“c“) :获取指定的关键字”c”对应的项。 VB
21、A字典用法集锦及代码详解92、MsgBox :是一个 VBA 函数,用消息框显示。如果要详细了解 MsgBox 函数的,可参见另一篇文章“常用 VBA 函数精选合集”。 (四) CompareMode 属性设置或者返回在 Dictionary 对象中进行字符串关键字比较时所使用的比较模式。object.CompareMode = compare 参数object :必选项。总是一个 Dictionary 对象的名称。compare :可选项。如果提供了此项,compare 就是一个代表比较模式的值。可以使用的值是 0 (二进制)、1 (文本 ), 2 (数据库) 。 说明:如果试图改变一个已经
22、包含有数据的 Dictionary 对象的比较模式,那么将导致一个错误。常用语句:Dim d Set d = CreateObject(“Scripting.Dictionary“) d.CompareMode = vbTextCompare d.Add “a“, “Athens“ d.Add “b“, “Belgrade“ d.Add “c“, “Cairo“ d.Add “ B “, “ Baltimore“ 代码详解1、d.CompareMode = vbTextCompare :设置字典的比较模式是文本,在这种比较模式下不区分关键字的大小写,即关键字”b”和”B” 是一样的。 vbTextCompare 的值为1,所以上式也可写为 d.CompareMode =1 。如果设置为 vbBinaryCompare(值为 0) ,则执行二进制比较,即区分关键字的大小写。2、d.Add “ B “, “ Baltimore“ :添加一关键字”B”和对应于它的项 ”Baltimore”。由于前面已经设置了比较模式为文本模式,不区分关键字的大小写,即关键字”b”和”B” 是一样的,此时发生错误添加失败,因为字典中已经存在”b”了,字典中的关键字是唯一的,不能添加重复的关键字。