EXCEL VBA 常见字典用法集锦及代码详解全.docx
- 文档编号:14937436
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:71
- 大小:5.10MB
EXCEL VBA 常见字典用法集锦及代码详解全.docx
《EXCEL VBA 常见字典用法集锦及代码详解全.docx》由会员分享,可在线阅读,更多相关《EXCEL VBA 常见字典用法集锦及代码详解全.docx(71页珍藏版)》请在冰点文库上搜索。
EXCELVBA常见字典用法集锦及代码详解全
常见字典用法集锦及代码详解
前言
凡是上过学校的人都使用过字典,从新华字典、成语词典,到英汉字典以及各种各样数不胜数的专业字典,字典是上学必备的、经常查阅的工具书。
有了它们,我们可以很方便的通过查找某个关键字,进而查到这个关键字的种种解释,非常快捷实用。
凡是上过EH论坛的想学习VBA里面字典用法的,几乎都看过研究过northwolves狼版主、oobird版主的有关字典的精华贴和经典代码。
我也是从这里接触到和学习到字典的,在此,对他们表示深深的谢意,同时也对很多把字典用得出神入化的高手们致敬,从他们那里我们也学到了很多,也得到了提高。
字典对象只有4个属性和6个方法,相对其它的对象要简洁得多,而且容易理解使用方便,功能强大,运行速度非常快,效率极高。
深受大家的喜爱。
本文希望通过对一些字典应用的典型实例的代码的详细解释来给初次接触字典和想要进一步了解字典用法的朋友提供一点备查的参考资料,希望大家能喜欢。
给代码注释估计是大家都怕做的,因为往往是出力不讨好的,稍不留神或者自己确实理解得不对,还会贻误他人。
所以下面的这些注释如果有不对或者不妥当的地方,请大家跟帖时指正批评,及时改正。
字典的简介
字典(Dictionary)对象是微软Windows脚本语言中的一个很有用的对象。
附带提一下,有名的正则表达式(RegExp)对象和能方便处理驱动器、文件夹和文件的(FileSystemObject)对象也是微软Windows脚本语言中的一份子。
字典对象相当于一种联合数组,它是由具有唯一性的关键字(Key)和它的项(Item)联合组成。
就好像一本字典书一样,是由很多生字和对它们对应的注解所组成。
比如字典的“典”字的解释是这样的:
“典”字就是具有唯一性的关键字,后面的解释就是它的项,和“典”字联合组成一对数据。
.
常用关键字英汉对照:
字典Dictionary
关键字Key
条目Item项,或者译为
方法、Items字典对象的方法有6个:
Add方法、Keys方法、方法、ExistsRemove方法、RemoveAll方法。
Add方法向Dictionary对象中添加一个关键字项目对。
object.Add(key,item)
参数object
必选项。
总是一个Dictionary对象的名称。
key
必选项。
与被添加的key。
item相关联的
item
。
key相关联的item必选项。
与被添加的
说明已经存在,那么将导致一个错误。
如果key
常用语句:
Dimd
Setd=CreateObject(Scripting.Dictionary)
d.Adda,Athens
d.Add,Belgrade
d.Addc,Cairo
代码详解声明为可变型数据类型:
创建变量,也称为声明变量。
变量1、dDimd
d。
也有写成Dim,d后面没有写数据类型,默认就是可变型数据类型(Variant)(Variant)AsObject的,声明为对象。
:
创建字典对象,并把字典对象赋给、Setd=CreateObject(Scripting.Dictionary)2。
用了这句代码就不用先引用d。
这是最常用的一句代码。
所谓的“后期绑定”变量c:
\windows\system32\scrrun.dll了。
、?
摁?
慜?
尠瑁敨獮:
添加一关键字”a”和对应于它的项”Athens”。
3
4、d.Add,“Belgrade”:
添加一关键字”b”和对应于它的项”Belgrade”。
5、d.Addc,“Cairo”:
添加一关键字”c”和对应于它的项”Cairo”。
方法Exists如果Dictionary对象中存在所指定的关键字则返回true,否则返回false。
object.Exists(key)
参数object
必选项。
总是一个Dictionary对象的名称。
key
必选项。
需要在Dictionary对象中搜索的key值。
常用语句:
Dimd,msg$
Setd=CreateObject(Scripting.Dictionary)
d.Adda,Athens
d.Add,Belgrade
d.Addc,Cairo
Ifd.Exists(c)Then
獭?
?
指定的关键字已经存在。
Else
指定的关键字不存在。
獭?
?
EndIf
代码详解,一Dimd,msg$(String):
声明变量,d见前例;msg$声明为字符串数据类型、1的类型声明字符为美元号($)。
般写法为DimmsgAsString。
String,那么执行下面的语句。
:
如果字典中存在关键字”c”Ifd.Exists(c)Then2、字符串赋给:
把指定的关键字已经存在。
3、msg=指定的关键字已经存在。
。
变量msg4、Else:
否则执行下面的语句。
字符串赋给变量指定的关键字不存在。
:
把msg5、=指定的关键字不存在。
msg。
判断。
…:
结束EndifIf…ElseEndIf6、
Keys方法
返回一个数组,其中包含了一个Dictionary对象中的全部现有的关键字。
object.Keys()
其中object总是一个Dictionary对象的名称。
常用语句:
Dimd,k
Setd=CreateObject(Scripting.Dictionary)
3
d.Adda,Athens
d.Add,Belgrade
d.Addc,Cairo
k=d.Keys
[B1].Resize(d.Count,1)=Application.Transpose(k)
代码详解d、Dimd,k:
声明变量,见前例;k默认是可变型数据类型(Variant)。
1。
得到的是一个一维数2k、k=d.Keys:
把字典中存在的所有的关键字赋给变量0组,下限为,上限为d.Count-1。
这是数组的默认形式。
:
这句代码是很常用很经典的3、[B1].Resize(d.Count,1)=Application.Transpose(k)
代码,所以这里要多说一些。
对象的一个属性,用于调整指定区域的大小,它有两个参数,第Resize是Range,指的是字典中关键字的数量,整本字典中有多少个关键一个是行数,本例是d.Count个关键字。
呵呵,是不是说多了。
,因为有3字,本例d.Count=3B1B1调整为以第二个是列数,本例是1。
这样=左边的意思就是:
把一个单元格调整B1,就是把单元格开始的一列单元格区域,行数等于字典中关键字的数量d.Count了。
为单元格区域B1:
B3工作表函数里面有个转Excel=右边的k是个一维数组,是水平排列的,我们知道中不能直接使,用它可以把水平排列的置换成竖向排列。
但是在置函数TransposeVBA属性来使用它。
所以Application对象的WorksheetFunction用该工作表函数,需要通过可,中间的WorksheetFunction完整的写法是Application.WorksheetFunction.Transpose(k)单元格开始的单元省略。
现在可以解释这句代码了:
把字典中所有的关键字赋给以B1格区域中。
Items方法对象中的所有项目。
返回一个数组,其中包含了一个Dictionary
object.Items()
Dictionaryobject其中总是一个对象的名称。
常用语句:
Dimd,t
Setd=CreateObject(Scripting.Dictionary)
d.Adda,Athens
d.Add,Belgrade
d.Addc,Cairo
t=d.Items
[C1].Resize(d.Count,1)=Application.Transpose(t)
代码详解1、Dimd,t:
声明变量,d见前例;t默认是可变型数据类型(Variant)。
。
得到的也是一个一维t:
把字典中所有的关键字对应的项赋给变量t=d.Items、2.
d.Count-1数组,下限为0,上限为。
这是数组的默认形式。
方法的解释这Keys3、[C1].Resize(d.Count,1)=Application.Transpose(t):
有了上面单元格开始的单C1句代码就不用多说了,就是把字典中所有的关键字对应的项赋给以元格区域中。
Remove方法Remove方法从一个Dictionary对象中清除一个关键字,项目对。
object.Remove(key)
object总是一个对象的名称。
Dictionary其中
key
Dictionary对象中删除的关键字,项目对相关联。
必选项。
key与要从说明如果所指定的关键字,项目对不存在,那么将导致一个错误。
常用语句:
Dimd
Setd=CreateObject(Scripting.Dictionary)
d.Adda,Athens
d.Add,Belgrade
d.Addc,Cairo
……
)b”d.Remove(“代码详解现在字典里,”、d.Remove(“b”):
清除字典中b”关键字和与它对应的项。
清除之后1个关键字了。
只有2
RemoveAll方法RemoveAll方法从一个Dictionary对象中清除所有的关键字,项目对。
object.RemoveAll()
Dictionary对象的名称。
object总是一个其中常用语句:
Dimd
Setd=CreateObject(Scripting.Dictionary)
d.Adda,Athens
d.Add,Belgrade
d.Addc,Cairo
……
d.RemoveAll
代码详解
5
:
清除字典中所有的数据。
也就是清空这字典,然后可以添加新1、d.RemoveAll的关键字和项,形成一本新字典。
属CompareMode属性、Item属性、字典对象的属性有4个:
Count属性、Key性。
属性Count返回一个Dictionary对象中的项目数。
只读属性。
object.Count
一个字典对象的名称。
其中object常用语句:
Dimd,n%
Setd=CreateObject(Scripting.Dictionary)
d.Adda,Athens
d.Add,Belgrade
d.Addc,Cairo
n=d.Count
代码详解。
一般写(Integer)d,n%:
声明变量,d见前例;n被声明为整型数据类型、1Dim
的类型声明字符为百分比号(。
%)法为DimnAsInteger。
Integer3:
把字典中所有的关键字的数量赋给变量n。
本例得到的是。
2、n=d.Count
Key属性对象中设置一个。
key在Dictionary
object.Key(key)=newkey
参数:
object
(Dictionary)对象的名称。
必选项。
总是一个字典key
值。
key必选项。
被改变的
newkey
key必选项。
替换所指定的的新值。
说明并且其相关联key,那么将创建一个新的keykey如果在改变一个时没有发现该
item被设置为空。
的
常用语句:
Dimd
Setd=CreateObject(Scripting.Dictionary)
d.Adda,Athens
d.Add,Belgrade
d.Addc,Cairo
d.Key(c)=d
代码详解,这时,字典中就”c”1、d.Key(c)=d:
用新的关键字”d”来替换指定的关键字。
没有关键字c了,只有关键字d了,与d对应的项是”Cairo”
Item属性。
对于集合则根据所item在一个Dictionary对象中设置或者返回所指定key的
指定的key返回一个item写。
。
读/object.Item(key)[=newitem]
参数object
必选项。
总是一个Dictionary对象的名称。
key
必选项。
与要被查找或添加的item相关联的key。
newitem
相关联的新keyDictionary对象;newitem就是与所指定的可选项。
仅适用于值。
说明创newitemitem,那么将利用所指定的如果在改变一个key的时候没有找到该,那么将创建一个。
如果在试图返回一个已有项目的时候没有找到keykey建一个新的
key且其相关的项目被设置为空。
新的常用语句:
Dimd
Setd=CreateObject(Scripting.Dictionary)
d.Adda,Athens
d.Add,Belgrade
d.Addc,Cairo
MsgBoxd.Item(c)
代码详解对应的项。
”、d.Item(c):
获取指定的关键字”1c函MsgBox:
是一个VBA函数,用消息框显示。
如果要详细了解2、MsgBox
-387253-1-1.html
函数精选合集”VBA。
数的,可参见我的另一篇文章“常用
CompareMode属性
设置或者返回在Dictionary对象中进行字符串关键字比较时所使用的比较模式。
object.CompareMode[=compare]
参数
7
object
对象的名称。
必选项。
总是一个Dictionary
compare
就是一个代表比较模式的值。
可以使用的值可选项。
如果提供了此项,compare
1(0(二进制)、文本),2(数据库)。
是
说明对象的比较模式,那么将导致一Dictionary如果试图改变一个已经包含有数据的
个错误。
常用语句:
Dimd
Setd=CreateObject(Scripting.Dictionary)
d.CompareMode=vbTextCompare
d.Adda,Athens
d.Add,Belgrade
d.Addc,Cairo
d.AddB,Baltimore
代码详解:
设置字典的比较模式是文本,在这种比较1、d.CompareMode=vbTextCompare
的值为vbTextCompare”是一样的。
b””和”B模式下不区分关键字的大小写,即关键字,0)(值为d.CompareMode=1。
如果设置为vbBinaryCompare1,所以上式也可写为
”B被认为是不一b”和”则执行二进制比较,即区分关键字的大小写,此种情况下关键字”样的。
2、d.AddB,Baltimore:
添加一关键字”B”和对应于它的项”Baltimore”。
由于前面已经设置了比较模式为文本模式,不区分关键字的大小写,即关键字”b”和”B”是一样的,此时发生错误添加失败,因为字典中已经存在”b”了,字典中的关键字是唯一的,不能添加重复的关键字。
实例1普通常见的求不重复值问题
一、问题的提出:
表格中人员有很多是重复的,要求编写一段代码,把重复的人员姓名以及重复的次数求出来,复制到另一个表格中。
如图实例1-1所示。
-637004-1-1.html
论坛网址:
1-1图实例
二、代码:
Subcfz()
Dimi&,Myr&,Arr
Dimd,k,t
Setd=CreateObject(Scripting.Dictionary)
Myr=Sheet1.[a65536].End(xlUp).Row
Arr=Sheet1.Range(a1:
g&Myr)
Fori=2ToUBound(Arr)
d(Arr(i,3))=d(Arr(i,3))+1
Next
k=d.keys
t=d.items
Sheet2.Activate
[a2].Resize(d.Count,1)=Application.Transpose(k)
9
Application.Transpose(t)=[b2].Resize(d.Count,1)
)重复个数姓名=牁慲?
[a1].Resize(1,2)
Nothing=Setd
Sub
End
三、代码详解Myr也可以写为Dim:
变量1、i和Myr声明为长整型变量。
ArrMyr&,i&,Dim
后面没有写明数据类型,默认就是可变型&)Arr。
。
AsLongLong的类型声明字符为(。
数据类型(Variant):
创建字典对象,并把字典对象赋给Setd=CreateObject(Scripting.Dictionary)2、。
用了这句代码就不用先引用。
这是最常用的一句代码。
所谓的“后期绑定”变量d了。
c:
\windows\system32\scrrun.dll列最后一行不为空白的行1:
把表的A3、Myr=Sheet1.[a65536].End(xlUp).Row
xlUp属性,它有4个方向参数,此处的数赋给变量Myr。
这里用了Range对象的End;xlDown表示向下,它的值为43表示向上,它的值为,所以也可写成End(3)。
表示向右,它的值为2。
xlToLeft表示向左,它的值为1;xlToRight到GArr列最后一行不为空白的=Sheet1.Range(a1:
g&Myr):
把表1的A14、就是个二维数组了,用数组替代单元格引用可。
这样Arr单元格区域的值赋给变量Arr对执行代码的速度提高很多很多。
开始到数组的最大上界循环结构,从2UBound(Arr)i=2To:
For…5、ForNext函数,返回数组的指定维数的是VBA值之间循环。
因为数组的第一行是表头。
Ubound最大可用上界。
在本例是姓名列,也就是关键字列,举个Arr(i,3)、6d(Arr(i,3))=d(Arr(i,3))+1:
等于加入字典,d(key)张三”,这句代码的意思就是把关键字”张三”例子,假如”Arr(i,3)=。
起到了按关键字1关键字key对应的项,每出现一次这个关键字,它的项的值就增加累加的作用,也正因为有这个作用,所以可使用字典来进行各种汇总统计。
后面要讲的实例会充分的展现这个作用。
。
得到的是一个一维数k中存在的所有的关键字赋给变量7、k=d.keys:
把字典d是字典的方法,前面已经讲过了。
0,上限为d.Count-1。
Keys组,下限为。
得到的也是中存在的所有的关键字对应的项赋给变量t=d.items:
把字典dt8、也是字典的方法,前面也已经讲过Items0,上限为d.Count-1。
一个一维数组,下限为了。
:
激活表Sheet2.Activate。
29、中所有的关键字dApplication.Transpose(k):
把字典1)10、[a2].Resize(d.Count,=
a2单元格开始的单元格区域中。
详细的解释请见前面的keys方法一节。
赋给以
11、[b2].Resize(d.Count,1)=Application.Transpose(t):
把字典d中所有的关键字对应的项赋给以b2单元格开始的单元格区域中。
12、慛崱刮獥穩?
?
㈠?
?
牁慲?
姓名?
尠重复个数):
Array是一个VBA函数,返回的一维数组。
一维数组可以看作是水平排列的,所以赋值给水平的单元格0一个下界为
区域不需要用转置函数了。
这里作为表头一次性输入。
13、Setd=Nothing:
释放字典内存。
代码执行后如图实例1-2所示。
图实例1-2
实例2求多表的不重复值问题
一、问题的提出:
一工作簿里面有3张工作表上,每张表格的A列都是姓名列,所有这些姓名中有些是重复的,要求编写一段代码,在另一个工作表上显示不重复的姓名。
如图实例2-1所示。
11
2-1图实例
这个问题也很适合用字典来解决。
代码如下:
二、代码:
Subbcfz()
Dimi&,Myr&,Arr
Dimd,k,t,ShtAsWorksheet
Setd=CreateObject(Scripting.Dictionary)
ForEachShtInSheets
IfSht.Name<>Sheet4Then
Myr=Sht.[a65536].End(xlUp).Row
Arr=Sht.Range(a2:
a&Myr)
Fori=1ToUBound(Arr)
d(Arr(i,1))=\
Next
If
End
Next
d.keys
k=
Application.Transpose(k)=Sheet4.[a3].Resize(d.Count,1)
NothingdSet=
SubEnd
三、代码详解特有的,For:
Each…Next循环结构,这种形式是VBASheets、1ForInEachSht
用于对对象的循环非常适用。
意思是在所有的工作表中依次循环。
时执行下:
如果这个工作表的名字不等于2、”Sheet4”ThenSheet4Sht.Name<>If
面的代码。
列有数据的最后一行的3、:
求得这个工作表ASht.[a65536].End(xlUp).RowMyr=
,数据范围最大可到。
这里用了长整型数据类型(Long)行数,把它赋给变量Myr而出错,因为整,是为了避免数据很多的时候会超出整型数据类型(Integer)2,147,483,64732,767型数据类型数据范围最大只到。
。
A列数据赋给数组Arr4、:
把Arr=Sht.Range(a2:
a&Myr)
开始到数组的最大上限1Next循环结构,从Fori=1ToUBound(Arr):
For…5、是VBA值之间循环。
函数,返回数组的指定维数的最大值。
Ubound加入字典,关键字对应:
这句代码的意思就是把关键字Arr(i,1)6、d(Arr(i,1))=“”的效果相同,只是的项为空,相当于字典中的这个关键字没有解释。
和d.AddArr(i,1),\代码更简洁一些。
。
得到的是一个一维数中存在的所有的关键字赋给变量k、k=d.keys:
把字典d7是字典的方
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EXCEL VBA 常见字典用法集锦及代码详解全 常见 字典 用法 集锦 代码 详解
![提示](https://static.bingdoc.com/images/bang_tan.gif)