VBA数组完全教程
兰⾊幻想VBA数组⼊门教程10集
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) '就可以取出搬过去的⽽构成的数组第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. 把单元格数据搬⼊内存:
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
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(数组,"分隔符") ⽤分隔连接数组的每个元成⼀个字符串
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的数值组成⼀个新数组
vba排序函数sort用法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数组同样适⽤,如:
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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论