数据处理VBA篇:字典基础概念

字典.jpg

在我们的学习生涯中,每个人或多或少地都用过字典,像新华字典,英语字典等等,所以想必对字典都有印象。我们可以回顾一下,自己是怎么使用字典的?是不是先去检字表查找我们需要解释的字,然后再去字典正文去查找那个字的意思。
在VBA中,也有这么一个字典,它也像我们用过的纸质字典一样,用键值对(key:item)来表示。键可以理解为新华字典检字表中的关键字,而值呢可以理解为对关键字的解释。它也是VBA种的一种对象。
在VBA字典中,有4个属性和6种方法,相对其它的对象要简洁得多,而且容易理解,使用方便,功能强大,运行速度非常快,效率极高,深受大家的喜爱。

字典.png

接下来,我们来分别熟悉一下这些属性和方法。


1. 方法

1.1 Add

向Dictionary对象中添加一个关键字项目对。
object.Add (key,item)
参数
object必选项。总是一个Dictionary对象的名称。
key必选项。与被添加的item相关联的key。
item必选项。与被添加的key相关联的item。

说明
如果key已经存在,那么将导致一个错误。

常用语句:

Dim dic
Set dic = CreateObject("Scripting.Dictionary")
 dic.Add "a", "苹果"
 dic.Add "b", "香蕉"
 dic.Add "c", "雪梨"

代码详解
1、Dim dic:创建变量,也称为声明变量。变量dic声明为可变型数据类型(Variant),dic后面没有写数据类型,默认就是可变型数据类型(Variant)。也有写成Dim dic As Object的,声明为对象。
2、Set dic = CreateObject("Scripting.Dictionary"):创建字典对象,并把字典对象赋给变量dic。
3、dic.Add "a", "苹果":添加一关键字”a”和对应于它的项”苹果”。
4、dic.Add "b", "香蕉":添加一关键字”b”和对应于它的项”香蕉”。
5、dic.Add "c", "雪梨":添加一关键字”c”和对应于它的项”雪梨”。

1.2 Exists

如果Dictionary对象中存在所指定的关键字则返回true,否则返回false。
object.Exists(key)

参数
object必选项。总是一个Dictionary对象的名称。
key必选项。需要在Dictionary对象中搜索的key值。

常用语句:

Dim dic, msg$
  Set dic = CreateObject("Scripting.Dictionary")
  dic.Add "a", "苹果"
 dic.Add "b", "香蕉"
 dic.Add "c", "雪梨"
   If dic.Exists("c") Then
      msg = "指定的关键字已经存在。"
   Else
      msg = "指定的关键字不存在。"
   End If

代码详解
1、Dim dic, msg$:声明变量,dic见前例;msg$声明为字符串数据类型(String),一般写法为Dim msg As String。String的类型声明字符为美元号($)。
2、If dic.Exists("c") Then:如果字典中存在关键字”c”,那么执行下面的语句。
3、msg = "指定的关键字已经存在。":把"指定的关键字已经存在。"字符串赋给变量msg。
4、Else:否则执行下面的语句。
5、msg = "指定的关键字不存在。":把"指定的关键字不存在。"字符串赋给变量msg。
6、End If:结束If …Else…End if判断。

1.3 Keys

返回一个数组,其中包含了一个 Dictionary 对象中的全部现有的关键字。
object.Keys
其中 object 总是一个 Dictionary 对象的名称。
常用语句:

Dim dic, k
  Set dic = CreateObject("Scripting.Dictionary")
  dic.Add "a", "苹果"
 dic.Add "b", "香蕉"
 dic.Add "c", "雪梨"
   k=dic.Keys
   [A1].Resize(dic.Count,1)=Application.Transpose(k)

代码详解
1、Dim dic, k :声明变量,dic见前例;k默认是可变型数据类型(Variant)。
2、k=dic.Keys:把字典中存在的所有的关键字赋给变量k。得到的是一个一维数组,下限为0,上限为d.Count-1。这是数组的默认形式。
3、[A1].Resize(dic.Count,1)=Application.Transpose(k) :Resize是Range对象的一个属性,用于调整指定区域的大小,它有两个参数,第一个是行数,本例是dic.Count,指的是字典中关键字的数量,整本字典中有多少个关键字,本例dic.Count=3,因为有3个关键字。
第二个是列数,本例是1。这样=左边的意思就是:把一个单元格A1调整为以A1开始的一列单元格区域,行数等于字典中关键字的数量d.Count,就是把单元格A1调整为单元格区域A1:A3了。
=右边的k是个一维数组,是水平排列的,我们知道Excel工作表函数里面有个转置函数Transpose,用它可以把水平排列的置换成竖向排列。但是在VBA中不能直接使用该工作表函数,需要通过Application对象的WorksheetFunction属性来使用它。所以完整的写法是Application. WorksheetFunction.Transpose(k),中间的WorksheetFunction可省略。现在可以解释这句代码了:把字典中所有的关键字赋给以B1单元格开始的单元格区域中。

1.4 Items

返回一个数组,其中包含了一个 Dictionary 对象中的所有项目。
object.Items
其中 object 总是一个 Dictionary 对象的名称。

常用语句:

Dim dic, t
   Set dic = CreateObject("Scripting.Dictionary")
   dic.Add "a", "苹果"
   dic.Add "b", "香蕉"
   dic.Add "c", "雪梨"
   t=dic.Items
   [B1].Resize(d.Count,1)=Application.Transpose(t)

