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方法。

VBA的数组操作与应用实例

VBA的数组操作与应用实例

VBA的数组操作与应用实例数组是一种常用的数据结构,用于存储和处理大量相同类型的数据。

在VBA 中,数组提供了一种便捷的方式来组织和访问数据。

本文将介绍VBA中数组的操作方法,并结合实际应用案例展示其应用价值。

数组的创建和初始化在VBA中,可以使用Dim语句来声明和定义数组。

以下是一些常见的数组声明和初始化方式:1. 一维数组的声明和初始化:```vbaDim arr1(4) As Integer '声明一个包含5个元素的整型数组arr1(0) = 10 '初始化第一个元素为10arr1(1) = 20 '初始化第二个元素为20arr1(2) = 30 '初始化第三个元素为30arr1(3) = 40 '初始化第四个元素为40arr1(4) = 50 '初始化第五个元素为50```2. 多维数组的声明和初始化:```vbaDim arr2(2, 2) As Integer '声明一个3x3的整型数组arr2(0, 0) = 1 '初始化第一个元素为1arr2(0, 1) = 2 '初始化第二个元素为2arr2(0, 2) = 3 '初始化第三个元素为3arr2(1, 0) = 4 '初始化第四个元素为4arr2(1, 1) = 5 '初始化第五个元素为5arr2(1, 2) = 6 '初始化第六个元素为6arr2(2, 0) = 7 '初始化第七个元素为7arr2(2, 1) = 8 '初始化第八个元素为8arr2(2, 2) = 9 '初始化第九个元素为9```数组的访问和遍历可以使用下标来访问数组中的元素。

在VBA中,数组的下标从0开始。

以下是一些常见的数组遍历方式:1. 一维数组的遍历:```vbaFor i = 0 To UBound(arr1) '通过UBound函数获取数组的上界MsgBox arr1(i) '打印数组元素Next i```2. 多维数组的遍历:```vbaFor i = 0 To UBound(arr2, 1) '通过UBound函数获取数组第一维的上界For j = 0 To UBound(arr2, 2) '通过UBound函数获取数组第二维的上界MsgBox arr2(i, j) '打印数组元素Next jNext i```数组的排序和查找有时候,我们需要对数组进行排序或查找特定元素。

【原创】VBA学习笔记(12)VBA的数组array

【原创】VBA学习笔记(12)VBA的数组array

【原创】VBA学习笔记(12)VBA的数组array一数组 array1.1 什么是数组?具体的例子•以这个语句为例子•arr1=array(1, 2, 3)•左边:变量名=数组名•右边:数组,集合,多个元素集合,多个数据集合,•右边的单个内容,1,2,3 是数组的元素/下标变量•每个元素存储时,会标记1个(看不见的)index 索引下标1.2 什么是数组,抽象的定义:数组也是变量,是一种可存储多个数据的特殊变量•VBA或其他语言里,变量是用来存储数据的。

•而一般来说,1个变量只能用来存储1个数据•现在来了1个特例,有高手发明了数组的概念:数组是一个特殊的变量,可以用来存储多个数据!(甚至是多维的多个数据!)•数组就是多个单位/元素(element)有序的,连续存储在一起作为一个整体,统一叫1个名字(数组名)1.3 数组的特点,index有序不重复,但数组的元素却可以重复•什么叫有序?•就是数组的内容存储是有序的•index 是有序(一般是从小到大)•index也应该是连续的,暂时没见过 index不连续的情况•index也不能重复•但是数组存储的内容,是可以重复的1.数组的index下标默认是从0开始的,比如split生成的,还有未指定index下标的,如 dim arr1(5)2.但是数组的index下标也有从1开始的情况,比如range 赋值的变量,默认下标从1开始,如 arr2=range("b1:d5")3.数组的index下标受控制的情况模块最前面 option base -14.数组index下标最好自己定义好,如 dim arr3(1 to 5)•Dim arr1(3) '其实是0-3,有4个元素•Dim arr1( 1 to 3) '其实是1-3,有3个元素•Option base 11.Sub test_array1()2.3.Dim arr1()4.Dim arr2()5.6.arr1() = Range("c1:c13")7.arr2() = Range("c1:o1")8.9.For i = 1 To 1310.Debug.Print arr1(i, 1)11.Next i12.13.14.For i = 1 To 1315.Debug.Print arr2(1, i)16.Next i17.18.End Sub1.4 数组的核心内容:就4个: 维数,每个维度大小,数据类型,数据举例:dim arr1(5) as integerdim arr2(2 to 6) as stringdim arr3(3,5) as integer1.数组的维数 : 数组可以是1维,2维等等,但数组的维数和嵌套不同!2.每个维数大小:每个维数的lbound() to ubound()3.数组存储数据的类型:可以是单一的,也可以是variant 变化的4.数组存储的内容:每个值的具体内容2 数组的分类•这些概念拿到前面说,是因为自己作为新手,发现很容易弄混概念,分不清什么静态数组,什么是界定清晰的数组?•数组定义和静态动态是相关的,•数组赋值也是和这些概念相关的,比如,静态数组不能被整体赋值,动态数组赋值前,要先界定清晰维数和大小等。

[VBA基础]数组常用知识点

[VBA基础]数组常用知识点

[VBA基础]数组常用知识点VBA中最常用的就是数组和字典,其中数组是必须也是常用的,关于数组的基本概念就不多说了,大家手里资料基本都有,今日我们说说数组的常用知识点:UBount和LBound函数那么,对于一个已经定义了的数组,我们想知道它的最大索引号(上界)和最小索引号(下界)是多少,怎么办呢?用UBound和LBound两个函数就可以了。

