**************************************************************************************************** *                        VBA数组教程                                * *                              --------excel精英培训网:兰幻想                              *
****************************************************************************************************
从一个实例开始
Sub v4() '运行时间0.01秒
Dim t
t = Timer
For x = 1 To 100000
m = m + 1000 '真接调用内存中的值
Next x
MsgBox Timer - t
End Sub
Sub v5() '运行时间0.5秒
Dim t
t = Timer
c++字符串是什么
For x = 1 To 100000
m = m + Cells(1, 1) '调用单元格中的值
Next x
MsgBox Timer - t
End Sub
运行的结果是直接调用内存中的值比调用单元格的值快了50倍,为什么会这样呢?我们需要了解一下VBA的运算原理
**********    VBA的运算原理    *********
VBA中的运算最终是在内存中进行的,如果数据已经在内存中,则直接进行运算,但如果数据是储存在第三方对象(如单元格里,控件里)里,则还需要先把数据从第三方对象里调入到内存中,然后再在内存中对数据进行运算。
如果把v5的程序进行稍微改动,运行时间会大大缩短。
Sub v5_2() '运行时间0.5秒
Dim x, t
t = Timer
x = Cells(1, 1) '把单元格的值先交给变量
For x = 1 To 100000
m = m + x
Next x
MsgBox Timer - t
End 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 10
arr(x) = x
Next x
Stop
End Sub
2维数组
Sub t2()
Dim arr(1 To 10, 1 To 2)
For x = 1 To 10
For y = 1 To 2
arr(x, y) = x * y
Next y
Next x
Stop
End Sub
3维数组
Sub t3()
Dim arr(1 To 10, 1 To 2, 1 To 3)
For x = 1 To 10
For y = 1 To 2
For z = 1 To 3
arr(x, y, z) = x * y + z
Next z
Next y
Next x
Stop
End Sub
B 按储存类型划分
常量数组
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二维数组
Stop
End 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 k
k = Application.WorksheetFunction.CountIf(Range("a2:a60"), ">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
如果数组需要随一个变量不断的扩充,数组就需要多次声明,每扩充一次就声明一次:
Redim Preserve (1 to k)
如果数组是多维的,只能动态声明第末维的,如果需要把让第一维不断扩充,还需要先转置,
有点麻烦,这里就不再详述,遇到这种情况,我们可以声明一个足够大的静态数组来取代动态数组,运行速度较前者快。
1 单元格区域存入VBA数组
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
2 一维VBA数组放入单元格区域中
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
1.计算VBA数组的大小
Sub b1()
Dim arr(-3 To 4)
MsgBox UBound(arr) '下标
MsgBox LBound(arr) '上标
For x = -3 To 4
arr(x) = x * 2
Next x
MsgBox Application.Count(arr) '含有数据元素的个数
End Sub
Sub b2()
Dim arr
arr = Sheets(1).UsedRange 'Usedrange的行数和列数是未知的
MsgBox UBound(arr, 1) '可以计算这个区域有多少行
MsgBox UBound(arr, 2) '可以计算出这个区域有多少列
End Sub
2.VBA数组的筛选
Sub b3()
arr = Array("ABC", "A", "D", "CA", "ER")
arr1 = VBA.Filter(arr, "A", True) '筛选所有含A的数值组成一个新数组
arr2 = VBA.Filter(arr, "A", False) '筛选所有不含A的数值组成一个新数组
Stop
End Sub
3  VBA数组的拆分与合并
Sub t2()
arr2 = Range("A1:B4") '把单元格区域A1:B4的值装入数组arr2
arr3 = 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 Sub
Sub t4()
arr = Array(1, 35, 4, 13)
MsgBox Application.Large(arr, 2) '第2大值
MsgBox Application.Small(arr, 2)  '第2小值
End Sub
5 数组的统计与求和
Sub t5()
arr = Array(1, 35, 4, 13)
MsgBox Application.Sum(arr)  '对数组进行求和
End Sub
Sub t6()
arr = Array(1, 35, "a", 4, 13, "b")
MsgBox Application.Count(arr)  '返回数字的个数4
MsgBox Application.CountA(arr)  '返回数组文本和数字的总个数
End Sub
6.数组的查询
Sub t7()
arr = Array(1, 35, 4, 13)
MsgBox Application.Match(4, arr, 0)  '查询数值4在数组Arr中的位置
End Sub
7 数组的转置
Sub t8()
arr = Array(1, 35, "a", 4, 13, "b")
arr1 = Application.Transpose(arr)
Stop
End Sub
Sub t9()
arr = Range("a1:a5")
arr1 = Application.Transpose(arr)
Stop
End Sub
8.字符串与VBA数组
Sub t1()
Dim arr, myst As String
myst = "A-REW-E-RWC-2-RWC"
arr = Split(myst, "-") '按-分隔成一组数装入数组中
k = Join(arr, ",") '再用","把数组的每个值连接成一个字符串,结果为"A,REW,            Stop E,RWC,2,RWC"
End Sub
9.巧妙利用数组的标
因为数组的标是唯一的,所以我们就利用这个特点去除重复的数值
Sub r1()
Dim arr, arr2(1 To 13, 1 To 1)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。