代码详解
1、Dim dic, t :声明变量,dic见前例;t默认是可变型数据类型(Variant)。
2、t=dic.Items :把字典中所有的关键字对应的项赋给变量t。得到的也是一个一维数组,下限为0,上限为d.Count-1。这是数组的默认形式。
3、[B1].Resize(d.Count,1)=Application.Transpose(t) :有了上面Keys方法的解释这句代码就不用多说了,就是把字典中所有的关键字对应的项赋给以B1单元格开始的单元格区域中。

1.5 Remove

Remove 方法从一个 Dictionary 对象中清除一个关键字,项目对。
object.Remove(key )
其中 object 总是一个 Dictionary 对象的名称。
key必选项。key 与要从 Dictionary 对象中删除的关键字,项目对相关联。

说明
如果所指定的关键字,项目对不存在,那么将导致一个错误。

常用语句:

Dim dic
   Set dic = CreateObject("Scripting.Dictionary")
   dic.Add "a", "苹果"
   dic.Add "b", "香蕉"
   dic.Add "c", "雪梨"
   ……
   d.Remove(“b”)

代码详解
1、d.Remove(“b”):清除字典中”b”关键字和与它对应的项。清除之后,现在字典里只有2个关键字了。

1.6 RemoveAll

RemoveAll 方法从一个 Dictionary 对象中清除所有的关键字,项目对。
object.RemoveAll
其中 object 总是一个 Dictionary 对象的名称。
常用语句:

Dim d
 Set dic = CreateObject("Scripting.Dictionary")
   dic.Add "a", "苹果"
   dic.Add "b", "香蕉"
   dic.Add "c", "雪梨"
   ……
   d.RemoveAll

代码详解
1、d.RemoveAll:清除字典中所有的数据。也就是清空这字典,然后可以添加新的关键字和项,形成一本新字典。



2.属性

2.1 count

返回一个Dictionary 对象中的条目数。只读属性。
object.Count
其中 object是一个字典对象的名称。
常用语句:

   Dim dic,i%
   Set dic = CreateObject("Scripting.Dictionary")
   dic.Add "1", "苹果"
   dic.Add "2", "香蕉"
   dic.Add "3", "雪梨"
   i = dic.Count

代码详解
1、Dim dic, i% :声明变量;n被声明为整型数据类型(Integer)。一般写法为Dim i As Integer 。 Integer 的类型声明字符为百分比号 (%)。
2、i = dic.Count :把字典中所有的关键字的数量赋给变量n。本例得到的是3。


2.2 key

在Dictionary对象中设置一个key。
object.Key(key) =newkey
参数:object必选项。总是一个字典(Dictionary)对象的名称。
key,必选项。被改变的key值。
newkey,必选项。替换所指定的key的新值。
说明:如果在改变一个key时没有发现该key,那么将创建一个新的key并且其相关联的item被设置为空。
常用语句:

   Dim dic
   Set dic = CreateObject("Scripting.Dictionary")
   dic.Add "1", "苹果"
   dic.Add "2", "香蕉"
   dic.Add "3", "雪梨"
   d.Key("1") = "4"

代码详解:
1、d.Key("1") = "4":用新的关键字”4”来替换指定的关键字”1”,这时,字典中就没有关键字1了,只有关键字4了,与4对应的项是”苹果”。


2.3 item

在一个Dictionary对象中设置或者返回所指定key的item。对于集合则根据所指定的key返回一个item。读/写。
object.Item(key)[ =newitem]

参数
object 必选项。总是一个Dictionary 对象的名称。
key必选项。与要被查找或添加的
item相关联的key。
newitem可选项。仅适用于Dictionary对象;newitem就是与所指定的key相关联的新值。

说明
如果在改变一个key的时候没有找到该item,那么将利用所指定的newitem创建一个新的key。如果在试图返回一个已有项目的时候没有找到key,那么将创建一个新的key且其相关的项目被设置为空。

常用语句:

Dim dic
   Set dic = CreateObject("Scripting.Dictionary")
   dic.Add "1", "苹果"
   dic.Add "2", "香蕉"
   dic.Add "3", "雪梨"
   MsgBox  dic.Item("3")

代码详解
1、dic.Item("3"):获取指定的关键字”3”对应的项。
2、MsgBox :是一个VBA函数,用消息框显示。


2.4 CompareMode属性

设置或者返回在Dictionary对象中进行字符串关键字比较时所使用的比较模式。
object.CompareMode[ =compare]
参数
object必选项。总是一个Dictionary对象的名称。
compare可选项。如果提供了此项,compare就是一个代表比较模式的值。可以使用的值是0 (二进制)、1 (文本), 2 (数据库)。

说明
如果试图改变一个已经包含有数据的Dictionary对象的比较模式,那么将导致一个错误。

常用语句:

Dim dic
   Set dic = CreateObject("Scripting.Dictionary")
   dic.CompareMode = vbTextCompare
   dic.Add "a", "苹果"
   dic.Add "b", "香蕉"
   dic.Add "c", "雪梨"
   dic.Add " B ", " 火龙果"

代码详解
1、dic.CompareMode = vbTextCompare :设置字典的比较模式是文本,在这种比较模式下不区分关键字的大小写,即关键字”b”和”B”是一样的。vbTextCompare的值为1,所以上式也可写为dic.CompareMode =1。如果设置为vbBinaryCompare(值为0),则执行二进制比较,即区分关键字的大小写,此种情况下关键字”b”和”B”被认为是不一样的。
2、dic.Add " B ", " 火龙果":添加一关键字”B”和对应于它的项”火龙果”。由于前面已经设置了比较模式为文本模式,不区分关键字的大小写,即关键字”b”和”B”是一样的,此时发生错误添加失败,因为字典中已经存在”b”了,字典中的关键字是唯一的,不能添加重复的关键字。

下次就讲一点字典的实际运用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容