Excel VBA字典
ExcelVBA——字典实用技巧
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【效果展⽰】建设中。
excel vba 快速注释
excel vba 快速注释
在Excel VBA中,注释是一种非常有用的工具,可以帮助你和
其他人理解代码的目的和功能。
你可以使用注释来解释代码的特定
部分,提供提示或者提醒自己或其他人在以后阅读代码时需要注意
的事项。
下面是一些快速注释的方法:
1. 单行注释:在代码行前面加上单引号(')可以将该行标记
为注释。
例如:
' 这是一个单行注释。
2. 多行注释:在多行注释时,你可以使用Rem语句,如下所示: Rem 这是一个多行注释。
这是注释的第二行。
3. 快速注释快捷键,在VBA编辑器中,你可以使用快捷键
Ctrl+Shift+C来快速注释选定的代码行,使用Ctrl+Shift+U来取
消注释选定的代码行。
4. 注释最佳实践,在编写注释时,要确保注释清晰、简洁,并且与代码保持同步。
注释应该解释代码的意图和逻辑,而不是简单地重复代码的功能。
5. 注释的应用场景,注释通常用于解释复杂的代码、标识代码中的特殊情况或者提醒自己或其他人代码中需要注意的地方。
在编写长期项目或者与他人合作时,良好的注释习惯可以提高代码的可读性和可维护性。
总的来说,注释是编程中不可或缺的一部分,它可以帮助你更好地理解和管理代码。
在Excel VBA中,合理地使用注释可以使你的代码更易于理解和维护。
希望这些方法能够帮助你更好地应用注释来提高代码质量和效率。
excel工作表VBA语言第七课《字典》
VBA语言第七课《字典》
三四五
简单来说,字典是一个两列多行的数组,特点是第一列的关键字必须是唯一的(这就跟新华字典里面的字(不含多音字)没有重复一个道理,字典收录一个字,就有这个字指定的唯一位置,下次再碰到这个字,字典会返回原来的位置找出这个字,不会再重新给个位置),第二列对应关键字的值却不一定是唯一的。
字典能高效处理筛选不重复和汇总求和等问题。
字典的原理就是没有记录登记的先登记,有重复的就翻出原来登记的位置进行归集,这样就将数据进行排序分组了。
注:两个条件与一个条件的VBA区别在于,s=d(arr(i,1)&arr(i,2))只是通过&连接将两个条件合并成一个条件,利用的都是字典关键字和m 值的唯一性。
VBA实现Excel的数据筛选与分类
VBA实现Excel的数据筛选与分类Excel是一款功能强大的电子表格软件,而VBA(Visual Basic for Applications)是Excel内置的编程语言,能够帮助用户自定义宏和函数,以实现更高级的数据操作。
在日常工作中,我们常常需要对Excel中的数据进行筛选和分类,以便更好地进行数据分析和统计。
VBA提供了一系列的方法和功能,使得这些操作变得更加简单高效。
一、数据筛选数据筛选是指从Excel表格中选择出符合一定条件的数据,使之显示在一个新的区域或表中。
VBA提供了多种方式来实现数据筛选,如使用AutoFilter方法、AdvancedFilter方法以及使用数组等。
1.1 使用AutoFilter方法AutoFilter是Excel中常用的一个功能,可以通过它进行数据筛选。
VBA中的AutoFilter方法可以帮助我们在Excel中实现筛选操作。
首先,我们需要定义一个数据区域,然后使用AutoFilter方法对数据进行筛选。
下面是一个示例代码:```Sub FilterData()Dim rng As Range'定义数据区域Set rng = Range("A1:D10")'启用自动筛选rng.AutoFilter'筛选第一列的数据,只显示包含"A"的行rng.AutoFilter Field:=1, Criteria1:="=*A*"End Sub```在上述代码中,我们首先定义了一个数据区域rng,然后通过rng.AutoFilter方法启用了自动筛选功能。
接下来,通过rng.AutoFilter Field:=1, Criteria1:="=*A*"这一行代码实现了对第一列数据的筛选,只显示包含"A"的行。
1.2 使用AdvancedFilter方法AdvancedFilter方法可以更加灵活地进行数据筛选,我们可以通过定义一个条件区域和结果区域来实现高级筛选。
VBA提高Excel处理效率的五大技巧
VBA提高Excel处理效率的五大技巧在现代工作中,Excel已经成为了办公室常用的办公软件之一。
然而,大量的数据处理和分析工作可能会导致Excel运行缓慢,影响工作效率。
为了提高Excel的处理速度,我们可以利用VBA编程技巧来优化Excel的性能。
本文将介绍五个VBA技巧,帮助您提高Excel处理效率。
一、使用数组进行数据操作在Excel中,一个常见的问题是需要对大量的数据进行操作,比如筛选、计算或者复制粘贴等。
但是这些操作都需要逐个单元格进行,效率相对较低。
使用VBA中的数组可以极大地提高数据操作的效率。
通过将需要的数据保存在一个数组中,在VBA中进行操作,最后再将结果一次性写回Excel,可以大大减少读写操作,从而提高运行速度。
使用数组进行数据操作的方法是将数据读取到数组中,使用循环语句对数组进行处理,最后再将处理后的结果写回Excel。
二、禁用屏幕更新和事件响应在VBA编程中,Excel的屏幕更新和事件响应是非常消耗系统资源的操作。
当涉及大量数据处理时,可以暂时禁用屏幕更新和事件响应,以提高Excel的处理效率。
通过以下两行代码可以禁用屏幕更新和事件响应:```Application.ScreenUpdating = FalseApplication.EnableEvents = False```在处理完大量数据后,及时启用屏幕更新和事件响应:```Application.ScreenUpdating = TrueApplication.EnableEvents = True```三、使用索引而非循环在VBA编程中,经常需要对Excel的行、列进行遍历和操作。
然而,嵌套的循环会导致性能下降。
相反,使用索引可以更高效地访问和操作Excel的行、列。
例如,使用For循环遍历行时,可以使用以下代码:```Dim i As LongFor i = 1 To Range("A" & Rows.Count).End(xlUp).Row'执行操作Next i```这种方式每次都需要通过Range函数计算行号,而使用索引可以更快速地完成操作:```Dim i As LongDim lastRow As LonglastRow = Range("A" & Rows.Count).End(xlUp).RowFor i = 1 To lastRow'执行操作Next i```四、使用特定的数据类型在VBA编程中,选择合适的数据类型可以提高数据处理的效率。
VBA实现Excel的数据分类与汇总
VBA实现Excel的数据分类与汇总Excel是广泛应用于数据管理和分析的工具,它提供了丰富的功能和工具来处理和操作数据。
其中,VBA(Visual Basic for Applications)是一种用于自定义和自动化Excel操作的编程语言。
通过使用VBA,我们可以编写宏来实现一系列复杂的数据处理任务。
在本文中,我们将探讨如何使用VBA来实现Excel的数据分类与汇总。
这个任务要求我们根据特定的条件将数据进行分类,并将每个分类下的数据进行汇总。
首先,我们需要明确要根据哪些条件进行数据分类。
假设我们有一个包含销售数据的工作表,其中包括产品名称、销售数量和销售日期。
我们的任务是根据产品名称将销售数据进行分类,并计算每个产品的总销售数量。
为了实现这个任务,我们可以按照以下步骤来编写VBA代码:步骤一:打开Visual Basic Editor在Excel中,按下Alt + F11快捷键可以打开Visual Basic Editor。
在这个编辑器中,我们可以编写和调试VBA代码。
步骤二:创建一个新的宏在Visual Basic Editor中,选择“插入”菜单并点击“模块”。
这将创建一个新的VBA模块,我们可以将代码编写在这个模块中。
步骤三:编写VBA代码在新创建的模块中,我们可以编写VBA代码来实现数据分类与汇总的功能。
下面是一个简单的范例代码:```vbaSub 数据分类与汇总()Dim ws As WorksheetDim rng As RangeDim cell As RangeDim dict As ObjectSet ws = ThisWorkbook.Worksheets("Sheet1") ' 更改为你的工作表名称Set rng = ws.Range("A2:C" & ws.Cells(ws.Rows.Count, "A").End(xlUp).Row) ' 根据实际数据范围进行修改Set dict = CreateObject("Scripting.Dictionary")For Each cell In rngIf Not dict.exists(cell.Value) Thendict.Add cell.Value, cell.Offset(, 1).ValueElsedict(cell.Value) = dict(cell.Value) + cell.Offset(, 1).ValueEnd IfNext cellws.Range("E1").Value = "产品名称"ws.Range("F1").Value = "总销售数量"ws.Range("E2").Resize(dict.Count) = Application.Transpose(dict.keys)ws.Range("F2").Resize(dict.Count) = Application.Transpose(dict.items)MsgBox "数据分类与汇总完成!"End Sub```这段代码包括了以下几个关键步骤:1. 首先,声明了所需的变量,包括工作表对象(ws)、数据范围(rng)、单元格对象(cell)和字典对象(dict)。
EXCEL VBA 常见字典用法集锦及代码详解(全)
常见字典用法集锦及代码详解前言凡是上过学校的人都使用过字典,从新华字典、成语词典,到英汉字典以及各种各样数不胜数的专业字典,字典是上学必备的、经常查阅的工具书。
有了它们,我们可以很方便的通过查找某个关键字,进而查到这个关键字的种种解释,非常快捷实用。
凡是上过EH论坛的想学习VBA里面字典用法的,几乎都看过研究过northwolves狼版主、oobird版主的有关字典的精华贴和经典代码。
我也是从这里接触到和学习到字典的,在此,对他们表示深深的谢意,同时也对很多把字典用得出神入化的高手们致敬,从他们那里我们也学到了很多,也得到了提高。
字典对象只有4个属性和6个方法,相对其它的对象要简洁得多,而且容易理解使用方便,功能强大,运行速度非常快,效率极高。
深受大家的喜爱。
本文希望通过对一些字典应用的典型实例的代码的详细解释来给初次接触字典和想要进一步了解字典用法的朋友提供一点备查的参考资料,希望大家能喜欢。
给代码注释估计是大家都怕做的,因为往往是出力不讨好的,稍不留神或者自己确实理解得不对,还会贻误他人。
所以下面的这些注释如果有不对或者不妥当的地方,请大家跟帖时指正批评,及时改正。
字典的简介字典(Dictionary)对象是微软Windows脚本语言中的一个很有用的对象。
附带提一下,有名的正则表达式(RegExp)对象和能方便处理驱动器、文件夹和文件的(FileSystemObject)对象也是微软Windows脚本语言中的一份子。
字典对象相当于一种联合数组,它是由具有唯一性的关键字(Key)和它的项(Item)联合组成。
就好像一本字典书一样,是由很多生字和对它们对应的注解所组成。
比如字典的“典”字的解释是这样的:“典”字就是具有唯一性的关键字,后面的解释就是它的项,和“典”字联合组成一对数据。
常用关键字英汉对照:Dictionary 字典Key 关键字Item 项,或者译为条目字典对象的方法有6个:Add方法、Keys方法、Items方法、Exists方法、Remove方法、RemoveAll方法。
ExcelVBA字典实现窗体二级下拉菜单
ExcelVBA字典实现窗体二级下拉菜单ExcelVBA字典实现窗体二级下拉菜单问题提出:选择确定ComboBox1中的数值后,ComboBox2的下拉列表自动引用ComboBox1中数值对应的列的内容。
如何能做到我现在想在加一重判断:就是判断ComboBox2中的数值,如果是原来ComboBox1对应列中已有的值,就直接向下进行,如果原来ComboBox1对应列中没有该值,自动添加到该列最下一个非空行之后再向下执行。
字典的引用:窗体代码如下:Public Arr, Dic As NewDictionary'声明为公共变量,引用“Microsoft Scripting Runtime”Private Sub UserForm_Initialize() '窗体初始化事件DimBrrArr =Sheet1.Range("A1").CurrentRegion.Value 'A1单元格已用区域For i = 1 ToUBound(Arr,2)'循环标题,并添加到字典If Not Dic.Exists(Arr(1, i))Then'字典中不存在关键字Dic.Add Arr(1, i), Dic.Count +1'添加关键字,Item为索引End IfNextBrr =Dic.KeysboBox1.Clear'清除列表框1条目For i = 0 ToUBound(Brr) -1'列表框1添加条目boBox1.AddItem Brr(i) NextEnd SubPrivate Sub ComboBox1_DropButtonClick() '列表框1下拉事件DimBrrIfboBox1.Text = "" Then ExitSub'如果列表框1为空,就退出过程boBox2.Clear'清空列表框2条目IfDic.Exists(boBox1.Text) Then '如果列表框的关键字,在字典中有记录Brr = Application.WorksheetFunction.Index(Arr, 0,Dic(boBox1.Text)) '用Index函数取出整列数据For i = 2 To UBound(Brr,1)'列表框2添加条目boBox2.AddItem Brr(i,1)'列表框2添加条目NextEnd IfEnd SubPrivate Sub CommandButton1_Click() '按钮1单击事件IfboBox1.Text = "" Or boBox2.Text = ""Then ExitSub'如果列表框1,2为空,就退出过程Dim Brr,CrrBrr =Application.WorksheetFunction.Index(Arr, 0,Dic(boBox1.Text))'用Index函数取出整列数据Crr =VBA.Filter(Application.Transpose(Brr),boBox2.Text,True)'取出匹配列表框2的值IfUBound(Crr) = -1 Then'如果有列表框2的值,数组不会为-1,'如果列表框2中没有此关键字,往原数据添加此关键字Sheet1.Cells(Rows.Count,Dic(boBox1.Text)).End(xlUp).Offset(1).Value = boBox2.TextEnd IfSheet1.Cells(Rows.Count, 10).End(xlUp).Offset(1).Value =boBox2.Text'+ boBox1.Text '把数据写入单元格boBox1.Text = "": boBox2.Text = ""'列表框1,2显示为空白boBox1.Clear:boBox2.Clear'清空列表框1,2的条目CallUserForm_Initialize'初始化窗体,为下一次录入数据准备End Sub效果图:更多分享请关注微信号微信号:Excel335081548 或: 雪山飞狐Excel 喜欢本文,请点击右上角,分享本文。
excel vba字典用法
在Excel VBA中,可以使用字典对象(Dictionary Object)来存储和操作键值对。
以下是一些使用Excel VBA字典的基本用法:1. 创建字典对象```vbaDim myDictionary As ObjectSet myDictionary = CreateObject("Scripting.Dictionary")```2. 添加键值对```vbamyDictionary.Add Key:= "Key1", Item:= "Value1"myDictionary.Add Key:= "Key2", Item:= "Value2"```3. 获取键对应的值```vbaDim value As Variantvalue = myDictionary.Item("Key1")```4. 遍历字典中的所有键值对```vbaDim key As VariantDim value As VariantFor Each key In myDictionary.Keys value = myDictionary.Item(key)' Do something with key and value Next key```5. 删除字典中的键值对```vbamyDictionary.Remove "Key1"```6. 检查键是否存在于字典中```vbaIf myDictionary.Exists("Key1") Then' Do something if the key existsEnd If```这些是Excel VBA字典对象的基本用法,您可以根据需要进行扩展和定制。
【跟我学ExcelVBA】第十一课:字典!!!
【跟我学ExcelVBA】第十一课:字典看到有朋友留言,说为什么没有更新了。
首先说声抱歉,这两天咳嗽咳得觉都睡不好,没有啥精神;而且,刚好有人定制了一个进销存系统,也忙着干活。
给大家展示一下成果,只要你努力学习,下面这个东西其实很简单。
今天,我们来扯一点中级知识!也许,大家看到了题目。
没错!就是字典!小伙伴们也许会想了,我们用过的字典还少么?什么中华字典、汉语拼音字典、中英文对照字典、康熙字典......嘿嘿,你想多了!那么,什么是字典呢?字典(Dictionary)对象是微软Windows脚本语言中的一个很有用的对象。
字典对象相当于一种联合数组,它是由具有唯一性的关键字(Key)和它的项(Item)联合组成。
就好像一本字典书一样,是由很多生字和对它们对应的注解所组成。
比如字典的“典”字的解释是这样的:“典”字就是具有唯一性的关键字,后面的解释就是它的项,和“典”字联合组成一对数据。
常用关键字英汉对照:Dictionary 字典Key 关键字Item 项,或者译为条目字典对象的方法有6个:Add方法、Keys方法、Items方法、Exists方法、Remove方法、RemoveAll方法。
字典有4个属性:CompareMode ,Count ,Item ,Key那么,字典有什么用途呢,我们怎样使用字典?一、字典是存在于库文件Scrrun.dll中的,如果你不能使用字典,那么很大可能性就是你电脑上缺少这个库文件;二、字典的使用有前期绑定和后期绑定两种方法:1、前期绑定:首先,我们在VBE窗口中,点击工具-引用,并引用以下库文件:其次,在过程中输入以下代码,即可创建字典:Dim d As New Dictionary2、后期绑定:Dim d As ObjectSet D=CreateObject('Scripting.Dictionary')至于前期引用和后期绑定在使用上有什么区别,我们先不理。
如何在Excel中使用VBA编程实现自定义功能
如何在Excel中使用VBA编程实现自定义功能Excel是一款功能强大的电子表格软件,它允许用户进行各种数据处理和分析。
然而,有时候我们可能需要实现一些自定义功能,以便更好地适应个人的需求。
在这种情况下,VBA编程可以成为一个非常有用的工具。
本文将向您介绍如何在Excel中使用VBA编程实现自定义功能。
1. 打开Visual Basic编辑器要开始使用VBA编程,您首先需要打开Excel的Visual Basic编辑器。
在Excel中,您可以通过按下Alt+F11快捷键或者点击“开发人员”选项卡中的“Visual Basic”按钮来打开编辑器。
2. 创建一个VBA模块在Visual Basic编辑器中,您可以看到工程资源管理器窗口和代码窗口。
首先,您需要创建一个VBA模块来存放您的自定义功能代码。
在“工程资源管理器”窗口中,右键点击Excel对象,选择“插入” - “模块”。
这样,一个新的VBA模块就会出现在代码窗口中。
3. 编写VBA代码在VBA模块中,您可以编写自定义功能的代码。
VBA提供了丰富的语法和函数,可以用来处理各种Excel操作。
以下是一些常用的VBA编程功能示例:3.1 定义和调用子过程或函数使用Sub或Function关键字可以定义一个子过程或函数,并在需要的时候调用它们。
例如:```VBASub MySub()' 这里是您的代码End SubFunction MyFunction() As Variant' 这里是您的代码MyFunction = 结果End Function```3.2 操作单元格和范围通过使用Range对象,您可以对Excel中的单元格和范围进行操作。
例如:```VBASub CellOperation()' 选中A1单元格Range("A1").Select' 设置A1单元格的值为100Range("A1").Value = 100' 清空A1单元格的内容Range("A1").ClearContentsEnd Sub```3.3 循环和条件语句VBA支持各种循环和条件语句,您可以使用它们来处理和控制数据。
(完整版)VBA字典用法集锦及案例代码详解
(完整版)VBA字典⽤法集锦及案例代码详解VBA字典⽤法集锦及案例代码详解dadaVBA字典⽤法集锦及案例代码详解前⾔凡是上过学校的⼈都使⽤过字典,从新华字典、成语词典,到英汉字典以及各种各样数不胜数的专业字典,字典是上学必备的、经常查阅的⼯具书。
有了它们,我们可以很⽅便的通过查找某个关键字,进⽽查到这个关键字的种种解释,⾮常快捷实⽤。
凡是上过EH论坛的想学习VBA⾥⾯字典⽤法的,⼏乎都看过研究过northwolves狼版主、oobird版主的有关字典的精华贴和经典代码。
我也是从这⾥接触到和学习到字典的,在此,对他们表⽰深深的谢意,同时也对很多把字典⽤得出神⼊化的⾼⼿们致敬,从他们那⾥我们也学到了很多,也得到了提⾼。
字典对象只有4个属性和6个⽅法,相对其它的对象要简洁得多,⽽且容易理解使⽤⽅便,功能强⼤,运⾏速度⾮常快,效率极⾼。
深受⼤家的喜爱。
本⽂希望通过对⼀些字典应⽤的典型实例的代码的详细解释来给初次接触字典和想要进⼀步了解字典⽤法的朋友提供⼀点备查的参考资料,希望⼤家能喜欢。
给代码注释估计是⼤家都怕做的,因为往往是出⼒不讨好的,稍不留神或者⾃⼰确实理解得不对,还会贻误他⼈。
所以下⾯的这些注释如果有不对或者不妥当的地⽅,请⼤家跟帖时指正批评,及时改正。
字典的简介字典(Dictionary)对象是微软Windows脚本语⾔中的⼀个很有⽤的对象。
附带提⼀下,有名的正则表达式(RegExp)对象和能⽅便处理驱动器、⽂件夹和⽂件的(FileSystemObject)对象也是微软Windows脚本语⾔中的⼀份⼦。
字典对象相当于⼀种联合数组,它是由具有唯⼀性的关键字(Key)和它的项(Item)联合组成。
就好像⼀本字典书⼀样,是由很多⽣字和对它们对应的注解所组成。
⽐如字典的“典”字的解释是这样的:“典”字就是具有唯⼀性的关键字,后⾯的解释就是它的项,和“典”字联合组成⼀对数据。
常⽤关键字英汉对照:2字典的简介Dictionary 字典Key 关键字Item 项,或者译为条⽬字典对象的⽅法有6个:Add⽅法、Keys⽅法、Items⽅法、Exists⽅法、Remove⽅法、RemoveAll⽅法。
Excel VBA_字典套字典实例集锦
1,特殊条件编号‘2012-9-3‘/forum.php?mod=viewthread&tid=914702&page=1#pid6271907 Sub lqxs()Dim Arr, i&, j&, jj&, n&, aa, bb, y, x$Dim d As New Dictionary, k, t, d1 As New Dictionary, t1Sheet1.Activate[e31:e5000].ClearContentsArr = [a1].CurrentRegionFor i = 31 To UBound(Arr)x = Arr(i, 4)y = Arr(i, 1) & "|" & Arr(i, 3)d(x) = d(x) & i & ","If d1.Exists(x) = False Then Set d1(x) = New Dictionaryd1(x)(y) = d1(x)(y) & i & ","Nextk = d.keyst = d.itemsFor i = 0 To UBound(k)t(i) = Left(t(i), Len(t(i)) - 1)n = 0If InStr(t(i), ",") Thenaa = Split(t(i), ",")For j = 0 To UBound(aa)y = Arr(aa(j), 1) & "|" & Arr(aa(j), 3)n = n + 1t1 = d1(k(i))(y)t1 = Left(t1, Len(t1) - 1)If InStr(t1, ",") Thenbb = Split(t1, ",")For jj = 0 To UBound(bb)Cells(bb(jj), 5) = nNextj = j + UBound(bb)ElseCells(t1, 5) = nEnd IfNextEnd IfNextEnd Sub2,列表框3级数据有效性‘2012-9-4‘/thread-716135-1-1.htmlDim d1 As New DictionaryDim d2 As New DictionaryPrivate Sub ComboBox1_Click()ComboBox2.ClearComboBox3.ClearComboBox2.List = d1(ComboBox1.Text).ItemsEnd SubPrivate Sub ComboBox2_Click()ComboBox3 = ""ComboBox3.List = d2(ComboBox1.Text & ComboBox2.Text).Items End SubPrivate Sub UserForm_Initialize()arr = Sheet1.Range("a3:f" & Sheet1.[a65536].End(3).Row)For i = 1 To UBound(arr)a = arr(i, 1) & "":b = arr(i, 3) & "":c = arr(i, 6) & ""x = arr(i, 1) & arr(i, 3)If d1.Exists(a) = False Then Set d1(a) = New Dictionary d1(a)(b) = bIf d2.Exists(x) = False Then Set d2(x) = New Dictionary d2(x)(c) = cNextComboBox1.List = d1.KeysEnd Sub3,填表‘2012-9-19‘/thread-922624-1-1.htmlDim d As New DictionaryDim d1 As New DictionarySub 填充()Dim xm, rkb, rkkm, rlkm, rlxm, r, sckm, km, sSheet2.Activate[b:c].ClearContentsrkb = Sheets("任课表").Range("b2:bi16")xm = Sheets("绩效名单").Range("a2:a241")rkkm = Sheets("任课表").Range("a2:a16")For i = 1 To UBound(rkb)For j = 1 To UBound(rkb, 2)If d.exists(rkb(i, j)) = False Then Set d(rkb(i, j)) = New Dictionaryd(rkb(i, j))(rkkm(i, 1)) = rkkm(i, 1)Next jNext ik = d.Keysk1 = d(k(0)).itemsFor x = 1 To UBound(xm)If d.exists(xm(x, 1)) Thens = d(xm(x, 1)).itemsIf IsArray(s) ThenCells(x + 1, 2).Resize(1, UBound(s) + 1) = sElseCells(x + 1, 2) = sEnd IfEnd IfNextSet d = NothingEnd Sub4,2级字典嵌套‘2013-2-21‘/thread-984445-1-1.htmlSub lqxs()Dim Arr, i&, x, yDim d, k, tSet d = CreateObject("Scripting.Dictionary")Arr = [a1].CurrentRegionFor i = 2 To UBound(Arr)x = Arr(i, 1): y = Arr(i, 2)If d.exists(x) = False Then Set d(x) = CreateObject("Scripting.Dictionary") d(x)(y) = d(x)(y) + 1Nextk = d.keyst = d.items:For i = 2 To UBound(Arr)If d.exists(Arr(i, 1)) Then Cells(i, 3) = d(Arr(i, 1)).CountNextEnd Sub‘2013-1-22‘/thread-974297-1-1.htmlSub lqxs()Dim Arr, i&, j&, n&, ttDim d, k, t, d1, x, y, k1Set d = CreateObject("Scripting.Dictionary")Set d1 = CreateObject("Scripting.Dictionary")Sheet2.ActivateArr = Sheet1.[a1].CurrentRegionFor i = 2 To UBound(Arr)x = Arr(i, 1)y = Left(Arr(i, 3), 1)d(x) = d(x) + 1If d1.Exists(x) = False Then Set d1(x) = CreateObject("Scripting.Dictionary") d1(x)(y) = d1(x)(y) + 1Nextk = d1.keyst = d1.items: n = 4: tt = 0For i = 0 To UBound(k)Cells(n, 1) = "小计"Cells(n, 2) = k(i)Cells(n, 3) = t(i).Counttt = tt + t(i).Countk1 = t(i).keysFor j = 0 To UBound(k1)n = n + 1Cells(n, 2) = k(i)Cells(n, 3) = k1(j)Cells(n, 4) = d1(k(i))(k1(j))Nextn = n + 1NextCells(3, 3) = ttEnd Sub5,3级字典嵌套‘2012-1-23‘/forum.php?mod=viewthread&tid=974963&page=2#pid6676611 Sub lqxs()Dim Arr, i&, Arr1, x$, n&, y&, Brr, r%, Brr1(), r2%, Brr2()Dim d, k, t, d1, k1, t1, k2, kk, a, b, c, cp$Set d = CreateObject("Scripting.Dictionary")Set d1 = CreateObject("Scripting.Dictionary")Sheet3.Activate[a2:d50000].ClearArr1 = Sheet1.[a1].CurrentRegionArr = Sheet2.[a1].CurrentRegionFor i = 2 To UBound(Arr)a = Arr(i, 4):b = Arr(i, 3)d(b) = aNextd.RemoveAllFor i = 2 To UBound(Arr1)a = Arr1(i, 4): c = Arr1(i, 7)b = Split(Arr1(i, 3), "]")(1)cp = a & "," & bIf a <> "" ThenIf d.Exists(a) = False Then Set d(a) = CreateObject("Scripting.Dictionary")d(a)(b) = bIf d1.Exists(cp) = False ThenSet d1(cp) = CreateObject("Scripting.Dictionary")End Ifd1(cp)(c) = d1(cp)(c) + 1End IfNextk = d.keys: k1 = d1.keyst = d.items: t1 = d1.items: n = 2For i = 0 To UBound(k)k2 = t(i).keysCells(n, 1) = k(i)For j = 0 To UBound(k2)Cells(n, 2) = k2(j)x = k(i) & "," & k2(j)kk = d1(x).keysFor y = 0 To UBound(kk)If d1(x)(kk(y)) <> 0 ThenCells(n, 3) = kk(y)Cells(n, 4) = d1(x)(kk(y))n = n + 1End IfNextNextNextBrr = [a1].CurrentRegionFor i = 2 To UBound(Brr)If Brr(i, 1) <> "" Thenr = r + 1ReDim Preserve Brr1(1 To r)Brr1(r) = iEnd IfIf Brr(i, 2) <> "" Thenr2 = r2 + 1ReDim Preserve Brr2(1 To r2)Brr2(r2) = iEnd IfNextFor i = 1 To rIf i <> r Thenjs = Brr1(i + 1) - 1Elsejs = UBound(Brr)End Ifks = Brr1(i)With Cells(ks, 1).Resize(js - ks + 1).MergeEnd WithNextFor i = 1 To r2If i <> r2 Thenjs = Brr2(i + 1) - 1Elsejs = UBound(Brr)End Ifks = Brr2(i)With Cells(ks, 2).Resize(js - ks + 1).MergeEnd WithNext[a1].CurrentRegion.Borders.LineStyle = 1 End Sub6,2级字典嵌套‘2013-2-6‘/thread-980784-1-1.htmlSub lqxs()Dim Arr, i&, j&Dim d, k, t, d1, k1, t1, n&Set d = CreateObject("Scripting.Dictionary")Set d1 = CreateObject("Scripting.Dictionary")Sheet2.ActivateArr = [a1].CurrentRegionFor j = 2 To UBound(Arr, 2)For i = 2 To UBound(Arr)d(Arr(1, j)) = d(Arr(1, j)) + 1If d1.Exists(Arr(1, j)) = False Then Set d1(Arr(1, j)) = CreateObject("Scripting.Dictionary")d1(Arr(1, j))(Arr(i, j)) = d1(Arr(1, j))(Arr(i, j)) + 1NextNextk = d.keys: t = d.itemsn = 40For i = 0 To UBound(k)k1 = d1(k(i)).keyst1 = d1(k(i)).itemsn = n + 1Cells(n, 1) = k(i)n = n + 1Cells(n, 1).Resize(d1(k(i)).Count, 1) = Application.Transpose(k1)Cells(n, 2).Resize(d1(k(i)).Count, 1) = Application.Transpose(t1)n = n + d1(k(i)).CountCells(n, 1) = "合计": Cells(n, 2) = t(i)NextEnd Sub7,字典的项为数组‘2013-2-8‘/thread-981240-1-1.htmlSub 数据3()Dim arrDim iRow&, i&, wbzb$'读取总表源数据wbzb = "总表"ThisWorkbook.ActivateWith Worksheets(wbzb)If Len(.[a4]) = 0 Then Exit Sub'高级筛选,去除重复值.Range("a3").CurrentRegion.AdvancedFilter xlFilterInPlace, , , TrueiRow = .Range("c" & Rows.Count).End(xlUp).RowIf iRow <= 3 Then Exit Sub '最后一行数据行低于第3行位置就退出arr = .Range("a3:j" & iRow)End With'arr2数组存储数据Dim dic As Object, arr2(), k&, j&'数据列对应关系,arrZos源列号,arrMpos目标列号Dim arrZPos, arrMPos, arrTemparrZPos = Array(4, 5, 6, 7, 8, 9, 10)arrMPos = Array(1, 2, 3, 4, 5, 10, 11)'以支行网点名字存入字典Set dic = CreateObject("Scripting.dictionary")For i = 2 To UBound(arr)If Not dic.exists(arr(i, 3)) ThenReDim arr2(1 To 11, 1 To 1)For j = LBound(arrZPos) To UBound(arrZPos)arr2(arrMPos(j), 1) = arr(i, arrZPos(j))Nextdic(arr(i, 3)) = Array(1, arr2) ' dic(arr(i, 3))(0)为存入个数,dic(arr(i, 3))(1)为数组ElsearrTemp = dic(arr(i, 3))k = arrTemp(0) + 1arr2 = arrTemp(1)ReDim Preserve arr2(1 To 11, 1 To k)For j = LBound(arrZPos) To UBound(arrZPos)arr2(arrMPos(j), k) = arr(i, arrZPos(j))Nextdic(arr(i, 3)) = Array(k, arr2)End IfNextOn Error Resume NextDim wb As WorkbookDim wbname$, Slash$wbname = "明细.xls"Slash = Application.PathSeparatorDim secAutomation As MsoAutomationSecuritySet wb = Workbooks(wbname)If Err.Number <> 0 ThenErr.ClearMsgBox ThisWorkbook.Path & Slash & wb'防止打开时运行宏secAutomation = Application.AutomationSecurityApplication.AutomationSecurity = msoAutomationSecurityForceDisableSet wb = Workbooks.Open(ThisWorkbook.Path & Slash & wbname)If Err.Number <> 0 ThenMsgBox "打开" & wb & " 出错"Err.ClearExit SubEnd IfEnd Ifwb.ActivateDim arrKey, wbZong$, keyitem, endrow2&, endrow&For Each keyitem In dic.keysWith Worksheets(keyitem)If Err.Number = 0 Then.Range("d:e").NumberFormatLocal = "@".Range("f:f").NumberFormatLocal = "G/通用格式"endrow = .Range("c" & Rows.Count).End(xlUp).Row = 3If endrow > 3 Then.Range("a4:j" & endrow).ClearContents.Range("a4:j" & endrow).Borders.LineStyle = xlNoneEnd Ifendrow = 4arr2 = WorksheetFunction.Transpose(dic(keyitem)(1))If dic(keyitem)(0) > 1 Then ‘只有1项时,赋值语句不同.Range("a" & endrow).Resize(UBound(arr2), 11) = arr2endrow2 = .Range("c" & Rows.Count).End(xlUp).Row.Range("f" & endrow).FormulaR1C1 = "=IF(COUNTIF(R4C[5]:RC11,RC[-1]&""*"")=1,""√"","""")".Range("f" & endrow & ":f" & endrow2).FillDownElse.Range("a" & endrow).Resize(1, 11) = arr2.Range("f4").FormulaR1C1 ="=IF(COUNTIF(R4C[5]:RC11,RC[-1]&""*"")=1,""√"","""")"End IfEnd IfErr.ClearEnd WithNextApplication.AutomationSecurity = msoAutomationSecurityByUIEnd Sub8,2级字典嵌套(数据有效性)‘2013-2-23‘/thread-985283-1-1.htmlPrivate Sub Worksheet_Change(ByVal Target As Range)If Target.Count > 1 Then Exit SubIf Target.Address <> "$K$2" And Target.Address <> "$M$2" Then Exit Sub Dim Arr, i&, x$, d, Brr, c%Set d = CreateObject("Scripting.Dictionary")Arr = [a1].CurrentRegionBrr = [a4].Resize(UBound(Arr) - 3, UBound(Arr, 2))For i = 5 To UBound(Arr, 2)x = Arr(1, i) & "|" & Arr(2, i)d(x) = iNextx = [k2].Value & "|" & [m2].Value[m4].Resize(UBound(Brr), 1).ClearContentsIf d.exists(x) Thenc = d(x)[m4].Resize(UBound(Brr), 1) = Application.Index(Brr, 0, c)End IfEnd SubPrivate Sub Worksheet_SelectionChange(ByVal Target As Range)If Target.Count > 1 Then Exit SubIf Target.Address <> "$K$2" And Target.Address <> "$M$2" Then Exit Sub Dim Arr, i&, x$, d, Brr, c%Set d = CreateObject("Scripting.Dictionary")Arr = [a1].CurrentRegionFor i = 5 To UBound(Arr, 2)x = Arr(1, i): y = Arr(2, i)If d.exists(x) = False Then Set d(x) = CreateObject("Scripting.Dictionary") d(x)(y) = d(x)(y) + 1Nextk = d.keysIf Target.Address = "$K$2" ThenWith Target.Validation.Delete.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _Operator:=xlBetween, Formula1:=Join(d.keys, ",")End WithTarget.Offset(0, 2) = ""Elset = d(Target.Offset(0, -2).Value).keysWith Target.Validation.Delete.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _Operator:=xlBetween, Formula1:=Join(t, ",")End WithEnd IfEnd Sub9,列表框4级数据有效性、多条件查询‘2013-3-3‘/thread-987829-1-1.htmlDim d As New Dictionary, Arr, Brr, k, tDim d1 As New DictionaryDim d2 As New DictionaryDim d3 As New DictionaryPrivate Sub ComboBox1_Change()ComboBox2.Clear: ComboBox2 = ""ComboBox3.Clear: ComboBox3 = ""ComboBox4.Clear: ComboBox4 = ""boBox2.List = d1(boBox1.Value).itemsEnd SubPrivate Sub ComboBox2_Change()If ComboBox2 = "" Then Exit SubComboBox3.ClearComboBox4.ClearboBox3.List = d2(boBox1.Value & boBox2.Value).items End SubPrivate Sub ComboBox3_Change()If ComboBox3 = "" Then Exit SubComboBox4.ClearboBox4.List = d3(boBox1.Value & boBox2.Value & boBox3.Value).itemsEnd SubPrivate Sub CommandButton1_Click()Dim i&, x$, y$, j&, aa[b7:g5000].ClearContentsArr = Sheet1.[a1].CurrentRegionIf boBox4 <> "" Thenx = boBox1.Text & boBox2.Text & boBox3.Text & boBox4.TextFor i = 2 To UBound(Arr)y = CStr(Arr(i, 1)) & Arr(i, 6) & Arr(i, 7) & Arr(i, 8)If x = y ThenIf Arr(i, 2) <> "" Then d(Arr(i, 2)) = d(Arr(i, 2)) & i & ","End IfNextCall yyy(2)[b6] = "销售人员"ElseIf boBox3 <> "" Thenx = boBox1.Text & boBox2.Text & boBox3.TextFor i = 2 To UBound(Arr)y = CStr(Arr(i, 1)) & Arr(i, 6) & Arr(i, 7)If x = y ThenIf Arr(i, 8) <> "" Then d(Arr(i, 8)) = d(Arr(i, 8)) & i & ","End IfNextCall yyy(8)[b6] = "小组"ElseIf boBox2 <> "" Thenx = boBox1.Text & boBox2.TextFor i = 2 To UBound(Arr)y = CStr(Arr(i, 1)) & Arr(i, 6)If x = y ThenIf Arr(i, 7) <> "" Then d(Arr(i, 7)) = d(Arr(i, 7)) & i & ","End IfNextCall yyy(7)[b6] = "区域"Elsex = boBox1.TextFor i = 2 To UBound(Arr)y = CStr(Arr(i, 1))If x = y ThenIf Arr(i, 6) <> "" Then d(Arr(i, 6)) = d(Arr(i, 6)) & i & ","End IfNextCall yyy(6)[b6] = "城市"End If[b7].Resize(UBound(Brr), 6) = Brrm = [b65536].End(xlUp).Row[f7].Formula = "=rc[-2]/rc[-3]"[g7].Formula = "=rc[-2]/rc[-4]"If m > 7 Then[f7:g7].AutoFill [f7:g7].Resize(m - 6, 2)End Ifd.RemoveAll: Erase BrrEnd SubSub yyy(c)k = d.keyst = d.itemsReDim Brr(1 To d.Count, 1 To 6)For i = 0 To UBound(k)t(i) = Left(t(i), Len(t(i)) - 1)If InStr(t(i), ",") Thenaa = Split(t(i), ",")For j = 0 To UBound(aa)Brr(i + 1, 1) = Arr(aa(j), c)Brr(i + 1, 2) = Brr(i + 1, 2) + Arr(aa(j), 3)Brr(i + 1, 3) = Brr(i + 1, 3) + Arr(aa(j), 9)Brr(i + 1, 4) = Brr(i + 1, 4) + Arr(aa(j), 10)NextElseBrr(i + 1, 1) = Arr(t(i), c)Brr(i + 1, 2) = Brr(i + 1, 2) + Arr(t(i), 3)Brr(i + 1, 3) = Brr(i + 1, 3) + Arr(t(i), 9)Brr(i + 1, 4) = Brr(i + 1, 4) + Arr(t(i), 10)End IfNextEnd SubPrivate Sub Worksheet_Activate()Dim i&, xx, yy, zz, aa, bb, cp, fl, xhOn Error Resume NextArr = Sheet1.[a1].CurrentRegionFor i = 2 To UBound(Arr)xx = Arr(i, 1) & ""yy = Arr(i, 6)zz = Arr(i, 7)aa = Arr(i, 8)cp = Arr(i, 1) & Arr(i, 6)fl = Arr(i, 1) & Arr(i, 6) & Arr(i, 7)If d1.Exists(xx) = False Then Set d1(xx) = New DictionaryIf yy <> "" Then d1(xx)(yy) = yyIf d2.Exists(cp) = False Then Set d2(cp) = New DictionaryIf zz <> "" Then d2(cp)(zz) = zzIf d3.Exists(fl) = False Then Set d3(fl) = New DictionaryIf aa <> "" Then d3(fl)(aa) = aaNextboBox1.List = d1.keysEnd Sub10,3级字典嵌套‘2013-3-8‘/forum.php?mod=viewthread&tid=989716&page=1&extra=#pid676777 9Sub lqxs()Dim Arr2, Arr3, Arr4, i&, x$, y$, j&, aa, bb, cp$Dim d, k, t, k1, t1, k2, t2, k3, t3, kk, tt, jj&, s&Dim Arr33, Arr5Set d = CreateObject("Scripting.Dictionary")Set d1 = CreateObject("Scripting.Dictionary")Sheet1.Activate[a2:l10].ClearContentsArr2 = Sheet2.[a1].CurrentRegionFor i = 2 To UBound(Arr2)d(Arr2(i, 1)) = d(Arr2(i, 1)) & i & ","Nextk = d.keyst = d.items: d.RemoveAllArr3 = Sheet3.[a1].CurrentRegionArr33 = Sheet3.[b1].Resize(UBound(Arr3), UBound(Arr3, 2))For i = 2 To UBound(Arr3)x = Arr3(i, 1): y = Arr3(i, 2)If d.exists(x) = False Then Set d(x) = CreateObject("Scripting.Dictionary")d(x)(y) = d(x)(y) & i & ","Nextk1 = d.keyst1 = d.itemsArr4 = Sheet4.[a1].CurrentRegionArr5 = Sheet4.[b1].Resize(UBound(Arr4), UBound(Arr4, 2))For i = 2 To UBound(Arr4)x = Left(Arr4(i, 1), 1): y = Arr4(i, 1)cp = x & "," & yIf d1.exists(cp) = False Then Set d1(cp) = CreateObject("Scripting.Dictionary")d1(cp)(y) = d1(cp)(y) & i & ","Nextk2 = d1.keyst2 = d1.items: n = 2For i = 0 To UBound(k)t(i) = Left(t(i), Len(t(i)) - 1)Cells(n, 1).Resize(1, UBound(Arr2, 2)) = Application.Index(Arr2, t(i), 0)If d.exists(k(i)) Thenkk = t1(i).keys: tt = t1(i).itemsFor j = 0 To UBound(kk)cp = k(i) & "," & kk(j)tt(j) = Left(tt(j), Len(tt(j)) - 1)Cells(n, 5).Resize(1, UBound(Arr33, 2)) = Application.Index(Arr33, tt(j), 0)If d1.exists(cp) Thenk3 = t2(j).keyst3 = t2(j).itemsFor jj = 0 To UBound(k3)t3(jj) = Left(t3(jj), Len(t3(jj)) - 1)If InStr(t3(jj), ",") Thenbb = Split(t3(jj), ",")For s = 0 To UBound(bb)Cells(n, 9).Resize(1, UBound(Arr5, 2)) = Application.Index(Arr5, bb(s), 0)n = n + 1NextElseCells(n, 9).Resize(1, UBound(Arr5, 2)) = Application.Index(Arr5, t3(jj), 0)n = n + 1End IfNextElsen = n + 1End IfNextNextEnd Sub11,2级字典嵌套汇总‘2013-3-9‘/thread-990101-1-1.htmlSub lqxs()Dim Arr, i&, x$, y$Dim d, k, d1Set d = CreateObject("Scripting.Dictionary")Set d1 = CreateObject("Scripting.Dictionary")Sheet3.ActivateArr = Sheet1.[a1].CurrentRegionFor i = 2 To UBound(Arr)x = Arr(i, 5): y = Arr(i, 1)If d.exists(x) = False Then Set d(x) = CreateObject("Scripting.Dictionary")d(x)(y) = d(x)(y) + Arr(i, 8)Nextk = d.keysArr2 = Sheet2.[a1].CurrentRegionFor i = 2 To UBound(Arr2)x = Arr2(i, 2): y = Left(Arr2(i, 1), 7)If d1.exists(x) = False Then Set d1(x) = CreateObject("Scripting.Dictionary")d1(x)(y) = d1(x)(y) + Arr2(i, 3)Next[a2].Resize(d.Count) = Application.Transpose(k)For i = 0 To UBound(k)Cells(i + 2, 2) = d(k(i))(CStr([b1].Value))Cells(i + 2, 3) = d(k(i))(CStr([c1].Value))Cells(i + 2, 4) = Cells(i + 2, 2) + Cells(i + 2, 3) - d1(k(i))(CStr([b1].Value)) - d1(k(i))(CStr([c1].Value))NextEnd Sub12,2级字典嵌套(数据有效性)‘/thread-922132-1-1.htmlPrivate Sub Worksheet_SelectionChange(ByVal Target As Range)If Target.Count > 1 Then Exit SubIf (Target.Column <> 4 And Target.Column <> 6) Or Target.Row < 2 Then Exit Sub Dim t, Arr, dDim i&, x$, Brr, y$Set d = CreateObject("Scripting.Dictionary")Arr = Sheet10.[f1].CurrentRegionFor i = 2 To UBound(Arr)x = Arr(i, 1): y = Arr(i, 2)If d.exists(x) = False Then Set d(x) = CreateObject("Scripting.Dictionary")d(x)(y) = yNextIf Target.Column = 4 ThenWith Target.Validation.Delete.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _Operator:=xlBetween, Formula1:=Join(d.keys, ",")End WithTarget.Offset(0, 2) = ""Elsex = Target.Offset(0, -2).ValueIf d.exists(x) Thent = d(x).keysWith Target.Validation.Delete.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _Operator:=xlBetween, Formula1:=IIf(UBound(t) <> -1, Join(t, ","), t) End WithElseTarget = ""End IfEnd IfEnd Sub13,2级字典嵌套(成绩提取)‘2013-3-24‘/thread-995893-1-1.htmlSub lqxs()Dim Arr, i&, Arr1, x$, y$, funm$, myPath$, myName$, BrrDim d, k, t, wb As Workbook, a, b, aa, j&, zh, ps, txt$, mx1, mx2Application.ScreenUpdating = FalseSet d = CreateObject("Scripting.Dictionary")Sheet1.ActivateArr1 = [a1].CurrentRegion[a1].CurrentRegion.ClearCommentsSet wb = ThisWorkbookfunm = myPath = ThisWorkbook.Path & "\"myName = Dir(myPath & "*.xlsx")Do While myName <> "" And myName <> funmWith GetObject(myPath & myName)Arr = .Sheets(1).Range("a1").CurrentRegion.Close FalseFor i = 1 To UBound(Arr, 2)If Arr(1, i) = "学号" Then c1 = iIf Arr(1, i) = "课程名称" Then c2 = i: Exit ForNextFor i = 2 To UBound(Arr)x = Arr(i, c1): y = Arr(i, c2)If d.exists(x) = False Then Set d(x) = CreateObject("Scripting.Dictionary")d(x)(y) = d(x)(y) & Arr(i, c2 + 1) & "," & Arr(i, c2 + 2) & "|"NextEnd WithmyName = DirLoopk = d.keys: t = d.itemsFor i = 9 To UBound(Arr1) - 1x = Arr1(i, 2)If d.exists(x) ThenFor j = 6 To UBound(Arr1, 2) Step 2y = Arr1(7, j)If d(x).exists(y) Thena = d(x)(y)a = Left(a, Len(a) - 1)If InStr(a, "|") Thenaa = Split(a, "|")mx1 = 0: mx2 = 0: txt = ""For ii = 0 To UBound(aa)txt = txt & ii + 1 & "," & aa(ii) & vbCrLfb = Split(aa(ii), ",")zh = Val(b(0)): ps = V al(b(1))If zh > mx1 Then mx1 = zhIf ps > mx2 Then mx2 = psNextCells(i, j).AddComment Text:=txtArr1(i, j) = mx1: Arr1(i, j + 1) = mx2Elseaa = Split(a, ",")Arr1(i, j) = aa(0): Arr1(i, j + 1) = aa(1)End IfEnd IfNextEnd IfNextColumns("b:b").NumberFormatLocal = "@"[a1].CurrentRegion = Arr1Application.ScreenUpdating = TrueEnd Sub14,多条件查询‘2013-5-19‘/thread-1018683-1-1.htmlSub lqxs()Dim Arr, i&, d, k, t, d1, Brr, j&, Arr1Dim x$, y, z$, a$, b$, c$Set d = CreateObject("Scripting.Dictionary")Set d1 = CreateObject("Scripting.Dictionary")Sheet1.Activate[b5:p6].ClearContents[b5:p6].Borders.LineStyle = xlNoneArr1 = [a1].CurrentRegionArr = Sheet2.[a1].CurrentRegionFor i = 3 To UBound(Arr, 2)d1(Arr(2, i)) = iNextk1 = d1.keys[b5].Resize(1, d1.Count) = k1[b5].Resize(2, d1.Count).Borders.LineStyle = 1ReDim Brr(1 To d1.Count)For j = 3 To UBound(Arr, 2)For i = 3 To UBound(Arr)x = Arr(i, 1): z = Arr(i, 2): y = Arr(2, j)a = x & "|" & z:b = x & "|" & y:c = z & "|" & yIf d.exists(a) = False Then Set d(a) = CreateObject("Scripting.Dictionary")d(a)(y) = d(a)(y) + Arr(i, j)d(b) = d(b) + Arr(i, j)d(c) = d(c) + Arr(i, j)NextNextk = d.keys: t = d.itemsFor j = 2 To UBound(Arr1, 2)If Arr1(1, j) <> "" ThenIf Arr1(2, j) <> "" Thena = Arr1(1, j) & "|" & Arr1(2, j)For i = 0 To UBound(k1)tt = d(a)(k1(i))Brr(i + 1) = Brr(i + 1) + d(a)(k1(i))NextElseFor i = 0 To UBound(k1)b = Arr1(1, j) & "|" & k1(i)Brr(i + 1) = Brr(i + 1) + d(b)NextEnd IfElseIf Arr1(2, j) <> "" ThenFor i = 0 To UBound(k1)c = Arr1(2, j) & "|" & k1(i)Brr(i + 1) = Brr(i + 1) + d(c)NextEnd IfEnd IfNext[b6].Resize(1, d1.Count) = BrrEnd Sub15,2级字典嵌套(分表)‘/thread-1026658-1-1.html‘Split Data0613.xlsmSub lqxs()Dim Arr, i&, x$, y$, Sht As WorksheetDim d, k, t, k1, t1, Myr&, rng As RangeSet d = CreateObject("Scripting.Dictionary")Application.ScreenUpdating = FalseApplication.DisplayAlerts = FalseFor Each Sht In SheetsIf <> "Data" And <> "模板" Then Sht.Delete NextSheet1.ActivateArr = [a1].CurrentRegionFor i = 2 To UBound(Arr)x = Arr(i, 2): y = Trim(Arr(i, 3))If d.exists(x) = False Then Set d(x) = CreateObject("Scripting.Dictionary")d(x)(y) = d(x)(y) + 1Nextk = d.keys: t = d.itemsFor i = 0 To UBound(k)Sheets("模板").Copy after:=Sheets(Sheets.Count)Set Sht = ActiveSheetWith Sht.Name = k(i)k1 = t(i).keyst1 = t(i).itemsSet rng = .[a31:d38].[a31] = k1(0).[d32] = t1(0)For j = 1 To UBound(k1)Myr = .[c65536].End(xlUp).Row + 1rng.Copy .Cells(Myr, 1).Cells(Myr, 1) = k1(j).Cells(Myr + 1, 4) = t1(j)NextEnd WithNextApplication.DisplayAlerts = TrueApplication.ScreenUpdating = TrueEnd Sub16,中国式排名(D列)‘/thread-1103691-1-1.htmlSub lqxs()Dim Arr, i&, x, y$, j&, aa, Brr, Crr, cDim d, k, t, d1, k1, t1, kk, ttSet d = CreateObject("Scripting.Dictionary")Set d1 = CreateObject("Scripting.Dictionary")Sheet1.Activate[d2:e5000].ClearContentsArr = [a1].CurrentRegionFor i = 2 To UBound(Arr)x = Arr(i, 1): y = Arr(i, 2)If d.exists(x) = False Then Set d(x) = CreateObject("Scripting.Dictionary") d(x)(y) = d(x)(y) & i & ","Nextk = d.keys: t = d.itemsFor i = 0 To UBound(k)kk = t(i).keys: tt = t(i).itemsFor ii = 0 To UBound(kk)tt(ii) = Left(tt(ii), Len(tt(ii)) - 1): n = 0: n1 = 0If InStr(tt(ii), ",") Thenaa = Split(tt(ii), ",")ReDim Brr(UBound(aa))ReDim Crr(UBound(aa))For j = 0 To UBound(aa)Brr(j) = Arr(aa(j), 3)NextFor j = 0 To UBound(Brr)d1(Brr(j)) = d1(Brr(j)) & aa(j) & ","Nextk1 = d1.keys: t1 = d1.itemsd1.RemoveAllFor j = 0 To UBound(k1)t1(j) = Left(t1(j), Len(t1(j)) - 1)If InStr(t1(j), ",") Thena = Split(t1(j), ",")n = n + 1: n1 = n1 + 1For jj = 0 To UBound(a)Arr(a(jj), 4) = nArr(a(jj), 5) = n1Nextn1 = n1 + UBound(a)Elsen = n + 1Arr(t1(j), 4) = nn1 = n1 + 1Arr(t1(j), 5) = n1End IfNextElseArr(tt(ii), 4) = 1Arr(tt(ii), 5) = 1End IfNextNext[a1].CurrentRegion = ArrEnd Sub17,多级字典嵌套by:lee1892'===============================================' 字典实现的多级单元格下拉示例' By Lee1892 @ ExcelHome 2011.05.06'-----------------------------------------------' 此示例中:' Sheet1 为需要实现级联的表单' Sheet2 为存放级联内容的表单' 涉及到的事件包括:' Workbook 的Open 事件' Sheet1 的Change 事件' Sheet2 的Change 事件'-----------------------------------------------' 可以实现的功能:' 1 根据级联内容表单的内容自动生成动态级联下拉单,' 没有级联层数的限制' 2 可以随时更新级联内容,包括级联的层数和内容。
excel提取与去除汉字vba
Excel是办公人员常用的一款电子表格软件,通过Excel可以在电脑上进行大量的数据处理和分析。
在Excel中,我们经常会遇到需要提取或者去除汉字的情况,这就要用到VBA(Visual Basic for Applications)编程语言来实现。
接下来,我们将详细介绍在Excel中如何利用VBA来进行汉字的提取和去除。
一、VBA简介VBA是一种基于微软的基本语言,它是一种用于自定义办公软件的编程语言。
通过VBA,用户可以在Excel中进行自定义的数据处理和分析,包括提取和去除汉字,实现更加灵活和高效的数据处理功能。
二、VBA提取汉字在Excel中,我们可以通过VBA来提取单元格中的汉字,具体的步骤如下:1. 打开Excel,按下“ALT+F11”快捷键,打开VBA编辑器;2. 在VBA编辑器中,插入一个新的模块;3. 在新的模块中编写提取汉字的VBA代码,例如:```Function ExtractChinese(inputString As String) As StringDim i As IntegerDim result As Stringresult = ""For i = 1 To Len(inputString)If Asc(Mid(inputString, i, 1)) > 127 Thenresult = result Mid(inputString, i, 1)End IfNext iExtractChinese = resultEnd Function```4. 返回Excel界面,在单元格中输入提取汉字的函数“=ExtractChinese(A1)”即可提取A1单元格中的汉字。
通过以上步骤,我们就可以利用VBA在Excel中实现汉字的提取功能。
三、VBA去除汉字除了提取汉字,有时候我们也需要在Excel中去除汉字,同样可以通过VBA来实现,具体的步骤如下:1. 打开Excel,按下“ALT+F11”快捷键,打开VBA编辑器;2. 在VBA编辑器中,插入一个新的模块;3. 在新的模块中编写去除汉字的VBA代码,例如:```Function RemoveChinese(inputString As String) As StringDim i As IntegerDim result As Stringresult = ""For i = 1 To Len(inputString)If Asc(Mid(inputString, i, 1)) < 128 Thenresult = result Mid(inputString, i, 1)End IfNext iRemoveChinese = resultEnd Function```4. 返回Excel界面,在单元格中输入去除汉字的函数“=RemoveChinese(A1)”即可去除A1单元格中的汉字。
ExcelVBA字典
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。
Excel之VBA常用功能应用篇:应用字典进行编程快速提高数据处理能力
Excel之VBA常用功能应用篇:应用字典进行编程快速提高数据处理能力No.1字典应用是一个十分高效的方法,可以成对数据处理,像一把利器,各种应用能力体现。
下面重点介绍创建和应用字典的方法。
创建字典很简单只需要一行代码,如下所示:Set dic = CreateObject("Scripting.Dictionary")没技巧可言,记住就行了。
需要了解一下字典的几个属性和方法,如下图所示:下面用一个实例来,具体进行演示一下,如何进行字典应用。
No.2示例:本示例分别把两列赋值给一个字典对象,然后将字典值添加到ListBox列表框中,按钮可实现添加字典、删除字典和删除字典值的功能,实现过程如下。
新建字典代码:Public dic As ObjectPrivate Sub CommandButton1_Click()Dim arr1, arr2, i As Integerarr1 = ActiveSheet.Range("B3:B12")arr2 = ActiveSheet.Range("C3:C12")Set dic = CreateObject("Scripting.Dictionary") For i = 1 To UBound(arr1) - 1dic.Add arr1(i, 1), arr2(i, 1)Next iMe.ListBox1.ClearFor i = 1 To dic.CountWith Me.ListBox1.AddItem.List(i - 1, 0) = arr1(i, 1) '.List(i - 1, 1) = dic.Item(i)End WithNext i'MsgBox Join(dic.items)'MsgBox Join(dic.keys)End Sub删除字典Private Sub CommandButton2_Click()If Not VBA.IsObject(dic) Then Exit SubIf dic Is Nothing Then Exit Subdic.RemoveAllMe.ListBox1.ClearMsgBox "字典已经删除!"End Sub删除单项字典值Private Sub CommandButton3_Click()Dim dStr As StringIf Not VBA.IsObject(dic) Then Exit SubIf dic Is Nothing Then Exit SubIf Me.ListBox1.ListIndex < 0 Then Exit SubIf Me.ListBox1.Value = Null Then Exit SubIfdic.exists(VBA.CInt(Me.ListBox1.Value))Then '如果存在键dStr =dic.Item(VBA.CInt(Me.ListBox1.Value))dic.RemoveVBA.CInt(Me.ListBox1.Value)Me.ListBox1.RemoveItem(Me.ListBox1.ListIndex)MsgBox "你已经删除" & dStr,vbInformation, "提示"End IfEnd Sub代码相对复杂,主要是对一些可能是错误进行了判断筛选,不做过多讨论。
Excel初学者对于VBA字典法的理解
Excel初学者对于VBA字典法的理解本帖最后由 f8b1987 于 2012-6-8 12:34 编辑引用: 在引用工作表名称把单元格写入数组的话,定义数组不要使用dim arr()这种形式,使用dim arr即可。
接触了VBA字典法一段时间,虽然没有什么大的提升,总算对字典法有个初步的理解。
想当初,刚学的时候,可是问了很多幼稚的问题{:soso_e106:}。
对于字典法的含义解释,当然有EH VBA版主蓝桥玄霜的帖子:版主的帖子说得挺不错的。
但是,对于像我这种VBA学习水平不高且初学字典法的人,有很多地方还是有点难理解的。
在这里,我只作为一个菜鸟的理解,用菜鸟的语言对字典法进行基础解释。
我们看下面的代码:1.Sub 字典简要解释()2.Dim i As Integer, j As Integer, dic As Object, arr, brr3.'定义i、j,定义字典对象dic,定义动态数组arr、brr4.5.Set dic = CreateObject('scripting.dictionary')6.'固定用法,意为创建字典对象,这里的dic是变量,并非要求用dic。
7.brr = Sheet2.Range('a1').CurrentRegion8.'单元格区域装入数组,查看范围可以选择A1单元格,按下CTRL+*即可选定该范围9.arr = Sheet1.Range('a1').CurrentRegion10.11.12.For i = 2 To UBound(brr)13.dic(brr(i, 1)) = brr(i, 2)14.'字典(KEY)=item,意思是把brr(i,1)的值循环写入字典的key,并把brr(i,2)作为字典的item15.'dic锁的集合体,有很多锁。
好比是:锁头(钥匙)=打开锁的车子16.17.'Key = brr(i, 1)18.19.'理论上一条不同的钥匙只能打开一把锁,你能打开宝马的锁还是打开摩托车的锁,就取决于你的钥匙。
【ExcelVBA】使用字典快速提取不重复记录
【ExcelVBA】使⽤字典快速提取不重复记录数据去重复⼀直是数据整理过程中常见的问题之⼀,Excel解决⽅法有【删除重复项】、【⾼级筛选】、【数据透视表】、SQL语句、VBA的字典和集合等等……各有所长也各有所短。
可能还有⼩伙伴说还有函数……那啥……坦⽩说,“去重”⼀直都是函数最⼤的硬伤之⼀,虽然数组公式可以实现,但那些数组公式的适应性、可操作性和运算效率都是渣渣的⼀匹。
说来也是奇怪……绝⼤部分语⾔都有专门的去重函数,⽐如distinct,但偏偏Excel函数没有……从03到16⼗⼏年过去……⼀直没有…………。
说正事⼉……今天和⼤家分享的⽅法是VBA的字典法……。
举个栗⼦。
如下图所⽰,A列是⼀些数据,可能存在重复值,需要在C列得出不重复值,并告知不重复值的个数。
代码如下:Sub Mydistinct()'vba编程学习与实践~看见星光Dim d As Object, arr, brr, i&, k&, s$Set d = CreateObject('scripting.dictionary')'后期引⽤字典'pareMode = vbTextCompare'不区分字母⼤⼩写arr = Range('a1:a' & Cells(Rows.Count, 1).End(xlUp).Row)'数据源装⼊数组arrReDim brr(1 To UBound(arr), 1 To 1)'声明⼀个数组brr放结果。
For i = 2 To UBound(arr)'标题⾏不要,从第2⾏开始遍历s = arr(i, 1)'强制将数据转换成字符串类型,原因见⼩贴⼠If Not d.exists(s) Thend(s) = '''如果字典中不存在s,则作为关键字装⼊字典k = k + 1'累加个数brr(k, 1) = arr(i, 1)'装⼊结果数组End IfNext[c:c].ClearContents[c1] = '结果'With [c2].Resize(k, 1).NumberFormat = '@''设置⽂本格式,防⽌某些⽂本数值变形.Value = brrEnd WithMsgBox '⼀共为你提取了:' & k & '个不重复值。
ExcelVBA按照要求提取数据,数据及字典法
ExcelVBA按照要求提取数据,数据及字典法一组数据需要从原始的数据转换成要求的数据格式。
这个问题初看起来,只是一个行列转置的问题。
但是细看起来,又好像没那么简单。
原始有四列,而且还有空白的单元格。
这样的话我们就需要运算一下,把四列的数据转换成两列数据,并删掉空白单元格的数据。
然后在于要求数据格式就行对比,填入相应的分数数据就可以。
具体思路如下:按照上述的思路,我首先想到了使用数据的方式,然后再进行判断写入数据。
过程及代码如下:代码如下:Sub tjcj()Dim arr, i%, k%, kk%, brr()t = TimerApplication.ScreenUpdating = FalsenRow = Sheets('sheet1').Range('a' & Rows.Count).End(3).RowFor kk = 1 To nRow Step 9With Sheets('sheet1')arr = .Range('a' & kk).Resize(9, 4)nArr = UBound(arr)ReDim brr(1 To 20, 1 To 2)For i = 1 To nArrbrr(i, 1) = arr(i, 1)brr(i, 2) = arr(i, 2)Next iFor i = nArr + 1 To 2 * nArrbrr(i, 1) = arr(i - nArr, 3)brr(i, 2) = arr(i - nArr, 4)Next iEnd WithWith Sheets('sheet2')nrow1 = Range('a' & Rows.Count).End(3).Row + 1For i = 1 To UBound(brr)For j = 1 To UBound(brr)If Cells(1, i) = brr(j, 1) Then Cells(nrow1, i) = brr(j, 2)Next jNext iEnd WithNext kkApplication.ScreenUpdating = TrueMsgBox '本程序运行时间' & Format(Timer - t, '0.000')End Sub但是运行的时候,发现速度过慢,54行的数据处理,需要0.7s。
(最新整理)☆VBA字典的属性与方法
☆VBA字典的属性与方法编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(☆VBA字典的属性与方法)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为☆VBA字典的属性与方法的全部内容。
前言 (2)一、字典对象的方法 (3)(一)......................................................Add方法3(二).................................................Exists方法4(三).....................................................Keys方法4(四)....................................................Items方法5 (五)..................................................Remove方法6(六)...............................................RemoveAll方法6二、字典对象的属性. (7)(一)....................................................Count属性7 (二)......................................................Key属性7(三)....................................................Item属性8 (四)CompareMode属性 (9)前言凡是上过学校的人都使用过字典,从新华字典、成语词典,到英汉字典以及各种各样数不胜数的专业字典,字典是上学必备的、经常查阅的工具书。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 Explicit
'1 装入数据
Sub t1()
Dim D As New Dictionary
Dim x As Integer
For x = 2 To 4
D.Add Cells(x, 1).Value, Cells(x, 2).Value
Next x
MsgBox D.Keys(0)
MsgBox D.Keys(1)
MsgBox D.Keys(2)
MsgBox D.Items(0)
'Stop
End Sub
'2 读取数据
Sub t2()
' Dim D
Dim D As New Dictionary
Dim arr
Dim x As Integer
' Set D = CreateObject("scripting.dictionary")
For x = 2 To 4
D.Add Cells(x, 1).Value, Cells(x, 2).Value
Next x
MsgBox 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.Items
End Sub
'3 修改数据
Sub t3()
Dim D As New Dictionary
Dim x As Integer
For x = 2 To 4
D.Add Cells(x, 1).Value, Cells(x, 2).Value
Next x
D("李四") = 78
MsgBox D("李四")
D("赵六") = 100
MsgBox D("赵六")
End Sub
'4 删除数据
Sub t4()
Dim D As New Dictionary
Dim x As Integer
For x = 2 To 4
D(Cells(x, 1).Value) = Cells(x, 2).Value
Next x
D.Remove "李四"
' MsgBox d.Exists("李四")
D.RemoveAll
MsgBox D.Count
End Sub
'区分大小写
Dim D As New Dictionary
Dim x
For x = 1 To 5
D(Cells(x, 1).Value) = ""
Next x
Stop
End Sub
ub 求和问题()
Dim arr, D As Object, ar
Dim i As Integer, j As Byte
Set 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) Then
D(t) = t & "|" & (--Split(D(t), "|")(2) + arr(i, 3)) '如果有相应的key,则提取对应item的的销售额与现有的相加,再组合后存入字典
Else
D(t) = t & "|" & arr(i, 3) '如果没有相应的Key,则存入"日期|名称|销售额"
End If
Next i
ReDim arr(1 To D.Count, 1 To 3)
ar = D.Items
For i = 1 To UBound(ar) + 1
For j = 1 To 3
arr(i, j) = Split(ar(i - 1), "|")(j - 1)
Next j
Next i
Sheet3.Range("a1").CurrentRegion.ClearContents
Sheet3.Range("a1").Resize(UBound(arr), 3) = arr
End Sub
Option Explicit
Sub 多表双向查找()
Dim d As New Dictionary
Dim x, y
Dim arr
For x = 3 To 5
arr = Sheets(x).Range("a2").Resize(Sheets(x).Range("a65536").End(xlUp).Row - 1, 2) For y = 1 To UBound(arr)
d(arr(y, 1)) = arr(y, 2)
d(arr(y, 2)) = arr(y, 1)
Next y
Next x
MsgBox d("C1")
MsgBox d("吴情")
End Sub
Option Explicit
Sub 汇总()
Dim d As New Dictionary
Dim arr, x
arr = Range("a2:b10")
For x = 1 To UBound(arr)
d(arr(x, 1)) = d(arr(x, 1)) + arr(x, 2) 'key对应的item的值在原来的基础上加新的Next x
Range("d2").Resize(d.Count) = Application.Transpose(d.Keys)
Range("e2").Resize(d.Count) = Application.Transpose(d.Items)
End Sub
Option Explicit
Sub 提取不重复的产品()
Dim d As New Dictionary
Dim arr, x
arr = Range("a2:a12")
For x = 1 To UBound(arr)
d(arr(x, 1)) = ""
Next x
Range("c2").Resize(d.Count) = Application.Transpose(d.Keys)
End Sub。