VBA數(shù)組儲存于內(nèi)存中,單元格的數(shù)據(jù),儲存于工作表的單元格區(qū)域里。
從單元格中取出數(shù)據(jù)放在內(nèi)存。
單元格是行列結(jié)構(gòu)的數(shù)據(jù)表,把它搬到內(nèi)存中也應(yīng)該是二維的數(shù)組。怎么搬呢?
為了更好的搬運,內(nèi)存先批了一塊土地。內(nèi)存說了,你有多少個單元格我不問,反正你有多少數(shù)據(jù)我提供多大的地方。
一、聲明:
Dim arr as Variant '聲明一個變量,這個變量應(yīng)該是一個可以轉(zhuǎn)化成數(shù)組的Variant類型(可以省略),不能聲明其他數(shù)據(jù)類型
如: Dim arr as string 這種聲明就是錯誤的,存放單元格的數(shù)據(jù)類型必須是 Variant(也可以省略)
Dim arr(1 to 10, 1 to 2 ) , 這種聲明也是錯誤的,固定大小的VBA數(shù)組是不能一次性裝入單元格數(shù)據(jù)
或:dim arr() 這種聲明方式是聲明一個動態(tài)數(shù)組,也可以裝入單元格區(qū)域,構(gòu)成一個VBA數(shù)組。
二、裝入
arr =range("a9:c100") '裝入很簡單,變量 = 單元格區(qū)域
三、讀出
裝入數(shù)組后的單元格數(shù)值,可以按 數(shù)組名稱(行數(shù),列數(shù)) 直接讀取該位置的值,如下面的代碼。
Msgbox arr(3,2) '就可以取出搬過去的而構(gòu)成的數(shù)組第3行第2列的內(nèi)容
四、示例
Sub s3()
Dim arr() '聲明一個動態(tài)數(shù)組(動態(tài)指不固定大?。?br> Dim arr1 '聲明一個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
![]() ![]() 有時候我們需要返回一個最組的最大和最小下標(biāo),這里出現(xiàn)了一個新名詞:下標(biāo) 所謂下標(biāo)就是數(shù)組內(nèi)元素的編號。象在電影院看電影一樣,數(shù)組內(nèi)每一維數(shù)據(jù)有都獨有的編號,比如arr(2)表示數(shù)組中編號為2數(shù)據(jù)。這里容易讓人糊涂的是,數(shù)組的編號不一定是從1開始,而可以從負(fù)數(shù)開始,如: arr(-19 to 8) 這個數(shù)組的編號就是從-19開始的.那么它的最小編號就是-19,最大編號是8, 如果用語句返回就是: Sub t1() Dim arr(-19 To 8) MsgBox UBound(arr) '返回最大編號,結(jié)果為8 MsgBox LBound(arr) '返回最小編號,結(jié)果為-19 End Sub 如果是有行列組成的二維數(shù)組呢?二維數(shù)組返回行的下標(biāo)和列的下標(biāo)見下例 Sub t2() Dim arr(-19 To 8, 2 To 5) MsgBox UBound(arr) '返回第1維(行的)最大編號,結(jié)果為8 MsgBox LBound(arr) '返回第1維(行的)小編號,結(jié)果為-19 MsgBox UBound(arr, 2) '返回第2維(列的)最大編號,結(jié)果為5 MsgBox LBound(arr, 2) '返回第2維(列的)最小編號,結(jié)果為2 End Sub 上面例子中在聲明時最大最小下標(biāo)都是已知的,為什么還要再用再計算呢? 如果arr是一個動態(tài)數(shù)組,我們用得著計算最大和最小下標(biāo)了.例: Sub t3() Dim arr arr = Sheets(1).UsedRange 'Usedrange的行數(shù)和列數(shù)是未知的 MsgBox UBound(arr, 1) '可以計算這個區(qū)域有多少行 MsgBox UBound(arr, 2) '可以計算出這個區(qū)域有多少列 End Sub |
![]() ![]() 在前面我們學(xué)習(xí)了創(chuàng)健一個固定大小的數(shù)組和動態(tài)數(shù)組,這些數(shù)組在創(chuàng)建時只是創(chuàng)建了儲存空間還沒有賦值,而本講所說有常量數(shù)組則時提供的由一組常所構(gòu)成的數(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、簡化賦值 比如:我需要給數(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ù)時使用: Sub mylook() Dim arr arr = [{"a",10;"b",20;"c",30}] MsgBox Application.VLookup("b", arr, 2, 0) '調(diào)用vlookup時可以作為第二個參數(shù) End Sub |
![]() ![]() 多個字符的合并和字符串按規(guī)律的拆分是經(jīng)常遇到的,如: A-REW-E-RWC-2-RWC 按分隔符-拆分成6個字符放在一個數(shù)組中 有一組數(shù)array(23,45,7,1,76)想用分隔符-連接成一個字符串 上面兩種情況VBA提供了一對函數(shù),即: split(字符串,"分隔符") 拆分字符串 join(數(shù)組,"分隔符") 用分隔連接數(shù)組的每個元成一個字符串 例1: Sub t1() Dim arr, myst As String myst = "A-REW-E-RWC-2-RWC" arr = Split(myst, "-") '按-分隔成一組數(shù)裝入數(shù)組中 'MsgBox arr(0) '顯示數(shù)組的第一個數(shù)(分隔后的數(shù)組最小下標(biāo)為0,不是1),顯示結(jié)果為A MsgBox Join(arr, ",") '再用","把數(shù)組的每個值連接成一個字符串,結(jié)果為"A,REW,E,RWC,2,RWC" End Sub 值得注意的是:split和join只能對一維數(shù)組進行操作,如果是單元格或二維數(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 |
![]() ![]() VBA數(shù)組教程第9例:Filter函數(shù)實現(xiàn)數(shù)組篩選 數(shù)組的篩選就是根據(jù)一定的條件,從數(shù)組中篩選符合條件的值,組成一個新的數(shù)組,實現(xiàn)數(shù)組篩選的VBA函數(shù)是: Filter函數(shù) 用法:Filter(數(shù)組, 篩選的字符, 示例 Sub DD() 遺憾的是函數(shù)只能進行模糊篩選,不能精確匹配。 |
![]() ![]() 前言: 時間過的真快,轉(zhuǎn)眼間VBA數(shù)組入門已到第10例,雖然數(shù)組還有更多的深層用法,但本系列只是“入門”教程,所以也只能在第10例后劃上句號了,希望本系列能給想學(xué)VBA數(shù)組的新手帶來幫助。蘭色如果有時間,會繼續(xù)推出VBA數(shù)組的進階教程系列,包括數(shù)組排序等。 他山之石,可以攻玉,VBA中除可以利用的VBA函數(shù)外,還可以調(diào)用眾多的Excel工作表函數(shù)對數(shù)組進行分解、查詢和分析等,調(diào)用工作表函數(shù)可以省去循環(huán)判斷的麻煩,進而提高運行效率。 一、數(shù)組的最值 1、Max和Min 工作表函數(shù)Max和Min是求最大值和最小值的函數(shù),同樣在VBA中也可以求數(shù)組的最大值和最小值。如: Sub t() 2、large和small 工作表函數(shù)large和small 是返回一組數(shù)的第N大和第N小,對VBA數(shù)組同樣適用,如: Sub t1() 二、數(shù)組的統(tǒng)計與求和 1、Sum Sum函數(shù)可以在工作表中求,同樣也可以對VBA數(shù)組求和,如: 2、Count和Counta Count和Counta可以統(tǒng)計數(shù)組中數(shù)字的個數(shù)和數(shù)字+文本的個數(shù)。 Sub t3() 三、數(shù)組的查詢和拆分
以下內(nèi)容只有回復(fù)后才可以瀏覽
1、Mach查詢數(shù)組 Match函數(shù)可以查詢一個指定值在一組數(shù)中的位置,它也可以用于VBA數(shù)組的查詢。如: Sub t4() 2、Index拆分?jǐn)?shù)組 數(shù)組的拆分在VBA中是一個難題,如果是按行拆分?jǐn)?shù)組,除了用循環(huán)外也只能借用API函數(shù)完成了。幸好我們可以借用工作表函數(shù)index達到按列拆分?jǐn)?shù)組,即多列構(gòu)成的數(shù)組,你可以任意拆分出一列構(gòu)成新的數(shù)組。方法是:Application.Index(數(shù)組, , 列數(shù)) ,例: Sub t2()
四、數(shù)組維數(shù)的轉(zhuǎn)換
以下內(nèi)容只有回復(fù)后才可以瀏覽
Transpose轉(zhuǎn)置數(shù)組在工作表中可以把行列轉(zhuǎn)換。在VBA中同樣也可以做到轉(zhuǎn)換的效果。 1、一維轉(zhuǎn)二維。 Sub t9() 2、二維數(shù)組轉(zhuǎn)一維。 Sub t2() 注:在轉(zhuǎn)置時只有1列N行的數(shù)組才能直接轉(zhuǎn)置成一維數(shù)組
思考題:我要把a1:c1中的內(nèi)容用“-”連接起來,下面代碼中為什么用了兩次transpose Sub t10() 編后話:用于VBA數(shù)組的工作表函數(shù)我只是列出了一部分,其實象vlookup,Lookup等等函數(shù)也可以用于處理VBA數(shù)組,大家有空了就去嘗試下吧。 |