如,要想知道数组arr的上界是多少,则:UBound(arr)要想知道数组arr的下界是多少,则:LBound(arr)想知道数组有多少个元素,则:UBound(arr)- LBound(arr)+1Sub Savetime2020()Dim arr(10 To 50)MsgBox '数组的上标是:'& UBound(arr) & Chr(13) &'数组的下标是:' & LBound(arr) & Chr(13) &'数组的元素个数是:' & UBound(arr) - LBound(arr) + 1End Sub如果是一个二维数组,想知道它的上界是多少,就得指定维数Sub Savetime2020()Dim arr(1 To 10, 1 To 100)MsgBox '第一维的上界是:'& UBound(arr, 1) & Chr(13) & '第二维的上界是:'& UBound(arr, 2)End Sub使用Split创建数组arr= Split('A,B,C,CCC ',',')用Split把文本转换成数组,索引号总是从0开始。

通过Range创建数组比如想把A1:A100单元格的值给数组arr,代码还可以简单写为:arr= [a1:a100]Join函数Join的作用和Split的作用相反。

VBA与数组使用技巧与实例分享

VBA与数组使用技巧与实例分享

VBA与数组使用技巧与实例分享VBA(Visual Basic for Applications)是一种编程语言,用于自动化操作Microsoft Office应用程序,如Excel、Word和PowerPoint等。

VBA的数组是一种非常有用的数据结构,可以存储和处理多个相关数据项。

在本文中,我将分享一些VBA中数组的使用技巧,并提供一些实例来帮助你更好地理解。

1. 声明和初始化数组在VBA中,可以使用Dim语句声明数组,并使用赋值语句初始化它们。

例如,以下代码声明了一个名为myArray的整数数组,并将其初始化为包含5个元素的数组:```vbaDim myArray(1 To 5) As Integer```你还可以使用Array函数来初始化数组,如下所示:```vbaDim myArray() As VariantmyArray = Array(1, 2, 3, 4, 5)```2. 访问数组元素要访问数组中的元素,可以使用索引号。

在VBA中,数组索引从1开始。

例如,要访问上面示例中myArray的第三个元素,可以使用以下代码:```vbaDim value As Integervalue = myArray(3)```3. 更改数组大小在VBA中,可以使用ReDim语句更改数组的大小。

以下示例代码将myArray 的大小更改为10个元素:```vbaReDim Preserve myArray(1 To 10)```请注意,使用`Preserve`关键字可以保留原始数组中的数据。

4. 二维数组VBA也支持二维数组,即可以按行和列组织的数据结构。

以下示例展示了如何声明和初始化二维数组:```vbaDim myArray(1 To 3, 1 To 3) As Integer```你可以使用两个索引号来访问二维数组中的元素。

