当前位置:首页 >> 电脑基础知识 >>

VBA.数组详解


Excel VBA 数组入门教程 (共10集) 集
[日期:2011-08-07] [字体:大 中 来源:excel 精英培训 作者:兰色幻想 小]

1.前言:不要把 VBA 数组想的太神秘,它其实就是一组数字而已。 前言: 前言 2.数组的维数: 数组的维数: 数组的维数
Sub 数组示例() Dim x As Long, y As Long Dim arr(1 To 10, 1 To 3) '创建一个可以容下10行3列的数组空间 For x = 1 To 4 For y = 1 To 3 arr(x, y) = Cells(x, y) '通过循环把单元格区域 a1:c4的数据装进数组中 Next y Next x MsgBox arr(4, 3) '根据提供的行数和列数显示数组 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() 一个 VBA 数组。

这种声明方式是声明一个动态数组,也可以装入单元格区域,构成

二、装入 arr =range("a9:c100") '装入很简单,变量 =单元格区域

三、读出

装入数组后的单元格数值,可以按 数组名称(行数,列数)直接读取该位置的值, 如下面的代码。 Msgbox arr(3,2) 四、示例 Sub s3() Dim arr() '声明一个动态数组(动态指不固定大小) Dim arr1 '声明一个 Variant 类型的变量 arr = Range("a1:c7") arr1 = Range("a1:c7") MsgBox arr(1, 1) '把单元格区域 A1:C7的值装入数组 arr '把单元格区域 A1:C7的值装入数组 arr1 '就可以取出搬过去的而构成的数组第3行第2列的内容

'读取 arr 数组中第1行第1列的数值

MsgBox arr1(2, 3) '读取 arr1数组的第2行第3列的数值 End Sub

4.把单元格数据搬入内存: 把单元格数据搬入内存: 把单元格数据搬入内存
Sub test() Dim arr '声明一个变量用来盛放单元格数据

Dim x As Integer arr = Range("a2:d5") For x = 1 To 4 '把单元格数据搬入到 arr 里,它有4列4行

'通过循环在 arr 数组中循环 '数组的第4列(金额)=第3列*第2例

arr(x, 4) = arr(x, 3) * arr(x, 2) Next x Range("a2:d5") = arr End Sub

'把数组放回到单元格中

Sub test1() Dim arr(1 To 5) '声明一维数组 For x = 1 To 5 arr(x) = x * 2 '通过循环给每个位置赋值 Next x Range("A1:E1") = arr '把数组导入到 excel 中的 a1:e1单元格中 Range("A1:A5") = Application.Transpose(arr) '如果是放在一列中,就需要对数组进行转置 后再存放 End Sub

5.动态数组的声明: 动态数组的声明: 动态数组的声明
Sub darr() Dim arr() '声明一个动态的 arr 数组(不知道它能盛多少数据) Dim k k = Application.WorksheetFunction.CountIf(Range("a2:a6"), ">10") '计算大于10的个数 ReDim arr(1 To k) '再次声明 arr 的大小,正好盛下 k 数量的值 For x = 2 To 6 If Cells(x, 1) > 10 Then m=m+1 arr(m) = Cells(x, 1) '通过循环把大于10的数字装入数组 End If Next x MsgBox arr(2) End Sub

6.动态数组的声明: 动态数组的声明: 动态数组的声明
arr(-19 to 8) 这个数组的编号就是从-19开始的.那么它的最小编号就是-19,最大编号是 8,如果用语句返回就是: Sub t1()

Dim arr(-19 To 8) MsgBox UBound(arr) '返回最大编号,结果为8 MsgBox LBound(arr) '返回最小编号,结果为-19 End Sub

如果是有行列组成的二维数组呢?二维数组返回行的下标和列的下标见下例 Sub t2() Dim arr(-19 To 8, 2 To 5) MsgBox UBound(arr) '返回第1维(行的)最大编号,结果为8 MsgBox LBound(arr) '返回第1维(行的)小编号,结果为-19 MsgBox UBound(arr, 2) '返回第2维(列的)最大编号,结果为5 MsgBox LBound(arr, 2) '返回第2维(列的)最小编号,结果为2 End Sub Sub t3() Dim arr arr = Sheets(1).UsedRange 'Usedrange 的行数和列数是未知的 MsgBox UBound(arr, 1) '可以计算这个区域有多少行 MsgBox UBound(arr, 2) '可以计算出这个区域有多少列 End Sub

7.使用 Array 函数创建常量数组: 使用 函数创建常量数组:
使用 Array 函数创建数组 1维常量数组:Array("A",1,"C") 2维常量数组: Array(Array("a", 10), Array("b", 20), Array("c", 30)) 也可以调用 excel 工作表内存数组: 1维数量: [{"A",1,"C"}]

2维数量: [{"a",10;"b",20;"c",30}] 内存常量数组有什么作用呢? 1、简化赋值 比如:我需要给数组 arr 分别赋值10 ,20,30,40,一般就需要分别赋值,即: arr(1)=10 arr(2)=20 arr(3)=30 arr(4)=40

而使用常量数量,只一句话: arr=array(10,20,30,40) 2、调用工作表函数时使用: Sub mylook() Dim arr arr =[{"a",10;"b",20;"c",30}] MsgBox Application.VLookup("b", arr, 2, 0) '调用 vlookup 时可以作为第二 个参数 End Sub

