VBA字典用法集锦及代码详解Word文档格式.docx
- 文档编号:18162821
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:52
- 大小:1.40MB
VBA字典用法集锦及代码详解Word文档格式.docx
《VBA字典用法集锦及代码详解Word文档格式.docx》由会员分享,可在线阅读,更多相关《VBA字典用法集锦及代码详解Word文档格式.docx(52页珍藏版)》请在冰豆网上搜索。
key
与被添加的item相关联的key。
item
与被添加的key相关联的item。
说明
如果key已经存在,那么将导致一个错误。
常用语句:
Dimd
Setd=CreateObject("
Scripting.Dictionary"
)
d.Add"
a"
"
Athens"
b"
Belgrade"
c"
Cairo"
代码详解
1、Dimd:
创建变量,也称为声明变量。
变量d声明为可变型数据类型(Variant),d后面没有写数据类型,默认就是可变型数据类型(Variant)。
也有写成DimdAsObject的,声明为对象。
2、Setd=CreateObject("
):
创建字典对象,并把字典对象赋给变量d。
这是最常用的一句代码。
所谓的“后期绑定”。
用了这句代码就不用先引用c:
\windows\system32\scrrun.dll了。
3、d.Add"
:
添加一关键字”a”和对应于它的项”Athens”。
4、d.Add"
“Belgrade”:
添加一关键字”b”和对应于它的项”Belgrade”。
5、d.Add"
“Cairo”:
添加一关键字”c”和对应于它的项”Cairo”。
Exists方法
如果Dictionary对象中存在所指定的关键字则返回true,否则返回false。
object.Exists(key)
需要在Dictionary对象中搜索的key值。
Dimd,msg$
Setd=CreateObject("
d.Add"
Ifd.Exists("
)Then
msg="
指定的关键字已经存在。
"
Else
指定的关键字不存在。
EndIf
1、Dimd,msg$:
声明变量,d见前例;
msg$声明为字符串数据类型(String),一般写法为DimmsgAsString。
String的类型声明字符为美元号($)。
2、Ifd.Exists("
)Then:
如果字典中存在关键字”c”,那么执行下面的语句。
3、msg="
:
把"
字符串赋给变量msg。
4、Else:
否则执行下面的语句。
5、msg="
6、EndIf:
结束If…Else…Endif判断。
Keys方法
返回一个数组,其中包含了一个Dictionary对象中的全部现有的关键字。
object.Keys()
其中object总是一个Dictionary对象的名称。
Dimd,k
k=d.Keys
[B1].Resize(d.Count,1)=Application.Transpose(k)
1、Dimd,k:
k默认是可变型数据类型(Variant)。
2、k=d.Keys:
把字典中存在的所有的关键字赋给变量k。
得到的是一个一维数组,下限为0,上限为d.Count-1。
这是数组的默认形式。
3、[B1].Resize(d.Count,1)=Application.Transpose(k):
这句代码是很常用很经典的代码,所以这里要多说一些。
Resize是Range对象的一个属性,用于调整指定区域的大小,它有两个参数,第一个是行数,本例是d.Count,指的是字典中关键字的数量,整本字典中有多少个关键字,本例d.Count=3,因为有3个关键字。
呵呵,是不是说多了。
第二个是列数,本例是1。
这样=左边的意思就是:
把一个单元格B1调整为以B1开始的一列单元格区域,行数等于字典中关键字的数量d.Count,就是把单元格B1调整为单元格区域B1:
B3了。
=右边的k是个一维数组,是水平排列的,我们知道Excel工作表函数里面有个转置函数Transpose,用它可以把水平排列的置换成竖向排列。
但是在VBA中不能直接使用该工作表函数,需要通过Application对象的WorksheetFunction属性来使用它。
所以完整的写法是Application.WorksheetFunction.Transpose(k),中间的WorksheetFunction可省略。
现在可以解释这句代码了:
把字典中所有的关键字赋给以B1单元格开始的单元格区域中。
Items方法
返回一个数组,其中包含了一个Dictionary对象中的所有项目。
object.Items()
Dimd,t
t=d.Items
[C1].Resize(d.Count,1)=Application.Transpose(t)
1、Dimd,t:
t默认是可变型数据类型(Variant)。
2、t=d.Items:
把字典中所有的关键字对应的项赋给变量t。
得到的也是一个一维数组,下限为0,上限为d.Count-1。
3、[C1].Resize(d.Count,1)=Application.Transpose(t):
有了上面Keys方法的解释这句代码就不用多说了,就是把字典中所有的关键字对应的项赋给以C1单元格开始的单元格区域中。
Remove方法
Remove方法从一个Dictionary对象中清除一个关键字,项目对。
object.Remove(key)
key与要从Dictionary对象中删除的关键字,项目对相关联。
如果所指定的关键字,项目对不存在,那么将导致一个错误。
Dimd
……
d.Remove(“b”)
1、d.Remove(“b”):
清除字典中”b”关键字和与它对应的项。
清除之后,现在字典里只有2个关键字了。
RemoveAll方法
RemoveAll方法从一个Dictionary对象中清除所有的关键字,项目对。
object.RemoveAll()
d.RemoveAll
1、d.RemoveAll:
清除字典中所有的数据。
也就是清空这字典,然后可以添加新的关键字和项,形成一本新字典。
字典对象的属性有4个:
Count属性、Key属性、Item属性、CompareMode属性。
Count属性
返回一个Dictionary对象中的项目数。
只读属性。
object.Count
其中object一个字典对象的名称。
Dimd,n%
n=d.Count
1、Dimd,n%:
n被声明为整型数据类型(Integer)。
一般写法为DimnAsInteger。
Integer的类型声明字符为百分比号(%)。
2、n=d.Count:
把字典中所有的关键字的数量赋给变量n。
本例得到的是3。
Key属性
在Dictionary对象中设置一个key。
object.Key(key)=newkey
参数:
总是一个字典(Dictionary)对象的名称。
被改变的key值。
newkey
替换所指定的key的新值。
如果在改变一个key时没有发现该key,那么将创建一个新的key并且其相关联的item被设置为空。
d.Key("
)="
d"
1、d.Key("
用新的关键字”d”来替换指定的关键字”c”,这时,字典中就没有关键字c了,只有关键字d了,与d对应的项是”Cairo”。
Item属性
在一个Dictionary对象中设置或者返回所指定key的item。
对于集合则根据所指定的key返回一个item。
读/写。
object.Item(key)[=newitem]
总是一个Dictionary对象的名称。
与要被查找或添加的item相关联的key。
newitem
可选项。
仅适用于Dictionary对象;
newitem就是与所指定的key相关联的新值。
如果在改变一个key的时候没有找到该item,那么将利用所指定的newitem创建一个新的key。
如果在试图返回一个已有项目的时候没有找到key,那么将创建一个新的key且其相关的项目被设置为空。
MsgBoxd.Item("
)
1、d.Item("
):
获取指定的关键字”c”对应的项。
2、MsgBox:
是一个VBA函数,用消息框显示。
如果要详细了解MsgBox函数的,可参见我的另一篇文章“常用VBA函数精选合集”。
CompareMode属性
设置或者返回在Dictionary对象中进行字符串关键字比较时所使用的比较模式。
object.CompareMode[=compare]
compare
如果提供了此项,compare就是一个代表比较模式的值。
可以使用的值是0(二进制)、1(文本),2(数据库)。
如果试图改变一个已经包含有数据的Dictionary对象的比较模式,那么将导致一个错误。
d.CompareMode=vbTextCompare
B"
Baltimore"
1、d.CompareMode=vbTextCompare:
设置字典的比较模式是文本,在这种比较模式下不区分关键字的大小写,即关键字”b”和”B”是一样的。
vbTextCompare的值为1,所以上式也可写为d.CompareMode=1。
如果设置为vbBinaryCompare(值为0),则执行二进制比较,即区分关键字的大小写,此种情况下关键字”b”和”B”被认为是不一样的。
2、d.Add"
添加一关键字”B”和对应于它的项”Baltimore”。
由于前面已经设置了比较模式为文本模式,不区分关键字的大小写,即关键字”b”和”B”是一样的,此时发生错误添加失败,因为字典中已经存在”b”了,字典中的关键字是唯一的,不能添加重复的关键字。
实例1普通常见的求不重复值问题
一、问题的提出:
表格中人员有很多是重复的,要求编写一段代码,把重复的人员姓名以及重复的次数求出来,复制到另一个表格中。
如图实例1-1所示。
论坛网址:
图实例1-1
二、代码:
Subcfz()
Dimi&
Myr&
Arr
Dimd,k,t
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)
[b2].Resize(d.Count,1)=Application.Transpose(t)
[a1].Resize(1,2)=Array("
姓名"
重复个数"
Setd=Nothing
EndSub
三、代码详解
1、Dimi&
Arr:
变量i和Myr声明为长整型变量。
也可以写为DimMyrAsLong。
Long的类型声明字符为(&
)。
Arr后面没有写明数据类型,默认就是可变型数据类型(Variant)。
3、Myr=Sheet1.[a65536].End(xlUp).Row:
把表1的A列最后一行不为空白的行数赋给变量Myr。
这里用了Range对象的End属性,它有4个方向参数,此处的xlUp表示向上,它的值为3,所以也可写成End(3)。
xlDown表示向下,它的值为4;
xlToLeft表示向左,它的值为1;
xlToRight表示向右,它的值为2。
4、Arr=Sheet1.Range("
Myr):
把表1的A1到G列最后一行不为空白的单元格区域的值赋给变量Arr。
这样Arr就是个二维数组了,用数组替代单元格引用可对执行代码的速度提高很多很多。
5、Fori=2ToUBound(Arr):
For…Next循环结构,从2开始到数组的最大上界值之间循环。
因为数组的第一行是表头。
Ubound是VBA函数,返回数组的指定维数的最大可用上界。
6、d(Arr(i,3))=d(Arr(i,3))+1:
Arr(i,3)在本例是姓名列,也就是关键字列,举个例子,假如Arr(i,3)=”张三”,这句代码的意思就是把关键字”张三”加入字典,d(key)等于关键字key对应的项,每出现一次这个关键字,它的项的值就增加1。
起到了按关键字累加的作用,也正因为有这个作用,所以可使用字典来进行各种汇总统计。
后面要讲的实例会充分的展现这个作用。
7、k=d.keys:
把字典d中存在的所有的关键字赋给变量k。
Keys是字典的方法,前面已经讲过了。
8、t=d.items:
把字典d中存在的所有的关键字对应的项赋给变量t。
Items也是字典的方法,前面也已经讲过了。
9、Sheet2.Activate:
激活表2。
10、[a2].Resize(d.Count,1)=Application.Transpose(k):
把字典d中所有的关键字赋给以a2单元格开始的单元格区域中。
详细的解释请见前面的keys方法一节。
11、[b2].Resize(d.Count,1)=Application.Transpose(t):
把字典d中所有的关键字对应的项赋给以b2单元格开始的单元格区域中。
12、[a1].Resize(1,2)=Array("
Array是一个VBA函数,返回一个下界为0的一维数组。
一维数组可以看作是水平排列的,所以赋值给水平的单元格区域不需要用转置函数了。
这里作为表头一次性输入。
13、Setd=Nothing:
释放字典内存。
代码执行后如图实例1-2所示。
图实例1-2
实例2求多表的不重复值问题
一工作簿里面有3张工作表上,每张表格的A列都是姓名列,所有这些姓名中有些是重复的,要求编写一段代码,在另一个工作表上显示不重复的姓名。
如图实例2-1所示。
图实例2-1
这个问题也很适合用字典来解决。
代码如下:
Subbcfz()
Dimd,k,t,ShtAsWorksheet
ForEachShtInSheets
IfSht.Name<
>
"
Sheet4"
Then
Myr=Sht.[a65536].End(xlUp).Row
Arr=Sht.Range("
a2:
Fori=1ToUBound(Arr)
d(Arr(i,1))="
Next
Sheet4.[a3].Resize(d.Count,1)=Application.Transpose(k)
1、ForEachShtInSheets:
ForEach…Next循环结构,这种形式是VBA特有的,用于对对象的循环非常适用。
意思是在所有的工作表中依次循环。
2、IfSht.Name<
Then:
如果这个工作表的名字不等于”Sheet4”时执行下面的代码。
3、Myr=Sht.[a65536].End(xlUp).Row:
求得这个工作表A列有数据的最后一行的行数,把它赋给变量Myr。
这里用了长整型数据类型(Long),数据范围最大可到2,147,483,647,是为了避免数据很多的时候会超出整型数据类型(Integer)而出错,因为整型数据类型数据范围最大只到32,767。
4、Arr=Sht.Range("
Myr):
把A列数据赋给数组Arr。
5、Fori=1ToUBound(Arr):
For…Next循环结构,从1开始到数组的最大上限值之间循环。
Ubound是VBA函数,返回数组的指定维数的最大值。
6、d(Arr(i,1))=“”:
这句代码的意思就是把关键字Arr(i,1)加入字典
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VBA 字典 用法 集锦 代码 详解