例如:```vbaDim value As Integervalue = myArray(2, 3)5. 遍历数组遍历数组是一个常见的操作,可以使用For循环来实现。

【跟我学ExcelVBA】第十三课:数组!

【跟我学ExcelVBA】第十三课:数组!

【跟我学ExcelVBA】第十三课:数组!什么是数组?输入数组需要按下Ctrl Shift Enter这三键么?每一段代码我们几乎都会运用到变量,而变量的运算事实上就是内存的运算。

如果我们一段代码会长期访问单元格或者其他对象时,会使运行速度大大降低,这样的话,我们就要想办法将这些运算放到内存中去。

所以,数组在这个时候出现了!那么,什么是数组?VBA数组就是储存一组数据的数据空间?数据类型可以数字,可以是文本,可以是对象,也可以是VBA数组(即数组嵌套)。

另外,VBA数组是以怎样的方式存在的呢?VBA数组是以变量形式存放的一个空间,它也有行有列,也可以是三维空间。

如下面表示数组的方式:1、常量数组:Array(1,2),Array('a','b','c')2、静态数组:arr(4) 有5个位置,起始编号为0。

arr(1)表示第二个数;arr(1 to 4) 有4个位置,起始编号为1。

arr(1)表示第一个数;arr(1 to 4,1 to 10) 二维数组,表示4行10列;arr(1 to 4),1 to 10,1 to 5) 三维数组,我们可以假想为一共有5个工作表,每个工作表中使用的区域都是4行10列;三维数组在实际运用中比较少,如果实在要用,我们可以使用一维数组嵌套二维数组的办法,这个技巧会在后续的实例中进行展示。

3、动态数组:arr(),暂时不知道有多少行列,在使用时需要重新指定。

可以用单元格区域赋值方式,也可以动态扩容。

数组的写入和读出,我们来看一段代码:1、循环式代码解析:此处,我们是以循环的方式写入数组的值,同样,我们可以使用循环的方式读出数组的值。

读出或者写入的方式,就是根据数组的行列序号,我们称为下标。

2、数组的动态定义代码解析:Redim:重新指定数组的大小,这种方式必须先定义一个不知道大小的数组。

3、由常量数组函数导入4、重点:由单元格区域导入和导出这是我们学习的重点,在Excel里面学习数组,我们最常见的就是和单元格打交道,如何将单元格内容放入数组或者如何将数组的计算结果放回到单元格中就尤为重要!!下面,我们介绍几个数组常用的属性和方法:1、UBound(数组):数组的最大行下标----常用;2、UBound(数组,2):数组的最大列下标-常用;3、三维数组使用的机率不多,大家知道怎样表示最大下标就是了;4、与UBound相反的就是LBound,这里就不多解释了。

[学习笔记-VBA-018]特殊的数组——字典

[学习笔记-VBA-018]特殊的数组——字典

[学习笔记-VBA-018]特殊的数组——字典字典(Dictionary)对象相当于一种联合数组,由具有唯一性的关键字(Key)和它的项(Item)联合组成。

本章主要完成对字典的6个方法,4个属性的基础学习,并简单理解两个典例。

01字典の方法字典有6个方法,分别为Add、Keys、Exists、Items、Remove、RemoveAll1. Add方法Object.Add(key,item)举个栗子dic.Add'a', '李白'dic.Add'b', 9'd.Add'b', 7'add重复的key会报错又举个栗子dic('b')= 7'或dic.Item('b')= 7,会直接覆盖,不会报错'通常使用String文本字符串作为字典key2. Keys方法Object.keys( )返回一个数组,其中包括dictionary对象中全部现有的关键词。

举个栗子Dim d, kSet d = CreateObject('Scripting.Dictionary')d.Add 'a', 'Athens'd.Add 'b', 'Belgrade'd.Add 'c', 'Cairo'k=d.Keys[A1].Resize(d.Count,1)=Application.Transpose(k)'把字典中所有的关键字赋给以B1单元格开始的单元格区域中.其中:1)dic.count为字典中关键词key的数量2)resize作为range对象的属性,用于调整指定区域的大小,[A1].Resize(dic.count,1)即把A1调整为A1:A3的区域3)k=dic.keys,一维数组,水平排列dic.Key('a')= 'e''替换key3. Exists方法Object.Exists(key)Cells(2, 1) =dic.Exists('b')dic.Add'b', 7Cells(2, 2) =dic.Exists('b')举个栗子Dim dSet d = CreateObject('Scripting.Dictionary')d.Add 'a', 'Athens'd.Add 'b', 'Belgrade'd.Add 'c', 'Cairo'If d.Exists('c') Thenmsgbox ('指定的关键字已经存在')Elsemsgbox( '指定的关键字不存在')End If4. Items方法Object.Items( )i=dic.Items[B1].Resize(dic.count,1)=Application.Transpose(i)5. Remove方法Object.Remove( )dic.Remove('b')'清除字典中“b”关键词对应的项6. RemoveAll方法Object.Removeall清空字典02字典の属性字典有 4 个属性:Count 、Key 、Item 、CompareMode.1. Count属性object.Countn = dic.Count2. Key属性object.Key(key) = newkey3. Item属性Object.Item(key)[ = newitem]用于写入或读取字典中指定键的值,如果指定的键不存在,则会新增。

VBA 中的数组操作技巧与案例分析

VBA 中的数组操作技巧与案例分析

VBA 中的数组操作技巧与案例分析在VBA编程语言中,数组操作是一项非常重要的技巧。

通过灵活的数组操作,我们可以简化代码、加快执行速度,并且能够处理更复杂的数据结构。

本文将介绍VBA中一些常用的数组操作技巧,并通过案例分析来说明它们的应用。

首先,让我们来了解一下什么是数组。

数组是一组按序排列的元素的集合,在VBA中可以用来存储和处理大量数据。

数组中的每个元素可以是任何数据类型,例如数字、字符串或对象。

一、数组的基本操作1. 声明数组在VBA中,我们可以使用Dim语句来声明一个数组。

例如,声明一个名为arrNumbers的整数数组可以使用以下代码:Dim arrNumbers() As Integer2. 初始化数组在声明数组后,我们需要初始化它们,即为数组分配内存空间并赋初值。

以下是几种初始化数组的方法:a) 使用Array函数可以使用Array函数来初始化一个一维数组。

例如,以下代码将初始化一个名为arrMonths的一维字符串数组,并给其中的元素赋值:arrMonths = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")b) 直接赋值我们也可以直接为数组元素赋值。

例如,以下代码将初始化一个名为arrNumbers的一维整数数组,并给其中的元素赋值:arrNumbers = [1, 2, 3, 4, 5]3. 访问数组元素可以使用索引来访问数组元素。

在VBA中,数组的索引是从0开始的。

VBA中常用的数据结构介绍

VBA中常用的数据结构介绍

VBA中常用的数据结构介绍在VBA(Visual Basic for Applications)编程语言中,数据结构是一种组织和存储数据的方式,它可以帮助程序员更有效地操作和管理数据。

在本文中,我们将介绍VBA中常用的数据结构,包括数组、集合和字典。

一、数组(Array)数组是VBA中最常用的数据结构之一,它是一组按顺序存储的相同类型的数据元素集合。

数组可以是一维、二维或多维的。

1. 声明和初始化数组在VBA中,可以使用Dim语句声明一个数组,并使用赋值语句或Array函数来初始化数组。

例如:Dim myArray(4) As Integer '声明一个包含5个整数元素的一维数组myArray = Array(1, 2, 3, 4, 5) '初始化数组元素2. 访问数组元素可以使用数组的索引来访问特定位置的元素。

数组的索引从0开始,因此myArray(0)表示数组的第一个元素,myArray(4)表示最后一个元素。

3. 动态数组VBA也支持动态数组,即在运行时根据需要改变数组的大小。

使用ReDim语句可以重新定义数组的维数和大小。

例如:ReDim Preserve myArray(6) '将数组的大小调整为7二、集合(Collection)集合是VBA中另一个常用的数据结构,它是一组相关对象的集合。

与数组不同,集合可以包含不同类型的对象,并且它们的顺序是无关紧要的。

1. 创建和操作集合可以使用CreateObject函数来创建一个集合对象,并使用Add方法将对象添加到集合中。

例如:Dim myCollection As ObjectSet myCollection = CreateObject("Scripting.Dictionary")myCollection.Add "Name", "John"myCollection.Add "Age", 252. 遍历集合可以使用For Each语句来遍历集合中的元素。

【ExcelVBA】字典+数组实现快速汇总

【ExcelVBA】字典+数组实现快速汇总

【ExcelVBA】字典+数组实现快速汇总数据合并的要点有三个:料号和机种号为统计的关键字段未交数量求和交期汇总,包含时间和数量示例代码Sub LoadData()Dim aData, aRes(), lst, iRow, iCol, iKeyCol, DicConst COLUMNS_QTY = 21With Sheets("交货排程")iKeyCol = 5lst = .Cells(.Rows.Count, iKeyCol).End(xlUp).RowaData = .Cells(2, 1).Resize(lst, COLUMNS_QTY).ValueEnd WithSet Dic = CreateObject("ing.Dictionary")For iRow = 3 To UBound(aData, 1)skey = aData(iRow, 5) & "|" & aData(iRow, 6)If Len(skey) > 1 ThenIf Dic.exists(skey) ThenDic(skey) = Array(Val(aData(iRow, 9)) + Dic(skey)(0), Dic(skey)(1))ElseDic(skey) = Array(Val(aData(iRow, 9)), "")End IfFor iCol = 11 To UBound(aData, 2)If Val(aData(iRow, iCol)) > 0 Thensdate = VBA.Replace(Format(aData(2, iCol), "m-d"), "-", "/") Debug.Print Dic(skey)(1) & "," & sdate & "*" & aData(iRow, iCol)Dic(skey) = Array(Dic(skey)(0), Dic(skey)(1) & "," & sdate & "*" & aData(iRow, iCol))End IfNext iColEnd IfNext iRowReDim aRes(1 To Dic.Count, 1 To 4)n= 1For Each d In Dic.keysakey = Split(d, "|")aRes(n, 1) = akey(0)aRes(n, 2) = akey(1)aRes(n, 3) = Dic(d)(0)aRes(n, 4) = Mid(Dic(d)(1), 2)n= n + 1Next'结果数组aRes回写到工作表中With Sheets("结果").Range("2:10000").ClearContents.Cells(2, 1).Resize(Dic.Count, 4).Value = aRes.Range("a1").CurrentRegion.Borders.LineStyle = xlContinuousEnd WithSet Dic = NothingEnd Sub代码解析对于需要进行排重统计的应用,使用数组就可以实现,对于每个数据行都需要循环对比数组的全部元素,然而字典对象元素具有唯一性,因此对于排重统计有着独到的优势。

VBA中的数组处理及其应用实例

VBA中的数组处理及其应用实例

VBA中的数组处理及其应用实例在VBA编程中,数组是一种非常有用的数据结构,它可以存储多个相同类型的元素。

对于处理大量的数据或需要进行重复操作的任务,使用数组可以提高代码的效率和可读性。

本文将介绍VBA中的数组处理以及其在实际应用中的示例。

1. 数组的基本概念和声明在VBA中,数组可以是一维或多维的,可以存储整数、浮点数、字符串等类型的数据。

声明一个数组需要指定其数据类型和维度。

以下是几种常见的数组声明方式:1.1 一维数组的声明和初始化:```vbaDim array1(10) As Integer '声明一个包含11个整数元素的数组Dim array2() As String '声明一个动态大小的字符串数组ReDim array2(5) '重新定义数组大小为6个字符串元素```1.2 多维数组的声明和初始化:```vbaDim array3(10,5) As Double '声明一个11行6列的二维数组Dim array4(3,3,3) As String '声明一个4层4行4列的三维数组```2. 数组的遍历和操作2.1 遍历一维数组:```vbaDim i As IntegerFor i = LBound(array1) To UBound(array1)'对每个元素进行操作...Next i```2.2 遍历二维数组:```vbaDim i As Integer, j As IntegerFor i = LBound(array3, 1) To UBound(array3, 1)For j = LBound(array3, 2) To UBound(array3, 2) '对每个元素进行操作...Next jNext i```3. 数组的排序和查找VBA提供了一些内置的函数和方法来对数组进行排序和查找操作。

3.1 排序数组:可以使用`Sort`函数对一维数组进行排序。

ExcelVBA入门(二)数组和字典

ExcelVBA入门(二)数组和字典

ExcelVBA入门(二)数组和字典数组和字典也是VBA的常用到数据类型之一。

但是我翻了有四五本VBA教程相关的书,里面都没有介绍到字典,数组到是在介绍数据类型时有介绍,而并没有提到字典。

事实上,字典不是VBA内置的类型,它是Windows脚本语言的。

但其实字典在VBA中也是非常重要的,它非常适用于需要进行非重复性数据的操作。

我多次需要使用到字典,但很少用到数组。

1. 数组如果有学过其它编程语言,应该对数组不陌生。

其实数组就是多个变量的集合,而且它是有顺序的,通过索引来访问一个数组中的各个值。

但应该记住的是:数组中的各个数据,它们的类型必须是相同的。

数组也应当要先声明,后使用。

VBA中的数组有动态数组和静态数组之分。

1.1 静态数组所谓静态数组,即它的长度是固定不可变的。

声明语法如下:Dim 数组名(a to b) As 数据类型其中a和b均为数字,表示数据的索引起始值。

也可以只写一个数字,则此时数组使用默认索引,从1开始,数字表示它的长度。

例如:Dim MyArray1(10) As StringDim MyArray2(10 to 20) As String1.2 动态数组如果在定义时并不知道需要使用的数组的长度是多少,则可以定义它为动态数组:Dim Myarr3() As String可以看到,定义动态数组,只需要在括号里面留空就行了。

