添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
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) ' 就可以取出搬过去的而构成的数组第 3 行第 2 列的内容

Sub s3()

Dim arr() ' 声明一个动态数组(动态指不固定大小)
Dim arr1 ' 声明一个 Variant 类型的变量
arr = Range("a1:c7") '
把单元格区域 A1 C7 的值装入数组 arr

arr1 = Range("a1:c7") ' 把单元格区域 A1 C7 的值装入数组 arr1
MsgBox arr(1, 1) '
读取 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") '
把单元格数据搬入到 arr 里,它有 4 4
For x = 1 To 4 '
通过循环在 arr 数组中循环
arr(x, 4) = arr(x, 3) * arr(x, 2) '
数组的第 4 ( 金额 )= 3 * 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 数组,大家有空了就去尝试下吧。

相关文章:

字符串与二进制数组(二进制流)如何互相转换? UMVsoft整理 2007/5/12】
【access小品】关于字符串与数组的那点事 todaynew 2010/9/9】
数组学习资料 风行 2011/3/30】
鲜为人知的判断动态数组是否被初始化的方法 红尘如烟 2011/10/12】
数组同时清空多个文本框的值 纵云梯 2012/2/9】
vb数组排序-冒泡排序法 风行 2012/5/27】
VB数组介绍 风行 2012/6/4】
VB数组定义 风行 2012/6/4】
VBA数组完全教程10集,ACCESS数组,VB数组 风行(转载) 2012/7/21】
Access数组冒泡排序法 纵云梯 2012/8/10】