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)。
常见字典用法集锦及代码详解常见字典用法集锦及代码详解字典的简介字典(Dictionary)对象是微软Windows脚本语言中的一个很有用的对象。
附带提一下,有名的正则表达式(RegExp)对象和能方便处理驱动器、文件夹和文件的(FileSystemObject)对象也是微软Windows脚本语言中的一份子。
字典对象相当于一种联合数组,它是由具有唯一性的关键字(Key)和它的项(Item)联合组成。
就好像一本字典书一样,是由很多生字和对它们对应的注解所组成。
比如字典的“典”字的解释是这样的:“典”字就是具有唯一性的关键字,后面的解释就是它的项,和“典”字联合组成一对数据。
常用关键字英汉对照:Dictionary 字典Key 关键字Item 项,或者译为条目字典对象的方法有6个:Add方法、Keys方法、Items方法、Exists方法、Remove方法、RemoveAll方法。
Add方法向Dictionary 对象中添加一个关键字项目对。
object.Add (key, item)参数object必选项。
总是一个Dictionary 对象的名称。
key必选项。
与被添加的item 相关联的key。
item必选项。
与被添加的key 相关联的item。
说明如果key 已经存在,那么将导致一个错误。
2字典的简介常用语句:Dim dSet d = CreateObject("Scripting.Dictionary")d.Add "a", "Athens"d.Add "b", "Belgrade"d.Add "c", "Cairo"代码详解1、Dim d :创建变量,也称为声明变量。
变量d声明为可变型数据类型(Variant),d后面没有写数据类型,默认就是可变型数据类型(Variant)。
关于dictionary字典用法的学习与笔记总结:字典一般为二列组成的二维数组,其对象值默认为Item.a(Key,Item)字典方法(Dictionary):根据关键字(key)在字典中查找字:关键字Key 不能重复检索:Item 可以重复通俗讲:key如关健字、查寻字 Item即如解释内容Dictionary属性和方法的亮点(与Collection对象相比):1.key属性可随时更改:If dic.Exists(OldKey) Then dic.Key(OldKey) = NewKey2.item属性可随时更改:If dic.Exists(OldKey) Then dic.Item(OldKey) = NewItem3.Keys方法可得到一个下界为0的一维数组:Dim ss=dic.keys4.items方法也可得到一个下界为0的一维数组:Dim ss=dic.Items5. Remove 方法可直接删除Dictionary对象的某一个元素,对于VB的一维数组来说,省去了不少编码的烦恼6. Removeall方法可直接删除Dictionary对象的全部元素7.对于使用Keys和items方法得到的数组,可以使用VBA的数组的全部技巧进行处理,如Filter(),Join()函数及工作表函数Transpose(),Max(),Min(),Large()等的使用.8.Count属性为Dictionary数组与EXCEL工作表的相互赋值提供了方便.9.键值的唯一性使得Dictionary对象在统计"不重复"方面的问题得心应手,而item属性可更改更使得Dictionary对象在数据汇总上大显身手.10.VBA的一些控件如listbox,combobox,单元格的数据有效性,自定义序列及图表的序列,xvalue属性等也与数组有一定的联系,使得Dictionary对象也有用武之地.具体步骤学习:Dictionary对象的引用:方法1:在工具-->引用菜单中,选择Scripting Runtime Library:然后在模块中按以下方式引用:Dim dic As New Dictionary或者Dim dic2 As New Scripting.Dictionary方法2:使用CreateObject方法,如:Dim dic As ObjectSet dic=CreateObject("scripting.dictionary")更多数情况下,我们可以忽略变量的定义,直接使用其属性和方法,如开头的例子: Dim i As IntegerWith CreateObject("scripting.dictionary")For i = 2000 To 2100If Day(DateSerial(i, 3, 0)) = 29 Then .Add i, NothingNextMsgBox Join(.keys, " ")End WithDictionary 对象的属性和说明语法:pareMode[ = compare]CompareMode 设定或返回键的字符串比较模式(仅用于VBScript)VbUseCompareOption -1 值比较bBinaryCompare 0 二进制比较vbTextCompare 1 文字比较vbTextCompare 2 数据库比较方法说明Add(key,item) 增加键/条目对到DictionaryExists(key) 如果指定键存在,返回True,否则返回FalseItems() 返回一个一唯所有条目的数组Keys() 返回一个一唯所有关键值的数组Remove(key) 删除一个指定键的条目或键RemoveAll() 删除全部键及条目语法:object.Add key, item添加一对相对应的关键字和条目到Dictionary 对象key不能重复,item可以重复语法:object.Exists(key)如果在Dictionary 对象中指定的关键字存在,返回True,若不存在,返回False语法:object.Keys返回一个数组,该数组包含一个Dictionary 对象中的全部已有的关键字。
excel vba 字典用法在ExcelVBA中,字典是一种非常有用的数据结构,它允许您通过键值对的方式存储和访问数据。
与数组不同,字典中的键可以是任何数据类型,而不仅仅是数字或字符串。
因此,字典通常用于需要按名称或其他非数字方式引用数据的情况。
使用字典的基本步骤是:1. 声明字典变量:使用Dim语句声明一个字典变量。
2. 实例化字典对象:使用Set语句创建一个新的字典对象。
3. 向字典添加元素:使用Add方法向字典中添加一个或多个元素。
4. 访问字典元素:使用Item方法通过键来访问字典中的元素。
5. 删除字典元素:使用Remove方法从字典中删除一个元素。
以下是一个简单的示例,演示了如何使用字典来存储和访问员工的姓名和薪水:Sub testDict()'声明字典变量Dim empDict As Object'实例化字典对象Set empDict = CreateObject('Scripting.Dictionary')'添加元素empDict.Add 'John', 50000empDict.Add 'Mary', 60000'访问元素Debug.Print empDict.Item('John') '输出50000'删除元素empDict.Remove 'Mary'End Sub上面的示例中,我们首先声明了一个名为empDict的字典变量。
然后,我们使用CreateObject函数创建了一个新的字典对象。
接下来,我们向字典中添加了两个元素,键为“John”和“Mary”,对应的值分别为50000和60000。
我们使用Item方法访问了键为“John”的元素,并输出了它的值。
最后,我们使用Remove方法从字典中删除了键为“Mary”的元素。
总结:Excel VBA中的字典是一种非常有用的数据结构,它允许您通过键值对的方式存储和访问数据。
VBA字典用法小记十分鄙视那些将蓝桥玄霜大大的成果上传后还要收取下载券的做法,本来想直接上传一份大大的原版,可是百度文档提示已经有重复的文档,没办法,只好自己修改一下,在上传,想无私奉献的大大致敬!!!!!!!!!!常用语句:Dim dSet d = CreateO bject("Scripti ng.Diction ary")d.Add "a", "Athens"d.Add "b", "Belgrad e"d.Add "c", "Cairo"代码详解1、Dim d :创建变量,也称为声明变量。
变量d声明为可变型数据类型(V ariant),d后面没有写数据类型,默认就是可变型数据类型(V ariant)。
也有写成Dim d As Object的,声明为对象。
2、Set d = CreateO bject("Scripti ng.Diction ary"):创建字典对象,并把字典对象赋给变量d。
这是最常用的一句代码。
所谓的“后期绑定”。
用了这句代码就不用先引用c:\windows\system32\scrrun.dll了。
3、d.Add "a", "Athens":添加一关键字”a”和对应于它的项”Athens”。
4、d.Add "b", “Belgrad e”:添加一关键字”b”和对应于它的项”Belgrad e”。
5、d.Add "c", “Cairo”:添加一关键字”c”和对应于它的项”Cairo”。
Exists方法如果Diction ary 对象中存在所指定的关键字则返回true,否则返回false。
Vba代码集锦-利用字典做两列数据的对比并对齐目前字典案例更新了4个,需要源文件的小伙伴可以回复“字典”,回复后即可获得4个字典案例的源文件,源代码,感谢大家支持,如有打扰请见谅。
源数据:代码:Sub 对比()Dim arr, brr, crrDim i, j, n, lastrowA, lastrowB As Integer'建立字典对象Set d = CreateObject('scripting.dictionary')'获取数据区域最后一行的行数lastrowA = Sheets('对比对齐两列数据').Cells(Rows.Count, 1).End(xlUp).RowlastrowB = Sheets('对比对齐两列数据').Cells(Rows.Count, 2).End(xlUp).Row'将数据区域导入数组arr = Sheets('对比对齐两列数据').Range('A3:A' & lastrowA)brr = Sheets('对比对齐两列数据').Range('B3:B' & lastrowB)'重新定义数组crr,数组行数:数组arr+数组brr元素数和,列数:2 ReDim crr(1 To UBound(arr) + UBound(brr), 1 To 2)'循环数组arr,将arr的值赋值给crr的第一列,同时,建立字典,字典的关键字为数组的值,对应的项目给该值对应的位置'举例来说,字典的第一个关键字为淮安,淮安对应的项为1For i = 1 To UBound(arr)crr(i, 1) = arr(i, 1)d(arr(i, 1)) = iNextn = UBound(arr)'循环数组brr,首先判断brr的元素在字典中是否存在,如果存在,那么通过d(brr(j, 1))找到这个元素在字典中所在的位置,然后把这个元素赋值给crr该元素所在位置的第二列'举例来说,brr的第一个值是青岛,在arr中是第17个,通过上面的循环和写入字典,可以判断,青岛已经是字典的关键字,并且对应的值是17,同时,数组crr的第17行,第1列的值就是青岛'此时brr也出现了青岛,通过判断,字典中存在,那么d(brr(j, 1))=d(青岛)=17,即crr(17,2)=brr(j,1)=青岛,把青岛写入到crr的第17行,第2列For j = 1 To UBound(brr)If d.exists(brr(j, 1)) Thencrr(d(brr(j, 1)), 2) = brr(j, 1)Else'如果不存在,那么就写入到crr的n行2列,n的初始值是arr元素的数量,n+1,即第一个不在arr中的brr值写到crr的n+1行,之后每次出现都加一行,依次往下赋值n = n + 1crr(n, 2) = brr(j, 1)End IfNext'将crr的数据赋值到单元格区域Sheets('对比对齐两列数据').Range('D3').Resize(n, 2).Value = crr。
VBA简单入门40:用字典进行多列求和要求:按条件1进行多列求和。
思路:1、将单元格数据放进数组arr,定义数组brr,设定和arr一样大小,用来存储求和的数据2、对条件1进行计数,用字典去重复值计数。
依次遍历数组arr的数据,k=0,对条件1去重复计数,并用字典存储计数。
A放进数组brr的第一行,计数k=k 1将其行号写入字典,d('A')=k---->d('A')=1,此时,数组brr有一条数据B放进数组brr的第二行,计数k=k 1将其行号写入字典,d('B')=k---->d('B')=2,此时数组brr有两条数据C放进数组brr的第三行,计数k=k 1将其行号写入字典,d('C')=k---->d('C')=3,此时数组brr有三条数据D放进数组brr的第四行,计数k=k 1将其行号写入字典,d('D')=k---->d('D')=4,此时数组brr有四条数据当遍历到第5条数据时,A重复了,因为已经将A作为关键字写入了字典,此时通过r=d('A')读取A在字典中的item,就是1。
将数值1、2、3分别相加,925 714; 311 309; 892 810 ,相加后的和仍然放在brr中的原来的位置,并用最新的值取代原来的值。
每当遇到重复数据的时候,都是如此操作,完成累加。
如遇到重复的B这样就相当于依次完成了按条件求和。
每个条件都重复如此的操作完成累加。
参考代码如下:例子2,多条件多列求和,原理一样。
将多个条件用& 合并成一个key即可。
参考代码:希望大家写写这两个代码,常常用来求和。
常见字典用法集锦及代码详解前言凡是上过学校的人都使用过字典,从新华字典、成语词典,到英汉字典以及各种各样数不胜数的专业字典,字典是上学必备的、经常查阅的工具书。
有了它们,我们可以很方便的通过查找某个关键字,进而查到这个关键字的种种解释,非常快捷实用。
凡是上过EH论坛的想学习VBA里面字典用法的,几乎都看过研究过northwolves 狼版主、oobird版主的有关字典的精华贴和经典代码。
我也是从这里接触到和学习到字典的,在此,对他们表示深深的谢意,同时也对很多把字典用得出神入化的高手们致敬,从他们那里我们也学到了很多,也得到了提高。
字典对象只有4个属性和6个方法,相对其它的对象要简洁得多,而且容易理解使用方便,功能强大,运行速度非常快,效率极高。
深受大家的喜爱。
本文希望通过对一些字典应用的典型实例的代码的详细解释来给初次接触字典和想要进一步了解字典用法的朋友提供一点备查的参考资料,希望大家能喜欢。
给代码注释估计是大家都怕做的,因为往往是出力不讨好的,稍不留神或者自己确实理解得不对,还会贻误他人。
所以下面的这些注释如果有不对或者不妥当的地方,请大家跟帖时指正批评,及时改正。
字典的简介字典(Dictionary)对象是微软Windows 脚本语言中的一个很有用的对象。
附带提一下,有名的正则表达式(RegExp)对象和能方便处理驱动器、文件夹和文件的(FileSystemObject)对象也是微软Windows 脚本语言中的一份子。
字典对象相当于一种联合数组,它是由具有唯一性的关键字(Key)和它的项(Item)联合组成。
就好像一本字典书一样,是由很多生字和对它们对应的注解所组成。
比如字典的“典”字的解释是这样的:“典”字就是具有唯一性的关键字,后面的解释就是它的项,和“典”字联合组成一对数据。
常用关键字英汉对照:Dictionary 字典Key 关键字Item 项,或者译为条目字典对象的方法有6个:Add方法、Keys方法、Items方法、Exists方法、Remove方法、RemoveAll方法。
******************************************************************************* ** 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。