待确定了数组的长度之后,可以使用ReDim来重新定义数组1.3 数组的赋值与取值虽然都是通过索引来对数组进行赋值,但与其它主流的编程语言不同的是,VBA中不是使用中括号[]而是使用小括号()进行的。

Dim arr(5) As StringFor i = 1 to 5'赋值arr(i) = iNext'取值Debug.Print arr(1)此外,也可以直接把Excel单元格中的数据赋值给数组。

如上面定义的长度为5的一维数组,可以以以下方式把单元格中A1到A5的数据分别载入到数组arr中:arr = Range("A1:A5")1.4 多维数组VBA中也支持多维数组。

VBA字典与数组知识与实例----字典

VBA字典与数组知识与实例----字典

******************************************************************************* ** 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。

vba用数组字典进行匹配的方法

vba用数组字典进行匹配的方法

VBA 使用数组和字典进行数据匹配在 Excel 中,使用 VBA 进行数据匹配是一种常用的技术。

本文介绍了使用数组和字典进行数据匹配的两种方法,并比较了它们的优缺点。

下面是本店铺为大家精心编写的3篇《VBA 使用数组和字典进行数据匹配》,供大家借鉴与参考,希望对大家有所帮助。

《VBA 使用数组和字典进行数据匹配》篇1在 Excel 中,使用 VBA 进行数据匹配是一种常用的技术。

通常,数据匹配的目的是为了找到两个或多个数据集之间的相似之处,或者将一个数据集与另一个数据集中的某个值进行匹配。

在 VBA 中,有两种常见的数据匹配方法:使用数组和使用字典。

使用数组进行数据匹配使用数组进行数据匹配的方法通常是使用循环结构来遍历两个数组,并比较它们之间的相似之处。

例如,假设我们有两个数组:arr1 和 arr2,我们需要找到它们之间的相似之处。

我们可以使用以下代码来实现:```Sub MatchArray()Dim arr1, arr2Dim i, j, kDim similarItems"填充 arr1 和 arr2 数组arr1 = Range("A1:A10").Valuearr2 = Range("B1:B10").Value"使用循环结构遍历两个数组For i = 1 To UBound(arr1)For j = 1 To UBound(arr2)If arr1(i, 1) = arr2(j, 1) Then"将相似项添加到 similarItems 数组中similarItems(k) = arr1(i, 1) & "," & arr2(j, 1)k = k + 1End IfNext jNext i"输出相似项MsgBox similarItemsEnd Sub```在上面的代码中,我们使用了两个嵌套的循环结构来遍历 arr1 和 arr2 数组。

VBA数组与字典知识与实例---数组

VBA数组与字典知识与实例---数组

**************************************************************************************************** * VBA数组教程 * * --------excel精英培训网:兰色幻想 *****************************************************************************************************从一个实例开始Sub v4() '运行时间0.01秒Dim tt = TimerFor x = 1 To 100000m = m + 1000 '真接调用内存中的值Next xMsgBox Timer - tEnd SubSub v5() '运行时间0.5秒Dim tt = TimerFor x = 1 To 100000m = m + Cells(1, 1) '调用单元格中的值Next xMsgBox Timer - tEnd Sub运行的结果是直接调用内存中的值比调用单元格的值快了50倍,为什么会这样呢?我们需要了解一下VBA的运算原理********** VBA的运算原理 *********VBA中的运算最终是在内存中进行的,如果数据已经在内存中,则直接进行运算,但如果数据是储存在第三方对象(如单元格里,控件里)里,则还需要先把数据从第三方对象里调入到内存中,然后再在内存中对数据进行运算。

如果把v5的程序进行稍微改动,运行时间会大大缩短。

Sub v5_2() '运行时间0.5秒Dim x, tt = Timerx = Cells(1, 1) '把单元格的值先交给变量For x = 1 To 100000m = m + xNext xMsgBox Timer - tEnd Sub如果VBA多次调用同一样单元格,我们可以先把这个单元格放在一个变量中,如果是多行多列的单元格区域呢?我们同样可以把把这个区域的值装入一个VBA变量。

字典及数组在vba中的运用

字典及数组在vba中的运用

