|
蘭色幻想VBA數(shù)組入門教程10集
1. 前言:不要把VBA數(shù)組想的太神秘,它其實(shí)就是一組數(shù)字而已。
2. 數(shù)組的維數(shù):
Sub 數(shù)組示例() Dim x As Long, y As Long Dim arr(1 To 10, 1 To 3) '創(chuàng)建一個(gè)可以容下10行3列的數(shù)組空間 For x = 1 To 4 For y = 1 To 3 arr(x, y) = Cells(x, y) '通過循環(huán)把單元格區(qū)域a1:c4的數(shù)據(jù)裝進(jìn)數(shù)組中 Next y Next x MsgBox arr(4, 3) '根據(jù)提供的行數(shù)和列數(shù)顯示數(shù)組 arr(1, 2) = '我改一下試試' '你可以隨時(shí)修改數(shù)組內(nèi)指定位置的數(shù)據(jù) MsgBox arr(1, 2) End Sub
總結(jié):二維是由行和列表示的數(shù)組,如ARR(3,2)表示數(shù)組中第3排第2列的元素。而一維數(shù)組只是由一個(gè)元素決定,如ARR(4)表示數(shù)組中第4個(gè)元素
3. 把單元格數(shù)據(jù)搬入內(nèi)存:
一、聲明:
Dim arr as Variant '聲明一個(gè)變量,不能聲明其他數(shù)據(jù)類型
Dim arr(1 to 10, 1 to 2 ) , 這種聲明也是錯(cuò)誤的,固定大小的VBA數(shù)組是不能一次性裝入單元格數(shù)據(jù)
或:dim arr() 這種聲明方式是聲明一個(gè)動(dòng)態(tài)數(shù)組,也可以裝入單元格區(qū)域,構(gòu)成一個(gè)VBA數(shù)組。
二、裝入
arr =range('a9:c100') '裝入很簡(jiǎn)單,變量 = 單元格區(qū)域
三、讀出
裝入數(shù)組后的單元格數(shù)值,可以按 數(shù)組名稱(行數(shù),列數(shù)) 直接讀取該位置的值,如下面的代碼。
Msgbox arr(3,2) '就可以取出搬過去的而構(gòu)成的數(shù)組第3行第2列的內(nèi)容
四、示例
Sub s3()
Dim arr() '聲明一個(gè)動(dòng)態(tài)數(shù)組(動(dòng)態(tài)指不固定大小) Dim arr1 '聲明一個(gè)Variant類型的變量 arr = Range('a1:c7') '把單元格區(qū)域A1:C7的值裝入數(shù)組arr
arr1 = Range('a1:c7') '把單元格區(qū)域A1:C7的值裝入數(shù)組arr1 MsgBox arr(1, 1) '讀取arr數(shù)組中第1行第1列的數(shù)值 MsgBox arr1(2, 3) '讀取arr1數(shù)組的第2行第3列的數(shù)值 End Sub
4. 把單元格數(shù)據(jù)搬入內(nèi)存:
Sub test() Dim arr '聲明一個(gè)變量用來盛放單元格數(shù)據(jù) Dim x As Integer arr = Range('a2:d5') '把單元格數(shù)據(jù)搬入到arr里,它有4列4行 For x = 1 To 4 '通過循環(huán)在arr數(shù)組中循環(huán) arr(x, 4) = arr(x, 3) * arr(x, 2) '數(shù)組的第4列(金額)=第3列*第2例 Next x Range('a2:d5') = arr '把數(shù)組放回到單元格中 End Sub
Sub test1() Dim arr(1 To 5) '聲明一維數(shù)組 For x = 1 To 5 arr(x) = x * 2 '通過循環(huán)給每個(gè)位置賦值 Next x Range('A1:E1') = arr '把數(shù)組導(dǎo)入到excel中的a1:e1單元格中 Range('A1:A5') = Application.Transpose(arr) '如果是放在一列中,就需要對(duì)數(shù)組進(jìn)行轉(zhuǎn)置后再存放 End Sub
5. 動(dòng)態(tài)數(shù)組的聲明:
Sub darr() Dim arr() '聲明一個(gè)動(dòng)態(tài)的arr數(shù)組(不知道它能盛多少數(shù)據(jù)) Dim k k = Application.WorksheetFunction.CountIf(Range('a2:a6'), '>10') '計(jì)算大于10的個(gè)數(shù) ReDim arr(1 To k) '再次聲明arr的大小,正好盛下k數(shù)量的值 For x = 2 To 6 If Cells(x, 1) > 10 Then m = m + 1 arr(m) = Cells(x, 1) '通過循環(huán)把大于10的數(shù)字裝入數(shù)組 End If Next x MsgBox arr(2) End Sub
6. 動(dòng)態(tài)數(shù)組的聲明: arr(-19 to 8) 這個(gè)數(shù)組的編號(hào)就是從-19開始的.那么它的最小編號(hào)就是-19,最大編號(hào)是8, 如果用語句返回就是:
Sub t1()
Dim arr(-19 To 8)
MsgBox UBound(arr) '返回最大編號(hào),結(jié)果為8
MsgBox LBound(arr) '返回最小編號(hào),結(jié)果為-19
End Sub
如果是有行列組成的二維數(shù)組呢?二維數(shù)組返回行的下標(biāo)和列的下標(biāo)見下例
Sub t2() Dim arr(-19 To 8, 2 To 5)
MsgBox UBound(arr) '返回第1維(行的)最大編號(hào),結(jié)果為8
MsgBox LBound(arr) '返回第1維(行的)小編號(hào),結(jié)果為-19 MsgBox UBound(arr, 2) '返回第2維(列的)最大編號(hào),結(jié)果為5 MsgBox LBound(arr, 2) '返回第2維(列的)最小編號(hào),結(jié)果為2 End Sub
Sub t3() Dim arr arr = Sheets(1).UsedRange 'Usedrange的行數(shù)和列數(shù)是未知的 MsgBox UBound(arr, 1) '可以計(jì)算這個(gè)區(qū)域有多少行 MsgBox UBound(arr, 2) '可以計(jì)算出這個(gè)區(qū)域有多少列 End Sub
7. 使用Array函數(shù)創(chuàng)建常量數(shù)組:
使用Array函數(shù)創(chuàng)建數(shù)組
1維常量數(shù)組:Array('A',1,'C')
2維常量數(shù)組: Array(Array('a', 10), Array('b', 20), Array('c', 30))
也可以調(diào)用excel工作表內(nèi)存數(shù)組:
1維數(shù)量: [{'A',1,'C'}]
2維數(shù)量: [{'a',10;'b',20;'c',30}]
內(nèi)存常量數(shù)組有什么作用呢?
1、簡(jiǎn)化賦值
比如:我需要給數(shù)組arr分別賦值10 ,20,30,40 ,一般就需要分別賦值,即:
arr(1)=10
arr(2)=20
arr(3)=30
arr(4)=40
而使用常量數(shù)量,只一句話:
arr=array(10,20,30,40)
2、調(diào)用工作表函數(shù)時(shí)使用:
Sub mylook() Dim arr arr = [{'a',10;'b',20;'c',30}] MsgBox Application.VLookup('b', arr, 2, 0) '調(diào)用vlookup時(shí)可以作為第二個(gè)參數(shù) End Sub
8. 數(shù)組的合并和字符串拆分(Join & Split):
多個(gè)字符的合并和字符串按規(guī)律的拆分是經(jīng)常遇到的,如:
A-REW-E-RWC-2-RWC 按分隔符-拆分成6個(gè)字符放在一個(gè)數(shù)組中
有一組數(shù)array(23,45,7,1,76)想用分隔符-連接成一個(gè)字符串
上面兩種情況VBA提供了一對(duì)函數(shù),即:
split(字符串,'分隔符') 拆分字符串
join(數(shù)組,'分隔符') 用分隔連接數(shù)組的每個(gè)元成一個(gè)字符串
Sub t1() Dim arr, myst As String myst = 'A-REW-E-RWC-2-RWC' arr = Split(myst, '-') '按-分隔成一組數(shù)裝入數(shù)組中 'MsgBox arr(0) '顯示數(shù)組的第一個(gè)數(shù)(分隔后的數(shù)組最小下標(biāo)為0,不是1),顯示結(jié)果為A MsgBox Join(arr, ',') '再用','把數(shù)組的每個(gè)值連接成一個(gè)字符串,結(jié)果為'A,REW,E,RWC,2,RWC' End Sub
值得注意的是:split和join只能對(duì)一維數(shù)組進(jìn)行操作,如果是單元格或二維數(shù)組怎么辦?只有一條途徑,想辦法轉(zhuǎn)換為一維數(shù)組:
Sub t2() Dim ARR ARR = Application.Transpose(Range('a1:a3')) '用轉(zhuǎn)置的方法,把單元格一列數(shù)據(jù)轉(zhuǎn)換成一維數(shù)組 MsgBox Join(ARR, '-') End Sub
9. Filter函數(shù)實(shí)現(xiàn)數(shù)組篩選:
數(shù)組的篩選就是根據(jù)一定的條件,從數(shù)組中篩選符合條件的值,組成一個(gè)新的數(shù)組,實(shí)現(xiàn)數(shù)組篩選的VBA函數(shù)是:
Filter函數(shù)
用法:Filter(數(shù)組, 篩選的字符, 是否包含)
Sub DD() arr = Array('ABC', 'A', 'D', 'CA', 'ER') arr1 = VBA.Filter(arr, 'A', True) '篩選所有含A的數(shù)值組成一個(gè)新數(shù)組 arr2 = VBA.Filter(arr, 'A', False) '篩選所有不含A的數(shù)值組成一個(gè)新數(shù)組 MsgBox Join(arr2, ',') '查看篩選的結(jié)果 End Sub
遺憾的是函數(shù)只能進(jìn)行模糊篩選,不能精確匹配。
10. VBA數(shù)組入門教程之10(大結(jié)局):他山之石): 他山之石,可以攻玉,VBA中除可以利用的VBA函數(shù)外,還可以調(diào)用眾多的Excel工作表函數(shù)對(duì)數(shù)組進(jìn)行分解、查詢和分析等,調(diào)用工作表函數(shù)可以省去循環(huán)判斷的麻煩,進(jìn)而提高運(yùn)行效率。
一、數(shù)組的最值
1、Max和Min
工作表函數(shù)Max和Min是求最大值和最小值的函數(shù),同樣在VBA中也可以求數(shù)組的最大值和最小值。如:
Sub t() arr = Array(1, 35, 4, 13) MsgBox Application.Max(arr) '最大值 MsgBox Application.Min(arr) '最小值 End Sub
2、large和small
工作表函數(shù)large和small 是返回一組數(shù)的第N大和第N小,對(duì)VBA數(shù)組同樣適用,如:
Sub t1() arr = Array(1, 35, 4, 13) MsgBox Application.Large(arr, 2) '第2大值 MsgBox Application.Small(arr, 2) '第2小值 End Sub
二、數(shù)組的統(tǒng)計(jì)與求和
1、Sum
Sum函數(shù)可以在工作表中求,同樣也可以對(duì)VBA數(shù)組求和,如:
Sub t2() arr = Array(1, 35, 4, 13) MsgBox Application.Sum(arr) '對(duì)數(shù)組進(jìn)行求和 End Sub
2、Count和Counta
Count和Counta可以統(tǒng)計(jì)數(shù)組中數(shù)字的個(gè)數(shù)和數(shù)字+文本的個(gè)數(shù)。
Sub t3() arr = Array(1, 35, 'a', 4, 13, 'b') MsgBox Application.Count(arr) '返回?cái)?shù)字的個(gè)數(shù)4 MsgBox Application.CountA(arr) '返回?cái)?shù)組文本和數(shù)字的總個(gè)數(shù) End Sub
三、數(shù)組的查詢和拆分
1、Mach查詢數(shù)組
Match函數(shù)可以查詢一個(gè)指定值在一組數(shù)中的位置,它也可以用于VBA數(shù)組的查詢。如:
Sub t4() arr = Array(1, 35, 4, 13) MsgBox Application.Match(4, arr, 0) '查詢數(shù)值4在數(shù)組Arr中的位置 End Sub
2、Index拆分?jǐn)?shù)組
數(shù)組的拆分在VBA中是一個(gè)難題,如果是按行拆分?jǐn)?shù)組,除了用循環(huán)外也只能借用API函數(shù)完成了。幸好我們可以借用工作表函數(shù)index達(dá)到按列拆分?jǐn)?shù)組,即多列構(gòu)成的數(shù)組,你可以任意拆分出一列構(gòu)成新的數(shù)組。方法是:Application.Index(數(shù)組, , 列數(shù)) ,例:
Sub t2() arr2 = Range('A1:B4') '把單元格區(qū)域A1:B4的值裝入數(shù)組arr2 arr3 = Application.Index(arr2, , 2) '把數(shù)組第2列拆分出來裝入新數(shù)組arr3中,新數(shù)組為二維數(shù)組 MsgBox arr3(2, 1) '取出新數(shù)組第2行的值 End Sub
四、數(shù)組維數(shù)的轉(zhuǎn)換
Transpose轉(zhuǎn)置數(shù)組在工作表中可以把行列轉(zhuǎn)換。在VBA中同樣也可以做到轉(zhuǎn)換的效果。
1、一維轉(zhuǎn)二維。
Sub t9() arr = Array(1, 35, 'a', 4, 13, 'b') arr1 = Application.Transpose(arr) MsgBox arr1(2, 1) '轉(zhuǎn)換后的數(shù)組是1列多行的二維數(shù)組 End Sub
2、二維數(shù)組轉(zhuǎn)一維。
Sub t2() arr2 = Range('A1:B4') arr3 = Application.transpose(Application.Index(arr2, , 2)) '取得arr2第2列數(shù)據(jù)并轉(zhuǎn)置成1維數(shù)組 MsgBox arr3(2,) End Sub
注:在轉(zhuǎn)置時(shí)只有1列N行的數(shù)組才能直接轉(zhuǎn)置成一維數(shù)組
思考題:我要把a(bǔ)1:c1中的內(nèi)容用“-”連接起來,下面代碼中為什么用了兩次transpose
Sub t10() arr = Range('A1:C1') MsgBox Join(Application.Transpose(Application.Transpose(arr)), '-') End Sub
編后話:用于VBA數(shù)組的工作表函數(shù)我只是列出了一部分,其實(shí)象vlookup,Lookup等等函數(shù)也可以用于處理VBA數(shù)組,大家有空了就去嘗試下吧。
|