VBA字典与数组知识与实例----字典
- 格式:xls
- 大小:1018.50 KB
- 文档页数:5
常见字典用法集锦及代码详解前言凡是上过学校的人都使用过字典,从新华字典、成语词典,到英汉字典以及各种各样数不胜数的专业字典,字典是上学必备的、经常查阅的工具书。
有了它们,我们可以很方便的通过查找某个关键字,进而查到这个关键字的种种解释,非常快捷实用。
凡是上过EH论坛的想学习VBA里面字典用法的,几乎都看过研究过northwolves狼版主、oobird版主的有关字典的精华贴和经典代码。
我也是从这里接触到和学习到字典的,在此,对他们表示深深的谢意,同时也对很多把字典用得出神入化的高手们致敬,从他们那里我们也学到了很多,也得到了提高。
字典对象只有4个属性和6个方法,相对其它的对象要简洁得多,而且容易理解使用方便,功能强大,运行速度非常快,效率极高。
深受大家的喜爱。
本文希望通过对一些字典应用的典型实例的代码的详细解释来给初次接触字典和想要进一步了解字典用法的朋友提供一点备查的参考资料,希望大家能喜欢。
给代码注释估计是大家都怕做的,因为往往是出力不讨好的,稍不留神或者自己确实理解得不对,还会贻误他人。
所以下面的这些注释如果有不对或者不妥当的地方,请大家跟帖时指正批评,及时改正。
字典的简介字典(Dictionary)对象是微软Windows脚本语言中的一个很有用的对象。
附带提一下,有名的正则表达式(RegExp)对象和能方便处理驱动器、文件夹和文件的(FileSystemObject)对象也是微软Windows脚本语言中的一份子。
字典对象相当于一种联合数组,它是由具有唯一性的关键字(Key)和它的项(Item)联合组成。
就好像一本字典书一样,是由很多生字和对它们对应的注解所组成。
比如字典的“典”字的解释是这样的:“典”字就是具有唯一性的关键字,后面的解释就是它的项,和“典”字联合组成一对数据。
常用关键字英汉对照:Dictionary 字典Key 关键字Item 项,或者译为条目字典对象的方法有6个:Add方法、Keys方法、Items方法、Exists方法、Remove方法、RemoveAll方法。
ExcelVBA——字典实⽤技巧最近写了⼀些⼩功能,对字典有了进⼀步的理解,太强⼤了!个⼈最近⽤过的字典应⽤有这么⼏个,写下来防⽌⾃⼰忘~同时⽅便⼤家⼀、查找重复⾏【原理】利⽤字典的exist⽅法,将数据加⼊字典时判断⼀下,如果已经存在,就说明当前数据为重复数据,应该删除【⽰例代码】Sub chongfu() '查重Dim i As LongDim endline As Long'定义⼯作表长度变量endline = Sheet3.Range("A30000").End(xlUp).Row '获取⼯作表Sheet3有数据的最后⼀⾏⾏号Set d = CreateObject("scripting.dictionary") '设定字典dFor i = endline To2Step -1'从最后⼀⾏开始,依次把各个字段拼接到⼀起(注意,这⾥我的需求是这⼏个字段拼在⼀起的字符串不允许重复,因此我先拼接再判重)'把所有字符串拼接到数组⾥If Sheet3.Cells(i, 2) <> ""Then'判断该⾏是否为空If IsError(Sheet3.Cells(i, 2)) = False Then'如果关键单元格不是#N/A,则进⼊字典设置x = Sheet3.Cells(i, 2) '******************设置赋给字典的变量,即需要去重的单元格!*******************If Not d.Exists(x) Then'判断是否重复d(x) = x '如果不重复,则把x定为itemElseSheet3.Rows(i & ":" & i).Delete Shift:=xlUp '如果字典中已有对应的item,则该⾏重复,删除重复的⾏End IfEnd IfEnd IfNextEnd Sub【效果展⽰】⼆、查找关键字【原理】最常见的应⽤,根据key来查找对应的item【⽰例代码】Sub DicFind() '查找编号对应的数据endline = Sheet3.Range("E100000").End(xlUp).Row '获取待匹配的数据区域长度Set d = CreateObject("Scripting.Dictionary") '设置字典dArr = Sheet3.Range("A2:B26975") '获得字典数据For i = 1To UBound(Arr) '设置sheet3 A列为字典关键字key,B列为字典关键字对应的值(item)If Arr(i, 1) <> ""Then'当A列不为空时,将item装⼊数组x = Arr(i, 1) '想以哪⼀列为关键字查找结果,就把x设置成哪⼀列的单元格d(x) = Arr(i, 2)ElseExit For'A列为空时,退出for循环End IfNextBrr = Sheet3.Range("$E$2:$F$" & endline) '将待查找的数据放⼊数组For j = 1To UBound(Brr)x = Brr(j, 1) '将E列的编号设为keyIf d.Exists(x) Then'如果字典中有对应的item,则将item写⼊数组brrBrr(j, 2) = d(x) '把查找到的item写⼊brr,这⾥对应F列End IfNextSheet3.Range("$E$2:$F$" & endline) = Brr '将匹配好的数据写回单元格End Sub【效果展⽰】建设中。
VBA语言第七课《字典》
三四五
简单来说,字典是一个两列多行的数组,特点是第一列的关键字必须是唯一的(这就跟新华字典里面的字(不含多音字)没有重复一个道理,字典收录一个字,就有这个字指定的唯一位置,下次再碰到这个字,字典会返回原来的位置找出这个字,不会再重新给个位置),第二列对应关键字的值却不一定是唯一的。
字典能高效处理筛选不重复和汇总求和等问题。
字典的原理就是没有记录登记的先登记,有重复的就翻出原来登记的位置进行归集,这样就将数据进行排序分组了。
注:两个条件与一个条件的VBA区别在于,s=d(arr(i,1)&arr(i,2))只是通过&连接将两个条件合并成一个条件,利用的都是字典关键字和m 值的唯一性。
VBA的字典基础各位小伙伴好,今天介绍字典的基础知识,是我根据网上的材料进行了一些总结和简化,大家可以把内容COPY到模块中,对字典d 进行监视,按F8逐步测试,体验字典的功能。
Sub zidian()'一、定义字典Set d = CreateObject("scripting.dictionary")'二、字典赋值d("张三") = 1 '关键字张三对应的值是1d("李四") = 2 '关键字李四对应的值是2d("李四") = 3 '关键字李四对应的值变成了3'注:这时字典中有两个人的存在,张三=1,和李四=3,相当于实现了去重复的功能s = d("张三") 's=1s = d("李四") 's=3s = d("麻子") 's="" '虽然没有,但字典中会添加这个关键字(很重要)'注:这时字典中有三个人的存在,张三=1;李四=3;麻子=""'三、将字典里的东西变成数组Arr = d.keys'把名字的集合按先来后到的原则放到一维数组里arr(0)="张三";arr(1)="李四";arr(2)="麻子"Brr = d.items '把名字对应的值的集合按先来后到的原则放到一维数组里 brr(0)="1";brr(1)="3";brr(2)=""[B1].Resize(d.Count, 1) = Application.Transpose(Arr) '把名字放到单元格中[C1].Resize(d.Count, 1) = Application.Transpose(Brr) '把名字对应的值放到单元格中'四、查找字典中有没有这个人s = d.exists("张三") 's=trues = d.exists("王五") 's=false 此时不会增加王五这个关键字'五、清空数组d.Remove ("张三") '清除字典中的关键字张三和他对应的项d.RemoveAll '清空字典中的所有关键字,项目对'六、add方法d.Add "a", "11" '添加一关键字"a"和对应于它的项"11"d.Add "b", "12" '添加一关键字"a"和对应于它的项"12"d.Add "c", "13" '添加一关键字"a"和对应于它的项"13"'七、关键字替换d.Key("a") = "A" '用新的关键字"A"来替换指定的关键字"a",这时字典中就没有关键字"a"了,只有关键字"A",对应的值是11 MsgBox d.Item("b") '获取指定关键字"b"对应的项'八、设置字典关键字的比较模式Set d = CreateObject("scripting.dictionary")paremode = vbTextCompare'设置字典的比较模式是文本,在这种比较模式下不区分关键字的大小写,即关键字"b"和"B"是一样的。
常见字典用法集锦及代码详解前言凡是上过学校的人都利用过字典,从头华字典、成语词典,到英汉字典和各类各样数不胜数的专业字典,字典是上学必备的、常常查阅的工具书。
有了它们,咱们可以很方便的通过查找某个关键字,进而查到这个关键字的各种解释,超级快捷实用。
凡是上过EH论坛的想学习VBA里面字典用法的,几乎都看过研究过northwolves狼版主、oobird版主的有关字典的精华贴和经典代码。
我也是从这里接触到和学习到字典的,在此,对他们表示深深的谢意,同时也对很多把字典用得炉火纯青的高手们致敬,从他们那里咱们也学到了很多,也取得了提高。
字典对象只有4个属性和6个方式,相对其它的对象要精练得多,而且容易理解利用方便,功能壮大,运行速度超级快,效率极高。
深受大家的喜爱。
本文希望通过对一些字典应用的典型实例的代码的详细解释来给第一次接触字典和想要进一步了解字典用法的朋友提供一点备查的参考资料,希望大家能喜欢。
给代码注释估量是大家都怕做的,因为往往是出力不讨好的,稍不留意或自己确实理解得不对,还会贻误他人。
所以下面的这些注释若是有不对或不妥当的地方,请大家跟帖时指正批评,及时更正。
字典的简介字典(Dictionary)对象是微软Windows脚本语言中的一个很有效的对象。
附带提一下,出名的正则表达式(RegExp)对象和能方便处置驱动器、文件夹和文件的(FileSystemObject)对象也是微软Windows脚本语言中的一分子。
字典对象相当于一种联合数组,它是由具有唯一性的关键字(Key)和它的项(Item)联合组成。
就仿佛一本字典书一样,是由很多生字和对它们对应的注解所组成。
比如字典的“典”字的解释是这样的:“典”字就是具有唯一性的关键字,后面的解释就是它的项,和“典”字联合组成一对数据。
常常利用关键字英汉对照:Dictionary 字典Key 关键字Item 项,或译为条款字典对象的方式有6个:Add方法、Keys方法、Items方法、Exists方法、Remove方法、RemoveAll方法。
VBA中的字典(Dictionary)是一种特殊的对象,用于存储键值对(Key-Value Pair)。
使用字典可以很方便地存储、查询和管理数据。
下面是一些VBA字典的基本用法:
创建字典对象
vba
Dim myDict As Object
Set myDict = CreateObject("Scripting.Dictionary")
向字典中添加键值对
vba
myDict.Add "key1", "value1"
myDict.Add "key2", "value2"
获取字典中的值
vba
Dim value As Variant
value = myDict("key1")
判断键是否存在
vba
If myDict.Exists("key1") Then
' do something
End If
删除字典中的键值对
vba
myDict.Remove "key1"
清空字典中的所有键值对
vba
myDict.RemoveAll()
除了以上基本用法,VBA字典还有很多高级用法,比如遍历字典中的所有键值对、合并多个字典等。
可以根据实际需求使用相应的语法和方法来实现。
常见字典用法集锦及代码详解前言凡是上过学校的人都使用过字典,从新华字典、成语词典,到英汉字典以及各种各样数不胜数的专业字典,字典是上学必备的、经常查阅的工具书。
有了它们,我们可以很方便的通过查找某个关键字,进而查到这个关键字的种种解释,非常快捷实用。
凡是上过EH论坛的想学习VBA里面字典用法的,几乎都看过研究过northwolves狼版主、oobird版主的有关字典的精华贴和经典代码。
我也是从这里接触到和学习到字典的,在此,对他们表示深深的谢意,同时也对很多把字典用得出神入化的高手们致敬,从他们那里我们也学到了很多,也得到了提高。
字典对象只有4个属性和6个方法,相对其它的对象要简洁得多,而且容易理解使用方便,功能强大,运行速度非常快,效率极高。
深受大家的喜爱。
本文希望通过对一些字典应用的典型实例的代码的详细解释来给初次接触字典和想要进一步了解字典用法的朋友提供一点备查的参考资料,希望大家能喜欢。
给代码注释估计是大家都怕做的,因为往往是出力不讨好的,稍不留神或者自己确实理解得不对,还会贻误他人。
所以下面的这些注释如果有不对或者不妥当的地方,请大家跟帖时指正批评,及时改正。
字典的简介字典(Dictionary)对象是微软Windows脚本语言中的一个很有用的对象。
附带提一下,有名的正则表达式(RegExp)对象和能方便处理驱动器、文件夹和文件的(FileSystemObject)对象也是微软Windows脚本语言中的一份子。
字典对象相当于一种联合数组,它是由具有唯一性的关键字(Key)和它的项(Item)联合组成。
就好像一本字典书一样,是由很多生字和对它们对应的注解所组成。
比如字典的“典”字的解释是这样的:“典”字就是具有唯一性的关键字,后面的解释就是它的项,和“典”字联合组成一对数据。
常用关键字英汉对照:Dictionary 字典Key 关键字Item 项,或者译为条目字典对象的方法有6个:Add方法、Keys方法、Items方法、Exists方法、Remove方法、RemoveAll 方法。
实用文库汇编之常见字典用法集锦及代码详解前言凡是上过学校的人都使用过字典,从新华字典、成语词典,到英汉字典以及各种各样数不胜数的专业字典,字典是上学必备的、经常查阅的工具书。
有了它们,我们可以很方便的通过查找某个关键字,进而查到这个关键字的种种解释,非常快捷实用。
凡是上过EH论坛的想学习VBA里面字典用法的,几乎都看过研究过northwolves狼版主、oobird版主的有关字典的精华贴和经典代码。
我也是从这里接触到和学习到字典的,在此,对他们表示深深的谢意,同时也对很多把字典用得出神入化的高手们致敬,从他们那里我们也学到了很多,也得到了提高。
字典对象只有4个属性和6个方法,相对其它的对象要简洁得多,而且容易理解使用方便,功能强大,运行速度非常快,效率极高。
深受大家的喜爱。
本文希望通过对一些字典应用的典型实例的代码的详细解释来给初次接触字典和想要进一步了解字典用法的朋友提供一点备查的参考资料,希望大家能喜欢。
给代码注释估计是大家都怕做的,因为往往是出力不讨好的,稍不留神或者自己确实理解得不对,还会贻误他人。
所以下面的这些注释如果有不对或者不妥当的地方,请大家跟帖时指正批评,及时改正。
字典的简介字典(Dictionary)对象是微软Windows脚本语言中的一个很有用的对象。
附带提一下,有名的正则表达式(RegExp)对象和能方便处理驱动器、文件夹和文件的(FileSystemObject)对象也是微软Windows脚本语言中的一份子。
字典对象相当于一种联合数组,它是由具有唯一性的关键字(Key)和它的项(Item)联合组成。
就好像一本字典书一样,是由很多生字和对它们对应的注解所组成。
比如字典的“典”字的解释是这样的:“典”字就是具有唯一性的关键字,后面的解释就是它的项,和“典”字联合组成一对数据。
常用关键字英汉对照:Dictionary 字典Key 关键字Item 项,或者译为条目字典对象的方法有6个:Add方法、Keys方法、Items方法、Exists方法、Remove方法、RemoveAll方法。
ExcelVBA字典Option Explicit'1 什么是VBA字典?'字典(dictionary)是一个储存数据的小仓库。
共有两列。
'第一列叫key , 不允许有重复的元素。
'第二列是item,每一个key对应一个item,本列允许为重复'Key item'A 10'B 20'C 30'Z 10'2 即然有数组,为什么还要学字典?'原因:提速,具体表现在'1) A列只能装入非重复的元素,利用这个特点可以很方便的提取不重复的值'2) 每一个key对应一个唯一的item,只要指点key的值,就可以马上返回其对应的item,利用字典可以实现快速的查找'3 字典有什么局限?'字典只有两列,如果要处理多列的数据,还需要通过字符串的组合和拆分来实现。
'字典调用会耗费一定时间,如果是数据量不大,字典的优势就无法体现出来。
'4 字典在哪里?如何创建字典?'字典是由scrrun.dll链接库提供的,要调用字典有两种方法'第一种方法:直接创建法'Set d = CreateObject("scripting.dictionary")'第二种方法:引用法'工具-引用-浏览-找到scrrun.dll-确定Option ExplicitSub t1()Dim D As New DictionaryDim x As IntegerFor x = 2 To 4D.Add Cells(x, 1).Value, Cells(x, 2).ValueNext xMsgBox D.Keys(0)MsgBox D.Keys(1)MsgBox D.Keys(2)MsgBox D.Items(0)'StopEnd Sub'2 读取数据Sub t2()' Dim DDim D As New DictionaryDim arrDim x As Integer' Set D = CreateObject("scripting.dictionary")For x = 2 To 4D.Add Cells(x, 1).Value, Cells(x, 2).ValueNext xMsgBox D("李四")MsgBox D.Keys(2)Range("d1").Resize(D.Count) = Application.Transpose(D.Keys) Range("e1").Resize(D.Count) = Application.Transpose(D.Items)arr = D.ItemsEnd SubSub t3()Dim D As New DictionaryDim x As IntegerFor x = 2 To 4D.Add Cells(x, 1).Value, Cells(x, 2).Value Next xD("李四") = 78MsgBox D("李四")D("赵六") = 100MsgBox D("赵六")End Sub'4 删除数据Sub t4()Dim D As New DictionaryDim x As IntegerFor x = 2 To 4D(Cells(x, 1).Value) = Cells(x, 2).Value Next xD.Remove "李四"' MsgBox d.Exists("李四")D.RemoveAllMsgBox D.CountEnd Sub'区分大小写Dim D As New DictionaryDim xFor x = 1 To 5D(Cells(x, 1).Value) = ""Next xStopEnd Subub 求和问题()Dim arr, D As Object, arDim i As Integer, j As ByteSet D = CreateObject("scripting.dictionary")arr = Sheet2.Range("a1").CurrentRegion '选定区域装入数组Dim t$For i = 1 To UBound(arr) '循环从数组第1行到数组的最后一行t = arr(i, 1) & "|" & arr(i, 2)If D.Exists(t) ThenD(t) = t & "|" & (--Split(D(t), "|")(2) + arr(i, 3)) '如果有相应的key,则提取对应item的的销售额与现有的相加,再组合后存入字典ElseD(t) = t & "|" & arr(i, 3) '如果没有相应的Key,则存入"日期|名称|销售额"End IfNext iReDim arr(1 To D.Count, 1 To 3)ar = D.ItemsFor i = 1 To UBound(ar) + 1For j = 1 To 3arr(i, j) = Split(ar(i - 1), "|")(j - 1)Next jNext iSheet3.Range("a1").CurrentRegion.ClearContentsSheet3.Range("a1").Resize(UBound(arr), 3) = arrEnd SubOption ExplicitSub 多表双向查找()Dim d As New DictionaryDim x, yDim arrFor x = 3 To 5arr = Sheets(x).Range("a2").Resize(Sheets(x).Range("a65536").End(xlU p).Row - 1, 2) For y = 1 To UBound(arr)d(arr(y, 1)) = arr(y, 2)d(arr(y, 2)) = arr(y, 1)Next yNext xMsgBox d("C1")MsgBox d("吴情")End SubOption ExplicitSub 汇总()Dim d As New DictionaryDim arr, xarr = Range("a2:b10")For x = 1 To UBound(arr)d(arr(x, 1)) = d(arr(x, 1)) + arr(x, 2) 'key对应的item的值在原来的基础上加新的Next xRange("d2").Resize(d.Count) = Application.Transpose(d.Keys) Range("e2").Resize(d.Count) = Application.Transpose(d.Items)End SubOption ExplicitSub 提取不重复的产品()Dim d As New DictionaryDim arr, xarr = Range("a2:a12")For x = 1 To UBound(arr)d(arr(x, 1)) = ""Next xRange("c2").Resize(d.Count) = Application.Transpose(d.Keys) End Sub。
字典
首先对字典进行说明,字典是VBA中一种储存数据的方式。
字典相当于两列的数组,两列分别成为keys和items,如下图
keys1 items1
keys2 items2
keys3 items3
keys4 items4
字典的keys不能够重复,items可以重复。
正如一般的字典,两个词可以表达同一个意思,但是这两个词不能“长得一样”
keys items
曹操英雄
宇文泰英雄
刘琨英雄
李鸿章英雄
一、字典基础操作
或sheet3)中操作
(二)、赋值
字典赋值有两种方式,“add赋值方式”和“直接赋值方式”,对于每种赋值方式,都可以:a、后台直接赋值;b、将单元格值写入字典
1、add赋值
(1)、后台直接赋值
注意一点:字典的keys要加引号(不加引号有时也可以,但只是有
时可以,区分加引号和不加引号的详细区别没有意义,直接加引号)。
(2)、单元格内容写入字典
d.add cells(行,列).value, cells(行,列)
注意一点:字典的keys要加引号(不加引号有时也可以,但只是有
直接加value)。
******************************************************************************* ** Excel精英培训数组与字典班第二课课件:字典在VBA中应用 ** ** ---------兰色幻想原创 () ** 欢迎转截,但禁止用于商业用途 *******************************************************************************一、什么是字典?我们为什么要学它?字典(Dictionary)是VBA中提供的一个类似二维数组的可以装数据的对象。
为什么要把它起名叫字典?因为它'的使用特征很类似字典。
有共有两列,第一列是"字",第二列是"对字的解释"。
字典和数组很像,但有一个特征是数组不具备的,就是它可以根据存放的内容定位数据,而数组是根据“标”来定位,如果在数组中查找某个元素是否存在,我们除了调用工作表函数外(注:调用工作表函数会拖慢速度),只能循环的方法来实现.看个例子吧:Sub t1()Dim arrarr = Range("a2:b5")For x = 1 To UBound(arr)If arr(x, 1) = "C" ThenMsgBox arr(x, 2)End IfNext xEnd Sub从上面的例子我们就可以看出数组在定位元素时的缺陷,而字典正好可以弥补,利用字典的特征,我们可以完成以下常用功能:1 提取唯一值2 快速查找3 多条件汇总二、字典在哪里?我们如果使用它?字典对象不是EXCEL程序直接附带的,而是在"c:\windows\system32\scrrun.dll"链接库中,所以我们要想用它,要先调用它.调用字典有两种方法,1 引用法:step 1 :VBE中的工具菜单--引用--浏览---在system32文件夹中找到scrrun.dll后点打开即可.使用dim 变量 as new dictionary 声明后就可以用了2 创建法Set d = CreateObject("Scripting.Dictionary") '使用CreateObject创建对字典对象的引用一向字典内装数据数组可以一次性的从单元格中取数,而字典呢,只能通过循环来装数据,把字装在第一列,把"内容"装在第二列.1 使用add方法装Sub q1()Dim dic As New Dictionary '声明的一个字典对象Dim arrarr = Range("a2:b5") '把单元格数据装入内存For x = 1 To UBound(arr)If Not dic.Exists(arr(x, 1)) Then '字典的Exists属性可以判断在一个元素字典内的第一列是否存在dic.Add arr(x, 1), arr(x, 2) '使用add方法向字典内装. 字典.add 第一列内容,第二列内容End IfNext xEnd Sub2 使用修改式装Sub q2()Dim dic As New DictionaryDim arrarr = Range("a2:b5") '把单元格数据装入内存For x = 1 To UBound(arr)dic(arr(x, 1)) = arr(x, 2) '如果arr(x,1)在字典中存在,则使用本次item的值替换原来的第二列值,如果不存在,则会创新一个新的keyNext xEnd Sub二取字典内的详细信息我们装入字典的目的是为了运算和数据处理,所以装入后我们还要从字典中返回相应的数据和信息Sub q3()Dim dic As New DictionaryDim arr, arr1arr = Range("a2:b5") '把单元格数据装入内存For x = 1 To UBound(arr)dic(arr(x, 1)) = arr(x, 2) '如果arr(x,1)在字典中存在,则使用本次item的值替换原来的第二列值,如果不存在,则会创新一个新的keyNext xMsgBox dic.Count '使用count属性可以返回字典内有多少行MsgBox dic.Item("B") '或dic("B") ,可以根据第一列的内容直接返回对应的第二列的值,这个VBA数组只能用循环完成arr1 = dic.Keys '把字典内的第一列值一次性的放入arr1中,构成一个一维数组MsgBox arr1(0)Range("d1").Resize(dic.Count) = Application.Transpose(dic.Items) '通过转换把字典的第二列放入单元格中End Sub三清除字典的元素Sub q4()Dim dic As New DictionaryDim arrarr = Range("a2:b5") '把单元格数据装入内存For x = 1 To UBound(arr)dic(arr(x, 1)) = arr(x, 2) '如果arr(x,1)在字典中存在,则使用本次item的值替换原来的第二列值,如果不存在,则会创新一个新的keyNext xdic.Remove ("B") '使用remove 可以清除字典内指定的字符,这也是数组做不到的MsgBox dic.Item("B")dic.RemoveAll '清空字典End SubSub w1()Dim arrDim d As New DictionarypareMode = TextCompare 'CompareMode属性的值为TextCompare时,可以忽略大小写,默认大小写是不同的arr = Range("a1:a12")For x = 1 To UBound(arr)If Not d.Exists(arr(x, 1)) Thend.Add arr(x, 1), ""End IfNext xRange("c1").Resize(d.Count) = Application.Transpose(d.Keys)End Sub下面和数组比试一下速度Sub w2() '使用字典的耗时是0.04st = TimerDim arrDim d As New Dictionaryarr = Range("a1:a20000")For x = 1 To UBound(arr)If Not d.Exists(arr(x, 1)) Thend.Add arr(x, 1), ""End IfNext xRange("c1").Resize(d.Count) = Application.Transpose(d.Keys)MsgBox Timer - tEnd Sub使用数组Sub w3() '使用数组的耗时是10s,是字典的250倍t = TimerDim arr, arr1()arr = Range("a1:a20000")ReDim arr1(1 To 1)For x = 1 To UBound(arr)For y = 1 To UBound(arr1)If arr(x, 1) = arr1(y) ThenGoTo 100End IfNext yk = k + 1ReDim Preserve arr1(1 To k)arr1(k) = arr(x, 1)100:00:00Next xRange("d1").Resize(k) = Application.Transpose(arr1)MsgBox Timer - tEnd Sub1 双向查找Sub e1()Dim arrDim d As New Dictionaryarr = Range("a1:b6")For x = 1 To UBound(arr) '把城市放入第一列,简写放入第二列d(arr(x, 1)) = arr(x, 2)Next xFor x = 1 To UBound(arr) '为了能达到双向查找,把简写放入第一列,把城市放入第二列 d(arr(x, 2)) = arr(x, 1)Next xMsgBox d("上海")MsgBox d("sh")End Sub2 多条件查找Sub e2()Dim arr, arr1, arr2(1 To 2, 1 To 2), arr3Dim d As New Dictionaryarr = Range("a2:d5")arr1 = Range("a12:b13")For x = 1 To UBound(arr)d(arr(x, 1) & "-" & arr(x, 2)) = arr(x, 3) & "-" & arr(x, 4) '把字符进行合并放在字典中Next xFor y = 1 To UBound(arr1)arr3 = Split(d(arr1(y, 1) & "-" & arr1(y, 2)), "-") '拆分字符arr2(y, 1) = arr3(0)arr2(y, 2) = arr3(1)Next yRange("C12").Resize(2, 2) = arr2End Sub单条件求和Sub p1()Dim d As New DictionaryDim arrarr = Range("b2:c5")For x = 1 To UBound(arr)d(arr(x, 1)) = d(arr(x, 1)) + arr(x, 2) '字典中的相同的key进行累加Next xRange("e2").Resize(d.Count) = Application.Transpose(d.Keys)Range("f2").Resize(d.Count) = Application.Transpose(d.Items)End Sub多条件求和Sub e2()Dim arr, arr1, arr2(1 To 1000, 1 To 2), arr3Dim d As New Dictionaryarr = Range("a2:c6")For x = 1 To UBound(arr)d(arr(x, 1) & "-" & arr(x, 2)) = d(arr(x, 1) & "-" & arr(x, 2)) + arr(x, 3) '把需要汇总的列进行连接 Next xarr1 = d.KeysFor y = 0 To UBound(arr1)arr3 = Split(arr1(y), "-") '把连接的产品和型号列进行拆分arr2(y + 1, 1) = arr3(0) '拆分后的放进arr2数组中arr2(y + 1, 2) = arr3(1)Next yRange("f2").Resize(d.Count, 2) = arr2Range("h2").Resize(d.Count) = Application.Transpose(d.Items)End Sub多列求和Sub e3()Dim arrDim d1 As New Dictionary, d2 As New Dictionary, d3 As New Dictionaryarr = Range("a2:d6")For x = 1 To UBound(arr)d1(arr(x, 1)) = d1(arr(x, 1)) + arr(x, 2) '利用d1字典汇总数量d2(arr(x, 1)) = arr(x, 3) '利用d2字典放单价,不汇总d3(arr(x, 1)) = d3(arr(x, 1)) + arr(x, 4) '利用d3字典汇总金额Next xRange("a13").Resize(d1.Count) = Application.Transpose(d1.Keys) Range("b13").Resize(d1.Count) = Application.Transpose(d1.Items) Range("c13").Resize(d1.Count) = Application.Transpose(d2.Items) Range("d13").Resize(d1.Count) = Application.Transpose(d3.Items) End Sub。