字典及数组在vba中的运用这个例子包含ado和字典两种方法,以及数组在vba中的运用附代码简介:Private Sub CommandButton1_Click()'变量类型声明Dim i%, j%, r%, n%, s$, a$, ar, rn(), d As Object'测试a列数据最大行号r = Sheets("售价表").[a65536].End(xlUp).Row'键盘输入客户名a = InputBox(" 请输入需要查询的客户名:", "信息要求")'如果键盘输入取消或空白,或者a列数据最大行号小于2就退出If a = "" Or r < 2 Then Exit Sub'活动工作表使用的区域向下偏移1行的区域清除内容edRange.Offset(1).ClearContents'售价表中以a2单元格为左上角,共r-1行9列的区域值储存到数组ar中ar = Sheets("售价表").[a2].Resize(r - 1, 9)'创建一个字典对象dSet d = CreateObject("Scripting.Dictionary")'在数据ar的每一行内循环For i = 1 To r - 1'判断数组ar的i行3列的值是否和键盘输入的名字一样If ar(i, 3) = a Then'数组i行的4列和8列连接起来储存到变量s中s = ar(i, 4) & ar(i, 8)'判断字典d中是否不存在s这个关键字If Not d.exists(s) Then'如果上面的判断为真,n的值增加1(整型变量n初始值为0)n = n + 1'把字符串s加入字典d为关键字,n为相应的条目d.Add s, n'重新声明动态数组rn的第二个维数,并保留以前的值ReDim Preserve rn(1 To 9, 1 To n)'循环数组的1至9列For j = 1 To 9'把符合条件的数组ar中i行的1至9列储存到数组rn的n列对应的1至9行中(转置)rn(j, n) = ar(i, j)Next'如果上面的判断为假,则执行下面的命令Else'下面意思参考上面(略)If ar(i, 1) > rn(1, d(s)) ThenFor j = 1 To 9rn(j, d(s)) = ar(i, j)NextEnd IfEnd IfEnd IfNext'如果n大于0,就把数组rn转置后添加到以单元格a2为左上角的n行9列的区域If n > 0 Then [a2].Resize(n, 9) = Application.Transpose(rn)'释放字典dSet d = Nothing'a到i列排序Range("a2:i" & n + 1).Sort Key1:=[d2], Order1:=1, Key2:=[a2], Order2:=1End SubPrivate Sub CommandButton2_Click()Dim n$, sql$, cnn As Objectn = InputBox(" 请输入需要查询的客户名:", "信息要求")If n = "" Then Exit SubedRange.Offset(1).ClearContents'创建ado连接对象Set cnn = CreateObject("ADODB.Connection")打开连接cnn,连接到活动工作薄cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & ActiveWorkbook.FullName'设置sql语句sql = "select a.* from [售价表$] a inner join (select 货号,单价,max(日期) as 日期 from [售价表$] where 客户='" & n & "' group by 货号,单价) b on a.货号 = b.货号 and a.单价 = b.单价 and a.日期= b.日期 order by a.货号,a.日期"'执行sql语句,并把结果放到以单元格Cells(2,1)为左上角的区域中Cells(2, 1).CopyFromRecordset cnn.Execute(sql)'关闭连接,释放连接对象cnn.Close: Set cnn = NothingEnd Sub'用户在工作表中的选择发生变动时执行下面的命令Private Sub Worksheet_SelectionChange(ByVal T As Range) '如果选项按钮OB1的值为False就退出此过程If OB1.Value = False Then Exit Sub'如果选择的单元格数多于1就退出If T.Cells.Count > 1 Then Exit Sub'如果选择的行数大于1并且列数等于4并且选择的单元格不为空就执行下面的命令If T.Row > 1 And T.Column = 4 And T <> "" Then'查找d列第一个包含和选择的单元格内容相同的某个单元格的行号r1 = [d:d].Find(T, , , 1, , 1).Row'最后一行r2 = [d:d].Find(T, , , 1, , 2).Row'选择最上面至最下面的所有行Rows(r1 & ":" & r2).SelectEnd IfEnd Sub。

【20180919】-VBA中数组、集合和字典(五)——字典的常用方法和属性

【20180919】-VBA中数组、集合和字典(五)——字典的常用方法和属性

【20180919】-VBA中数组、集合和字典(五)——字典的常用方法和属性大家好,我是中药党。

上次我们学习了集合的基础常用方法,这回我们一块学习一下ExcelVBA中字典(Dictionary)对象的相关知识。

在概念篇说过,字典不是VBA内置的类型,它是Windows脚本语言的。

字典对象相当于一种联合数组,它是由具有唯一性的关键字(Key)和它的项(Item)联合组成的一个集合。

因为字典和集合中的方法属性有很多相似之处,也很容易混淆,我们今天就边对比上次的集合相关知识边来学习一下字典的常用方法和属性吧。

1. Add方法Add语法:object.Add key, item乍一看,字典添加成员的方法怎么和集合一样啊,只是在Add方法里没有集合添加成员的两个可选参数before和after。

集合和字典添加成员的方法参数确实很像,我们一定要注意字典和集合中Add方法的区别:①参数顺序不同。

集合中的参数顺序是object.Add item,[key],而字典中的参数顺序是object.Add key, item,集合中是先item后key,字典中是先key后item,使用的时候千万别混淆了。

②对于字典来说,key和item两个都是必选参数;而集合中key是可选参数。

虽然语法中没有对参数的数据类型有要求,但是我们在添加成员的过程中,尽量不要使用对象作为key,应该使用字符串、数字等简单类型。

2.Item属性等等,有的小伙伴看到这一定会问了,在集合中Item是方法,在字典中Item怎么就变成属性了,是不是写错了呢?先别急,小伙伴们先看字典和集合对Item的描述:字典Item属性:对Dictionary 对象中指定的 Key,设置或返回一个Item。

集合Item方法:是利用位置或Key返回Collection 对象的指定成员。

下边看看字典和集合中Item的相同点和不同点:①字典的Item属性和集合的Item方法都可以根据key得到item,如下图:②集合中的数字索引代表的是集合中成员的位置,而字典中的数字索引必须在Add的时候添加,仅仅表示和item对应的一个key,不代表字典成员在字典中的位置。

VBA入门67:字典标记行--数组对数组

VBA入门67:字典标记行--数组对数组

VBA入门67:字典标记行--数组对数组将昨天的栗子略作修改,工序是文本,顺序乱。

有两个工作表A,B,A的单元格A1=B的单元格B10用VBA代码写下就是sheets('A').cells(1,1)=sheets('B').cells(10,2)有两个数组A,B,假设这两个数组都和工作表一样大,用数组来写上面的VBA就是 A(1,1)=B(10,2)。

在数组对数组赋值的时候(提取数据),A(1,1)=B(10,2)方式也是可行的。

就上面的栗子来写一段代码,代码大体和上一文章的代码差不多。