8.数组的合并和字符串拆分(Join & Split) 数组的合并和字符串拆分( 数组的合并和字符串拆分 ) :
多个字符的合并和字符串按规律的拆分是经常遇到的,如: A-REW-E-RWC-2-RWC 按分隔符-拆分成6个字符放在一个数组中 有一组数 array(23,45,7,1,76)想用分隔符-连接成一个字符串 上面两种情况 VBA 提供了一对函数,即:

split(字符串,"分隔符") 拆分字符串

join(数组,"分隔符")
Sub t1() Dim arr, myst As String myst = "A-REW-E-RWC-2-RWC"

用分隔连接数组的每个元成一个字符串

arr = Split(myst, "-") '按-分隔成一组数装入数组中 'MsgBox arr(0) '显示数组的第一个数(分隔后的数组最小下标为0,不是1),显示结果为 A MsgBox Join(arr, ",") '再用","把数组的每个值连接成一个字符串,结果为 "A,REW,E,RWC,2,RWC" End Sub 值得注意的是: split 和 join 只能对一维数组进行操作, 如果是单元格或二维数组怎么办? 只有一条途径,想办法转换为一维数组: Sub t2() Dim ARR ARR = Application.Transpose(Range("a1:a3")) ‘用转置的方法,把单元 格一列数据转换成一维数组 MsgBox Join(ARR, "-") End Sub

9. Filter 函数实现数组筛选 函数实现数组筛选:
数组的筛选就是根据一定的条件,从数组中筛选符合条件的值,组成一个新的数组,实现数 组筛选的 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

遗憾的是函数只能进行模糊筛选,不能精确匹配。

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) End Sub 2、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、Sum Sum 函数可以在工作表中求,同样也可以对 VBA 数组求和,如:

Sub t2() arr = Array(1, 35, 4, 13) MsgBox Application.Sum(arr) '对数组进行求和 End Sub 2、Count 和 Counta Count 和 Counta 可以统计数组中数字的个数和数字+文本的个数。 Sub t3() arr = Array(1, 35, "a", 4, 13, "b") MsgBox Application.Count(arr) '返回数字的个数4 MsgBox Application.CountA(arr) ‘返回数组文本和数字的总 个数 End Sub

三、数组的查询和拆分 1、Mach 查询数组 Match 函数可以查询一个指定值在一组数中的位置,它也可以用于 VBA 数组的查询。如: Sub t4() arr = Array(1, 35, 4, 13) MsgBox Application.Match(4, arr, 0) '查询数值4在数组 Arr 中 的位置 End Sub

2、Index 拆分数组

数组的拆分在 VBA 中是一个难题, 如果是按行拆分数组, 除了用循环外 也只能借用 API 函数完成了。 幸好我们可以借用工作表函数 index 达到按列拆分数组, 即多 列构成的数组,你可以任意拆分出一列构成新的数组。方法是:Application.Index(数组, , 列数),例: Sub t2() arr2 = Range("A1:B4") ‘把单元格区域 A1:B4的值装入数组 arr2 arr3 = Application.Index(arr2, , 2) '把数组第2列拆分出来装 入新数组 arr3中,新数组为二维数组 MsgBox arr3(2, 1) '取出新数组第2行的值 End Sub

四、数组维数的转换 Transpose 转置数组在工作表中可以把行列转换。在 VBA 中同样也可以做到 转换的效果。 1、一维转二维。 Sub t9() arr = Array(1, 35, "a", 4, 13, "b") arr1 = Application.Transpose(arr) MsgBox arr1(2, 1) ‘转换后的数组是1列多行的二维数组 End Sub 2、二维数组转一维。 Sub t2() arr2 = Range("A1:B4") arr3 = Application.transpose(Application.Index(arr2, , 2)) '取得 arr2第2列数据并转置成1维数组 MsgBox arr3(2,) End Sub

注:在转置时只有1列 N 行的数组才能直接转置成一维数组 思考题:我要把 a1:c1中的内容用“-”连接起来,下面代码中为什么用了两次 transpose Sub t10() arr = Range("A1:C1") MsgBox Join(Application.Transpose(Application.Transpose(arr)), "-") End Sub 编后话:用于 VBA 数组的工作表函数我只是列出了一部分,其实象 vlookup,Lookup 等 等函数也可以用于处理 VBA 数组,大家有空了就去尝试下吧。

非常详细!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!


相关文章:
Excel VBA编程 定义数组下界
Excel VBA编程 定义数组下界_计算机软件及应用_IT/计算机_专业资料。Excel VBA 编程 定义数组下界 在 VBA 中,声明数组后其下界默认从 0 开始,即数组元素的个数...
Excel VBA编程 动态数组
Excel VBA 编程 动态数组 在有些情况下,用户也许不清楚需要多大的数组,这时就需要用一个能够改变大小的数组, 这就是动态数组。动态数组可以在任何时候改变大小。在...
Excel VBA编程 数组的排序
Excel VBA编程 数组的排序_计算机软件及应用_IT/计算机_专业资料。Excel VBA 编程 数组的排序 排序是将一组数按升序或降序(递增或递减)的顺序排列。数组的排序...
第8章习题解答
第8章习题解答_IT/计算机_专业资料。vba书的答案哦 习题8 1. 简答题 1)...Next j Debug.Print Next i End Sub 8)使用数组输入十个评委的评分,要求去除...
更多相关标签: