|
楼主 |
发表于 2020-4-25 09:31
|
显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
六讲:
有时候我们需要返回一个最组的最大和最小下标,这里出现了一个新名词:下标
所谓下标就是数组内元素的编号。象在电影院看电影一样,数组内每一维数据有都独有的编号,比如arr(2)表示数组中编号为2数据。这里容易让人糊涂的是,数组的编号不一定是从1开始,而可以从负数开始,如:
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
上面例子中在声明时最大最小下标都是已知的,为什么还要再用再计算呢? 如果arr是一个动态数组,我们用得着计算最大和最小下标了.例:
Sub t3()
Dim arr
arr = Sheets(1).UsedRange 'Usedrange的行数和列数是未知的
MsgBox UBound(arr, 1) '可以计算这个区域有多少行
MsgBox UBound(arr, 2) '可以计算出这个区域有多少列
End Sub
------------------------------------------------------------------------------------------------------------------------------------------
八讲:
多个字符的合并和字符串按规律的拆分是经常遇到的,如:
A-REW-E-RWC-2-RWC 按分隔符-拆分成6个字符放在一个数组中
有一组数array(23,45,7,1,76)想用分隔符-连接成一个字符串
上面两种情况VBA提供了一对函数,即:
split(字符串,"分隔符") 拆分字符串
join(数组,"分隔符") 用分隔连接数组的每个元成一个字符串
例1:
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
------------------------------------------------------------------------------------------------------------------------------------------
九讲:
VBA数组教程第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
遗憾的是函数只能进行模糊筛选,不能精确匹配。
------------------------------------------------------------------------------------------------------------------------------------------
十讲:
他山之石,可以攻玉,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行的数组才能直接转置成一维数组 |
|