Sub bbq()Dim arr, brr, d As Object, d1 As ObjectSet d = CreateObject('scripting.dictionary')arr = [a2:c16] '数据源brr = [e1:o4] '转置的数据'将brr中的工序标记列For j = 2 To UBound(brr, 2)d(brr(1, j)) = jNext'字典标记行For i = 1 To UBound(arr)d(arr(i, 1) & arr(i, 2)) = i '标记行,如 A工序1=1 B工序2=6 d(arr(i, 1)) = d(arr(i, 1)) & ',' & arr(i, 2) '为split函数做准备NextFor i = 2 To UBound(brr)s = Split(d(brr(i, 1)), ',')For j = 1 To UBound(s)r = d(brr(i, 1) & s(j)) '读取行号(数组arr中)c = d(s(j)) '读取工序的列号(数组brr中)brr(i, c) = arr(r, 3) '数组对数组赋值NextNext'输出数组数据[e1].Resize(UBound(brr), UBound(brr, 2)) = brrEnd Sub结果:数组可以像工作表一样,不同(或相同)的工作表的单元格对单元格赋值。

vba数组与字典解决方案

vba数组与字典解决方案

vba数组与字典解决方案《VBA数组与字典解决方案》在VBA编程中,数组和字典都是非常重要的数据结构,它们分别用于存储和管理数据。

然而,在实际的应用中,我们经常会遇到需要同时使用数组和字典的情况,例如,在处理复杂的数据结构或者进行高效的数据操作时。

那么,如何巧妙地结合利用VBA数组和字典来解决实际的编程问题呢?下面将介绍一些常见的解决方案。

首先,数组和字典都可以用来存储数据,但它们的使用方式有所不同。

数组是一种有序的数据集合,可以通过索引来访问其中的元素;而字典则是一种键值对的数据集合,可以通过键来快速查找和访问对应的数值。

因此,我们可以利用数组来存储一系列的数据,然后利用字典来构建索引和快速查找需要的数据。

其次,VBA中的数组和字典都具有丰富的方法和属性,可以帮助我们实现各种数据操作。

例如,数组提供了诸如排序、遍历、查找等功能,可以帮助我们进行数据处理和分析;而字典则提供了诸如添加、删除、查找等功能,可以帮助我们构建和管理数据集合。

因此,我们可以根据具体的需求来选择合适的数据结构和方法,来实现高效和灵活的数据操作。

最后,VBA数组与字典的结合使用也可以实现一些高级的编程技巧。

例如,我们可以利用数组来存储数据,然后利用字典来构建索引和快速查找需要的数据;或者我们可以利用字典来构建数据集合,然后利用数组来进行数据处理和分析。

这种结合使用方式不仅可以帮助我们简化编程逻辑,还可以提高代码的执行效率和可维护性。

综上所述,《VBA数组与字典解决方案》是一本关于VBA编程技术的重要参考书,它介绍了如何利用数组和字典的特性来解决实际的编程问题。

通过学习和运用其中的方法和技巧,我们可以更加高效和灵活地处理各种数据操作,从而提升VBA 编程的水平和能力。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

**************************************************************************************************** * VBA数组教程 * * --------excel精英培训网:兰色幻想 *****************************************************************************************************从一个实例开始Sub v4() '运行时间0.01秒Dim tt = TimerFor x = 1 To 100000m = m + 1000 '真接调用内存中的值Next xMsgBox Timer - tEnd SubSub v5() '运行时间0.5秒Dim tt = TimerFor x = 1 To 100000m = m + Cells(1, 1) '调用单元格中的值Next xMsgBox Timer - tEnd Sub运行的结果是直接调用内存中的值比调用单元格的值快了50倍,为什么会这样呢?我们需要了解一下VBA的运算原理********** VBA的运算原理 *********VBA中的运算最终是在内存中进行的,如果数据已经在内存中,则直接进行运算,但如果数据是储存在第三方对象(如单元格里,控件里)里,则还需要先把数据从第三方对象里调入到内存中,然后再在内存中对数据进行运算。

如果把v5的程序进行稍微改动,运行时间会大大缩短。

Sub v5_2() '运行时间0.5秒Dim x, tt = Timerx = Cells(1, 1) '把单元格的值先交给变量For x = 1 To 100000m = m + xNext xMsgBox Timer - tEnd Sub如果VBA多次调用同一样单元格,我们可以先把这个单元格放在一个变量中,如果是多行多列的单元格区域呢?我们同样可以把把这个区域的值装入一个VBA变量。

Sub v6()x = Range("a1:10000")End Sub这个VBA变量装入大于1个的数据时,就构成了VBA内存数组。

那什么是VBA数组呢?1、什么是VBA数组呢?VBA数组就是储存一组数据的数据空间。

数据类型可以数字,可以是文本,可以是对象,也可以是VBA数组。

2 VBA数组的分类A.按维数划分1维数组Sub t1()Dim arr(1 To 10)For x = 1 To 10arr(x) = xNext xStopEnd Sub2维数组Sub t2()Dim arr(1 To 10, 1 To 2)For x = 1 To 10For y = 1 To 2arr(x, y) = x * yNext yNext xStopEnd Sub3维数组Sub t3()Dim arr(1 To 10, 1 To 2, 1 To 3)For x = 1 To 10For y = 1 To 2For z = 1 To 3arr(x, y, z) = x * y + zNext zNext yNext xStopEnd SubB 按储存类型划分常量数组Sub t4()arr = Array(1, 2, 3, 4, 5)arr1 = Array(Array(1, 2), Array(10, 20), Array(100, 200)) '数组的中储存数组 arr2 = [{"a",1;"b",2;"c",3}] '调用工作表内存数组构成VBA二维数组StopEnd Sub静态数组:固定大小的数组静态数组声明方法dim/public/private 数组名称( 第一维数组上标 to 第一维数组下标,第二维上标to 第二维下标......)Sub t5()Dim arr1(10) '声明一个上标是0,下标是10的数组Dim arr2(1 To 10) '声明一个上标是1,下标是10的数组Dim arr3(1 To 10, 1 To 2) '声明一个10行2列的二维数组End Sub动态数组:大小不固定的数组动态数组的声明方法:和静态数组不同的时,动态数组需要先用Dim声明,数组大小得出结果后还需要再用Redim进行二次声明。

