使用數(shù)組一次可以處理多個變量。數(shù)組的維數(shù)可以是一維,也可以是二維(最多可以定義60維)。 Excel工作表就是一個天然的二維數(shù)組。工作表的行、列對應(yīng)二維數(shù)組的行、列。 工作表數(shù)據(jù)區(qū)域與二維數(shù)組對元素的定位就相當(dāng)于坐標(biāo)定位,如工作表區(qū)域的cells()寫法就是就是對應(yīng)工作表的某一行,某一列。 在excel中,數(shù)據(jù)可以直接使用[{}]賦值,列元素用逗號,分隔,行元素用分號;分隔。 一維數(shù)組可以與工作表的行或列相互映射,二維數(shù)據(jù)可以與一個單元格區(qū)域相互映射。所謂相互映射,也就是說數(shù)組可以通過單元格區(qū)域定義,而單元格區(qū)域也可以通過數(shù)組賦值。 單元格區(qū)域可以通過地址引用,同樣的,數(shù)組可以很方便地通過索引(下標(biāo))引用(字典通過key引用,兩者在特定場合都有其優(yōu)勢所在)。 通過數(shù)組,多了一種數(shù)據(jù)處理的方式,并且速度更快(將單元格區(qū)域映射為數(shù)組,相當(dāng)于把單元格區(qū)域的數(shù)據(jù)搬入到了內(nèi)存),更靈活(可以利用數(shù)組處理的內(nèi)置函數(shù))。
1 一維數(shù)組與二維數(shù)組1.1 一維數(shù)組與行
1.2 一維數(shù)組與列
1.3 二維數(shù)組
2 數(shù)組的開始下標(biāo)(最小下標(biāo))和結(jié)束下標(biāo)(最大下標(biāo))LBound(arr)表示索引號的開始上標(biāo)(最小下標(biāo),smallest Subscript),UBound(arr)表示數(shù)組arr索引號的結(jié)束下標(biāo)(最大下標(biāo),Largest Subscript)。UBound(arr) -LBound(arr) 1 即表示一維數(shù)組的長度(或多維數(shù)組第一維的長度)。如果一維數(shù)組的索引號從1開始,即LBound(arr)等于1,則UBound(arr)即表示一維數(shù)組的長度。(數(shù)組的開始下標(biāo)值是可以自定義的。)
二維數(shù)組的行數(shù):UBound(arr,1) -LBound(arr,1) 1 (可以寫為:UBound(arr) -LBound(arr) 1) 二維數(shù)組的列數(shù):UBound(arr,2) -LBound(arr,2) 1 3 單元格區(qū)域映射到數(shù)組如將Range('A1:E4')映射到數(shù)組arr:
將單元格區(qū)域的數(shù)據(jù)保存到數(shù)組以后,數(shù)據(jù)在內(nèi)存中處理,速度更快。 4 利用索引號(下標(biāo))獲取數(shù)組中的元素數(shù)組元素的值可以通過下標(biāo)獲取。
有時需要重新定義數(shù)組大小,才能使用索引。 5 數(shù)組轉(zhuǎn)置正如單元格區(qū)域可以轉(zhuǎn)置一樣,數(shù)組也可以同樣操作。
以上操作相當(dāng)于一維轉(zhuǎn)二維,一維(一行n列)轉(zhuǎn)為一個n行1列的二維數(shù)組。 同樣的,二維數(shù)組也可以進行相同的操作。 6 數(shù)組的聲明與賦值聲明一維數(shù)組: dim arr(i to j) as variant 聲明二維數(shù)組: dim arr(i to j, n to m) as variant 上面的i,n必須是正整數(shù),表示索引號(下標(biāo))開始值(最小值)。i可以通過Lbound(arr)獲得,n可以通過Lbound(arr,2)獲得; 如果i,n是零,可以略寫為:dim arr(j) as variant,dim arr( j, m) as variant j,m必須是正整數(shù),表示索引號(下標(biāo))的結(jié)束值(最小值)。j可以通過Ubound(arr)區(qū)得,m可以通過Ubound(arr,2)獲得; 當(dāng)然,聲明時也可以不考慮維數(shù),如dim arr() as variant。
用缺省索引號開始值的聲明:
關(guān)于列索引號的開始上標(biāo)的默認值,如果采用缺少上標(biāo)的聲明,則開始上標(biāo)的默認值是0.。如果沒有聲明直接使用數(shù)組變量,則上標(biāo)的默認值是1。(可以使用Option Base 1語句來強制指定該數(shù)組的下界。該指令必須置于VBA模塊任何Sub語句上面的聲明部分。如果你不明確Option Base 1,那么VBA在使用數(shù)組是就會假定使用Option Base 0來從0開始編號你的數(shù)組成員。) 另外,如果在聲明時沒有聲明數(shù)據(jù)類型,或聲明的是variant數(shù)據(jù)類型,在對數(shù)組元素分別賦值時,可以是不同的數(shù)據(jù)類型。
也可以利用VBA的內(nèi)置函數(shù)Array()聲明常量數(shù)組:
Array()函數(shù)允許你在代碼執(zhí)行中間創(chuàng)建一個數(shù)組,而不必事先確定其大小。該函數(shù)總是返回一個Varant數(shù)組。 6 動態(tài)數(shù)組上面使用的都是靜態(tài)數(shù)組,靜態(tài)數(shù)組在執(zhí)行期間不可以改變其最大的結(jié)束下標(biāo)(最后一個元素的索引號),而動態(tài)數(shù)組可以隨時修改其結(jié)束下標(biāo)。 有dim語句定義了一個靜態(tài)數(shù)組后,可以用Redim 語句或者Redim Preserve 對定義的靜態(tài)數(shù)組多次重新定義大小。 Redim 語句或者Redim Preserve語句的作用是為了動態(tài)數(shù)組變量重新分配內(nèi)存空間,包括指定的維數(shù)及聲明其結(jié)束下標(biāo)。但Redim語句重置數(shù)組變小,會使數(shù)組中的值丟失;而Redim Preserve語句重置數(shù)組變小時可以保留原數(shù)組中的值??梢允褂肦edim語句反復(fù)地改變數(shù)組的元素及維數(shù)的數(shù)目,但是不能將一個數(shù)組定義為某種數(shù)據(jù)類型后,再使用Redim將該數(shù)組改成為其他數(shù)據(jù)類型,除非是variant所包含的數(shù)組。具體看以下數(shù)組:
7 數(shù)組與字符串數(shù)組與字符串可以使用split()函數(shù)和join()函數(shù)相互轉(zhuǎn)換。 7.1 利用Split()函數(shù)將字符串分割為一個數(shù)組 Split函數(shù)可以將字符串按指定的分隔符轉(zhuǎn)換成下標(biāo)為0的一維數(shù)組(下標(biāo)為0,并且不受Option Base語句的影響)。它的語法如下:
如:
7.2 利用Join()函數(shù)將數(shù)組元素合并為一個字符串
如:
7.3 利用Filter()函數(shù)篩選數(shù)組元素
單元格A1的值即顯示為:A056 A079 A007 8 數(shù)組的最值、求和、個數(shù)統(tǒng)計Application.Max(arr) 最大值 Application.Min(arr) 最小值 Application.Large(arr, 2) 求出第二大值 Application.Small(arr, 2) 求出第二小值 (可以利用上面這些內(nèi)置函數(shù)對數(shù)組實現(xiàn)輕松排序。) Application.Sum(arr) 求和 Application.Count(arr) 統(tǒng)計數(shù)組元素(數(shù)字)的個數(shù) Application.Counta(arr) 統(tǒng)計數(shù)組元素(數(shù)字 文本)的個數(shù) COUNT函數(shù)和COUNTA函數(shù)都是計算非空單元格個數(shù)。區(qū)別在于: COUNT函數(shù)在計算非空單元格的個數(shù)時,將把數(shù)字型的數(shù)字計算進去,錯誤值、文字、邏輯值、空值將被忽略; 如果要統(tǒng)計含有錯誤值、文字、邏輯值,則使用COUNTA函數(shù)。 9 數(shù)組的查詢和拆分9.1 Mach()查詢數(shù)組 Match()函數(shù)可以查詢一個指定值在一組數(shù)中的位置,它也可以用于VBA數(shù)組的查詢。如:
9.2 Index拆分數(shù)組 數(shù)組的拆分在VBA中是一個難題,如果是按行拆分數(shù)組,除了用循環(huán)外也只能借用API函數(shù)完成了。幸好我們可以借用工作表函數(shù)index達到按列拆分數(shù)組,即多列構(gòu)成的數(shù)組,你可以任意拆分出一列構(gòu)成新的數(shù)組。方法是:Application.Index(數(shù)組, 列數(shù)) ,例:
10 與數(shù)組相關(guān)的其它函數(shù)IsArray()函數(shù)返回一個布爾值,指示指定的輸入變量是否是數(shù)組變量。 Erase()函數(shù)用于重置固定大小數(shù)組的值并釋放動態(tài)數(shù)組的內(nèi)存。
11 數(shù)組作為函數(shù)參數(shù)數(shù)據(jù)可以在子過程或者函數(shù)過程之間作為必須或者可選參數(shù)傳遞。如果傳遞的參數(shù)不是過程執(zhí)行一定要的話,那么這個參數(shù)名稱就應(yīng)該在前面加關(guān)鍵字Optional。然而,有些時候,你事先并不知道你要傳遞多少個參數(shù)。一個典型的例子就是加法。你可能想要將兩個數(shù)字加和,或者,你也許要加和3個,10個,或者15個數(shù)字。使用關(guān)鍵字ParamArray,你就可以將一個包含任意個成員的數(shù)組傳遞給你的子過程和函數(shù)過程。下面的函數(shù)過程AddMultipleArgs將加和你所需要的任何多個數(shù)字。該函數(shù)以數(shù)組myNumbers的聲明開始,注意關(guān)鍵字ParamArray的使用。該數(shù)組必須聲明為Variant類型,并且它必須是函數(shù)過程的最后一個參數(shù)。
[a1] = =addm(1,212,33,424,55) [a1] 就會返回上面參數(shù)的總和:725。你可以提供無限制的參數(shù)數(shù)目。注意,每個函數(shù)的參數(shù)之間要用逗號分開。 -End- |
|