《VBA.数组详解》由会员分享,可在线阅读,更多相关《VBA.数组详解(10页珍藏版)》请在金锄头文库上搜索。
1、Excel VBA数组入门教程(共 10 集)日期: 2011-08-07 来源: excel 精英培训作者:兰色幻想字体: 大 中小 1.前言:不要把 VBA 数组想的太神秘,它其实就是一组数字而已。2.数组的维数:Sub 数组示例 ()Dim x As Long, y As LongDim arr(1 To 10, 1 To 3) 创建一个可以容下10 行3列的数组空间For x = 1 To 4For y = 1 To 3arr(x, y) = Cells(x, y) 通过循环把单元格区域a1:c4 的数据装进数组中Next yNext xMsgBox arr(4, 3) 根据提供的行数
2、和列数显示数组arr(1, 2) = “ 我改一下试试“ 你可以随时修改数组内指定位置的数据MsgBox arr(1, 2)End Sub总结 :二维是由行和列表示的数组,如ARR(3,2) 表示数组中第3排第 2列的元素。而一维数组只是由一个元素决定,如ARR (4)表示数组中第4个元素3.把单元格数据搬入内存:一、声明:Dim arr as Variant 声明一个变量,不能声明其他数据类型Dim arr(1 to 10, 1 to 2 ) , 这种声明也是错误 的,固定大小的VBA 数组是不能一次性装入单元格数据或: dim arr() 这种声明方式是声明一个动态数组,也可以装入单元格区
3、域,构成一个 VBA 数组 。二、装入arr =range(“a9:c100“) 装入很简单,变量=单元格区域三、读出装入数组后的单元格数值,可以按数组名称 (行数 , 列数 )直接读取该位置的值,如下面的代码。Msgbox arr(3,2) 就可以取出搬过去的而构成的数组第3行第 2列的内容四、示例Sub s3()Dim arr() 声明一个动态数组(动态指不固定大小)Dim arr1 声明一个Variant 类型的变量arr = Range(“a1:c7“) 把单元格区域A1:C7的值装入数组arrarr1 = Range(“a1:c7“) 把单元格区域A1:C7的值装入数组arr1Msg
4、Box arr(1, 1) 读取 arr 数组中第 1行第 1列的数值MsgBox arr1(2, 3) 读取 arr1 数组的第 2行第 3列的数值End Sub4.把单元格数据搬入内存: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 把数组
5、放回到单元格中End SubSub 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 Sub5.动态数组的声明:Sub darr()Dim arr() 声明一个动态的arr 数组 (不知道它能盛多少数据)Dim kk = Application.WorksheetF
6、unction.CountIf(Range(“a2:a6“), “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 Sub6.动态数组的声明:arr(-19 to 8) 这个数组的编号就是从-19开始的 .那么它的最小编号就是-19, 最大编号是8,如果用语句返回就是:Sub t1()Dim arr(-19 To
7、8)MsgBox UBound (arr) 返回最大编号,结果为 8MsgBox LBound (arr) 返回最小编号 ,结果为 -19End Sub如果是有行列组成的二维数组呢?二维数组返回行的下标和列的下标见下例Sub t2()Dim arr(-19 To 8, 2 To 5)MsgBox UBound (arr) 返回第 1维(行的 )最大编号 ,结果为 8MsgBox LBound (arr) 返回第 1维(行的 )小编号 ,结果为 -19MsgBox UBound(arr, 2) 返回第 2维(列的 )最大编号 ,结果为 5MsgBox LBound(arr, 2) 返回第 2维(
8、列的 )最小编号 ,结果为 2End SubSub t3()Dim arrarr = Sheets(1).UsedRange Usedrange的行数和列数是未知的MsgBox UBound(arr, 1) 可以计算这个区域有多少行MsgBox UBound(arr, 2) 可以计算出这个区域有多少列End Sub7.使用 Array函数创建常量数组:使用 Array 函数创建数组1维常量数组:Array(“A“,1,“C“)2维常量数组:Array(Array(“a“, 10), Array(“b“, 20), Array(“c“, 30)也可以调用excel 工作表内存数组:1维数量:“A
9、“,1,“C“2维数量:“a“,10;“b“,20;“c“,30内存常量数组有什么作用呢?1、简化赋值比如:我需要给数组arr 分别赋值 10 ,20,30,40 ,一般就需要分别赋值,即:arr(1)=10arr(2)=20arr(3)=30arr(4)=40而使用常量数量,只一句话:arr=array(10,20,30,40)2、调用工作表函数时使用:Sub mylook()Dim arrarr = “a“,10;“b“,20;“c“,30MsgBox Application.VLookup(“b“, arr, 2, 0) 调用 vlookup 时可以作为第二个参数End Sub 8.数组
10、的合并和字符串拆分(Join & Split) :多个字符的合并和字符串按规律的拆分是经常遇到的,如:A-REW-E-RWC-2-RWC按分隔符 -拆分成 6个字符放在一个数组中有一组数 array(23,45,7,1,76)想用分隔符 -连接成一个字符串上面两种情况VBA 提供了一对函数,即:split(字符串 ,“分隔符 “)拆分字符串join(数组,“分隔符 “)用分隔连接数组的每个元成一个字符串Sub t1()Dim arr, myst As Stringmyst = “A-REW-E-RWC-2-RWC“arr = Split(myst, “-“)按 -分隔成一组数装入数组中MsgB
11、ox arr(0) 显示数组的第一个数(分隔后的数组最小下标为0,不是 1),显示结果为AMsgBox Join(arr, “,“) 再用 “,“把数组的每个值连接成一个字符串,结果为“A,REW,E,RWC,2,RWC“End Sub值得注意的是: split 和 join 只能对一维数组进行操作,如果是单元格或二维数组怎么办?只有一条途径,想办法转换为一维数组:Sub t2()Dim ARRARR = Application.Transpose(Range(“a1:a3“) ,用转置的方法,把单元格一列数据转换成一维数组MsgBox Join(ARR, “-“)End Sub9. Filt
12、er函数实现数组筛选:数组的筛选就是根据一定的条件,从数组中筛选符合条件的值,组成一个新的数组,实现数组筛选的 VBA 函数是:Filter 函数用法: Filter( 数组 ,筛选的字符 , 是否包含 ) Sub DD()arr = Array(“ABC“, “A“, “D“, “CA“, “ER“)arr1 = VBA.Filter(arr, “A“, True) 筛选所有含A 的数值组成一个新数组arr2 = VBA.Filter(arr, “A“, False) 筛选所有不含A 的数值组成一个新数组MsgBox Join(arr2, “,“) 查看筛选的结果End Sub遗憾的是函数只
13、能进行模糊筛选,不能精确匹配。10. VBA数组入门教程之10( 大结局 ):他山之石):他山之石,可以攻玉,VBA 中除可以利用的VBA 函数外,还可以调用众多的Excel 工作表函数对数组进行分解、查询和分析等, 调用工作表函数可以省去循环判断的麻烦,进而提高运行效率。一、数组的最值1、Max 和 Min工作表函数Max 和 Min 是求最大值和最小值的函数,同样在VBA 中也可以求数组的最大值和最小值。如:Sub t()arr = Array(1, 35, 4, 13)MsgBox Application.Max (arr) 最大值MsgBox Application.Min (arr)
14、 最小值End Sub2、large 和 small工作表函数large 和 small 是返回一组数的第N 大和第 N 小, 对 VBA 数组同样适用,如:Sub t1()arr = Array(1, 35, 4, 13)MsgBox Application.Large (arr, 2) 第2大值MsgBox Application.Small (arr, 2) 第2小值End Sub二、数组的统计与求和1、SumSum 函数可以在工作表中求,同样也可以对VBA 数组求和,如:Sub t2()arr = Array(1, 35, 4, 13)MsgBox Application.Sum(ar
15、r) 对数组进行求和End Sub2、Count 和 CountaCount 和 Counta 可以统计数组中数字的个数和数字+文本的个数。Sub t3()arr = Array(1, 35, “a“, 4, 13, “b“)MsgBox Application.Count(arr) 返回数字的个数4MsgBox Application.CountA(arr) ,返回数组文本和数字的总个数End Sub三、数组的查询和拆分1、Mach 查询数组Match 函数可以查询一个指定值在一组数中的位置,它也可以用于VBA数组的查询。如:Sub t4()arr = Array(1, 35, 4, 13)
16、MsgBox Application.Match(4, arr, 0) 查询数值 4在数组 Arr 中的位置End Sub2、Index 拆分数组数组的拆分在VBA 中是一个难题, 如果是按行拆分数组,除了用循环外也只能借用API 函数完成了。 幸好我们可以借用工作表函数index 达到按列拆分数组,即多列构成的数组,你可以任意拆分出一列构成新的数组。方法是:Application.Index(数组 , ,列数 ),例:Sub t2()arr2 = Range(“A1:B4“) ,把单元格区域A1: B4的值装入数组arr2arr3 = Application.Index(arr2, , 2) 把数组第 2列拆分出来装入新数组arr3 中,新数组为二维数组MsgBox arr3(2, 1) 取出新数组第2行的值End Sub四、数组维数的转换Transpose转置数组在工作表中可以把行列转换。在VBA 中同样也可以做到转换的效