Dim 数组名称()Redim 数组名称( 第一维数组上标 to 第一维数组下标,第二维上标 to 第二维下标...) 例1:Sub darr()Dim arr() '声明一个动态的arr数组(不知道它能盛多少数据)Dim kk = Application.WorksheetFunction.CountIf(Range("a2:a60"), ">10") '计算大于10的个数 ReDim arr(1 To k) '再次声明arr的大小,正好盛下k数量的值For x = 2 To 6If Cells(x, 1) > 10 Thenm = m + 1arr(m) = Cells(x, 1) '通过循环把大于10的数字装入数组End IfNext xMsgBox arr(2)End Sub如果数组需要随一个变量不断的扩充,数组就需要多次声明,每扩充一次就声明一次:Redim Preserve (1 to k)如果数组是多维的,只能动态声明第末维的,如果需要把让第一维不断扩充,还需要先转置,有点麻烦,这里就不再详述,遇到这种情况,我们可以声明一个足够大的静态数组来取代动态数组,运行速度较前者快。

1 单元格区域存入VBA数组Sub test()Dim arr '声明一个变量用来盛放单元格数据Dim x As Integerarr = Range("a2:d5") '把单元格数据搬入到arr里,它有4列4行For x = 1 To 4 '通过循环在arr数组中循环arr(x, 4) = arr(x, 3) * arr(x, 2) '数组的第4列(金额)=第3列*第2例Next xRange("a2:d5") = arr '把数组放回到单元格中End Sub2 一维VBA数组放入单元格区域中Sub test1()Dim arr(1 To 5) '声明一维数组For x = 1 To 5arr(x) = x * 2 '通过循环给每个位置赋值Next xRange("A1:E1") = arr '把数组导入到excel中的a1:e1单元格中Range("A1:A5") = Application.Transpose(arr) '如果是放在一列中,就需要对数组进行转置后再存放End Sub1.计算VBA数组的大小Sub b1()Dim arr(-3 To 4)MsgBox UBound(arr) '下标MsgBox LBound(arr) '上标For x = -3 To 4arr(x) = x * 2Next xMsgBox Application.Count(arr) '含有数据元素的个数End SubSub b2()Dim arrarr = Sheets(1).UsedRange 'Usedrange的行数和列数是未知的MsgBox UBound(arr, 1) '可以计算这个区域有多少行MsgBox UBound(arr, 2) '可以计算出这个区域有多少列End Sub2.VBA数组的筛选Sub b3()arr = Array("ABC", "A", "D", "CA", "ER")arr1 = VBA.Filter(arr, "A", True) '筛选所有含A的数值组成一个新数组arr2 = VBA.Filter(arr, "A", False) '筛选所有不含A的数值组成一个新数组StopEnd Sub3 VBA数组的拆分与合并Sub t2()arr2 = Range("A1:B4") '把单元格区域A1:B4的值装入数组arr2arr3 = Application.Index(arr2, , 2) '把数组第2列拆分出来装入新数组arr3中, Stop新数组为二维数组End Sub如果想按行拆分,除了api函数外是没有其他办法的如果想把两个数组进行组合成一个数组,只有一个办法,就是通过循环4、VBA数组的最值Sub t3()arr = Array(1, 35, 4, 13)MsgBox Application.Max(arr) '最大值MsgBox Application.Min(arr) '最小值End SubSub t4()arr = Array(1, 35, 4, 13)MsgBox rge(arr, 2) '第2大值MsgBox Application.Small(arr, 2) '第2小值End Sub5 数组的统计与求和Sub t5()arr = Array(1, 35, 4, 13)MsgBox Application.Sum(arr) '对数组进行求和End SubSub t6()arr = Array(1, 35, "a", 4, 13, "b")MsgBox Application.Count(arr) '返回数字的个数4MsgBox Application.CountA(arr) '返回数组文本和数字的总个数End Sub6.数组的查询Sub t7()arr = Array(1, 35, 4, 13)MsgBox Application.Match(4, arr, 0) '查询数值4在数组Arr中的位置End Sub7 数组的转置Sub t8()arr = Array(1, 35, "a", 4, 13, "b")arr1 = Application.Transpose(arr)StopEnd SubSub t9()arr = Range("a1:a5")arr1 = Application.Transpose(arr)StopEnd Sub8.字符串与VBA数组Sub t1()Dim arr, myst As Stringmyst = "A-REW-E-RWC-2-RWC"arr = Split(myst, "-") '按-分隔成一组数装入数组中k = Join(arr, ",") '再用","把数组的每个值连接成一个字符串,结果为"A,REW, Stop E,RWC,2,RWC"End Sub9.巧妙利用数组的标因为数组的标是唯一的,所以我们就利用这个特点去除重复的数值Sub r1()Dim arr, arr2(1 To 13, 1 To 1)arr = Range("a1:a13")For x = 1 To UBound(arr)arr2(arr(x, 1), 1) = arr(x, 1)Next xRange("b1").Resize(13) = arr2End Sub10.重新初始化数组Sub r2()Dim arr(1 To 10)For x = 1 To 10arr(x) = xNext xStopErase arr '如果arr是动态数组,下次使用前还需要用redim设置数组的大小 StopFor x = 1 To 10arr(x) = xNext xStopEnd Sub。

相关文档
最新文档