小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

VBA進階|利用VBA數(shù)組管理數(shù)據(jù)清單和表格

 剩礦空錢 2018-07-18

使用數(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ù)組

2 數(shù)組的開始下標(biāo)(最小下標(biāo))和結(jié)束下標(biāo)(最大下標(biāo))

3 單元格區(qū)域映射到數(shù)組

4 利用索引號(下標(biāo))獲取數(shù)組中的元素

5 數(shù)組轉(zhuǎn)置

6 動態(tài)數(shù)組

6 數(shù)組的聲明與賦值

7 數(shù)組與字符串

8 數(shù)組的最值、求和、個數(shù)統(tǒng)計

9 數(shù)組的查詢和拆分

10 與數(shù)組相關(guān)的其它函數(shù)

11 數(shù)組作為自定義函數(shù)或過程參數(shù)

1 一維數(shù)組與二維數(shù)組

1.1 一維數(shù)組與行

Sub 一維數(shù)組與行()

Dim arr()

arr = [{1,2,3,4}] '直接整體賦值時,上面的聲明不能指定維數(shù)

Range('A3').Resize(1, UBound(arr)) = arr

End Sub

1.2 一維數(shù)組與列

Sub 數(shù)組()

Dim arr()

arr = [{1,'b',3,4}]

Range('A5').Resize(UBound(arr), 1) = Application.WorksheetFunction.Transpose(arr)

End Sub

1.3 二維數(shù)組

Sub 二維數(shù)組()

arr = [{11,12,13;21,22,23;31,32,33}]

Range('B5').Resize(UBound(arr, 2), UBound(arr)) = arr

End Sub

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)值是可以自定義的。)

LBound(ArrayName[,dimension])

ArrayName - 必需的參數(shù)。該參數(shù)對應(yīng)于數(shù)組的名稱。

Dimension - 一個可選參數(shù)。 這需要一個與數(shù)組的維度相對應(yīng)的整數(shù)值。如果是“1”,則返回第一維的下界; 如果是“2”,則返回第二維的下界,依此類推。

二維數(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:

Sub 單元格區(qū)域映射到數(shù)組()

dim arr()

arr = Range('A1').Resize(4, 5)

Range('A6').Resize(UBound(arr), UBound(arr, 2)) = arr

End Sub

將單元格區(qū)域的數(shù)據(jù)保存到數(shù)組以后,數(shù)據(jù)在內(nèi)存中處理,速度更快。

4 利用索引號(下標(biāo))獲取數(shù)組中的元素

數(shù)組元素的值可以通過下標(biāo)獲取。

Sub 二維數(shù)組()

arr = [{11,12,13;21,22,23;31,32,33}]

Range('B5').Resize(UBound(arr, 2), UBound(arr)) = arr

cells(1,1) = arr(2,2) 'arr(2, 2)對應(yīng)22

End Sub

有時需要重新定義數(shù)組大小,才能使用索引。

5 數(shù)組轉(zhuǎn)置

正如單元格區(qū)域可以轉(zhuǎn)置一樣,數(shù)組也可以同樣操作。

Sub 數(shù)組轉(zhuǎn)置()

Dim arr

arr = [{1,2,3,4}]

arr2 = Application.WorksheetFunction.Transpose(arr)

Range('A5').Resize(UBound(arr), 1) = arr2

End Sub

以上操作相當(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。

Sub 二維數(shù)組的聲明與賦值()

Dim arr(1 To 3, 1 To 4) '表示行、列的索引號都是從1開始,聲明一個3行4列的數(shù)組

For i = 1 To 3

For j = 1 To 4

arr(i, j) = i * 10 j

Next j

Next i

Range('A1').Resize(UBound(arr), UBound(arr, 2)) = arr

End Sub

用缺省索引號開始值的聲明:

Sub 一維數(shù)組的聲明與賦值()

Dim arr(3) '表示索引號從0-3的4個元素,等同于arr(0 to 3)

For i = 0 To 3

arr(i) = i 10

Next i

Range('A1').Resize(1, UBound(arr) 1) = arr

End Sub

關(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ù)類型。

Sub 不同類型的數(shù)組元素()

Dim arr(5)

arr(0) = '1' 'Number as String

arr(1) = 'VBScript 'String'

arr(2) = 100 'Number

arr(3) = 2.45 'Decimal Number

arr(4) = #10/7/2013# 'Date

arr(5) = #12:45:00 PM# 'Time

Range('A1').Resize(1, UBound(arr) 1) = arr

End Sub

也可以利用VBA的內(nèi)置函數(shù)Array()聲明常量數(shù)組:

arr = Array(Array('a', 10), Array('b', 20), Array('c', 30))

[a1] = arr(1)(1)

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ù)組:

Sub 重置數(shù)組()

Dim arr1(), arr2()

arr1 = [A1:D11].Value

arr2 = [A1:D11].Value

ReDim arr1(1 To 2, 1 To 3) '重置數(shù)組大小為2行3列的二維數(shù)組,數(shù)組的中的值丟失

ReDim Preserve arr2(1 To 11, 1 To 3) '重置數(shù)組大小為11行3列的二維數(shù)組

MsgBox arr1(2, 3) '結(jié)果顯示為空

MsgBox arr2(2, 3) 'C2單元格的數(shù)值

End Sub

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語句的影響)。它的語法如下:

Split(expression[,delimiter[,count[,compare]]])

expression 必選參數(shù) 包含字符串和分隔符的字符串表達式。

delimiter 可選參數(shù) 用于標(biāo)識字符串邊界的字符串字符。如果忽略,則使用空格字符('')作為分隔符

count 一個可選參數(shù)。要返回的子字符串的數(shù)量,如果指定為-1,則返回所有子字符串。

如:

Sub splitstr()

Sheets('數(shù)組與字符串').Select

s = '紅,red,橙,orange,黃,yellow,綠,green,青,cyan,藍,blue,紫,purple'

arr = VBA.Split(s, ',')

Range('A11').Resize(1, UBound(arr)) = arr

For Each color in arr

MsgBox color

Next

End Sub

7.2 利用Join()函數(shù)將數(shù)組元素合并為一個字符串

Join函數(shù)可用于連接數(shù)組中的所有字串符,從而創(chuàng)建一個新的字串符,可隨意指定分隔符,其語法如下:

Join(sourcearray [,delimiter])

sourcearray 代表數(shù)組,參數(shù)delimiter代表分隔符

如:

Sub joinstr()

a = Array('Red', 'Blue', 'Yellow')

b = Join(a)

b = Join(a, '$')

arr = Range('A1:B7')

For i = 1 To UBound(arr)

Range('d' & i) = Join(Array(arr(i, 1), arr(i, 2)), '-')

Next i

End Sub

7.3 利用Filter()函數(shù)篩選數(shù)組元素

Sub itemFilter()

arr = Array('A056', 'A079', 'B003', 'A007', 'B017')

arrf = Filter(arr, 'A0')

'MsgBox ('The Filter array: ' & Join(arrf))

[A1] = arrf

End Sub

單元格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ù)組的查詢。如:

Sub query()

arr = Array(1, 35, 4, 13)

MsgBox Application.Match(4, arr, 0) '查詢數(shù)值4在數(shù)組Arr中的位置

End Sub

9.2 Index拆分數(shù)組

數(shù)組的拆分在VBA中是一個難題,如果是按行拆分數(shù)組,除了用循環(huán)外也只能借用API函數(shù)完成了。幸好我們可以借用工作表函數(shù)index達到按列拆分數(shù)組,即多列構(gòu)成的數(shù)組,你可以任意拆分出一列構(gòu)成新的數(shù)組。方法是:Application.Index(數(shù)組, 列數(shù)) ,例:

Sub Index拆分數(shù)組()

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

10 與數(shù)組相關(guān)的其它函數(shù)

IsArray()函數(shù)返回一個布爾值,指示指定的輸入變量是否是數(shù)組變量。

Erase()函數(shù)用于重置固定大小數(shù)組的值并釋放動態(tài)數(shù)組的內(nèi)存。

Erase ArrayName

固定數(shù)值數(shù)組,數(shù)組中的每個元素重置為零。

固定字符串?dāng)?shù)組,數(shù)組中的每個元素被重置為零長度''。

對象數(shù)組,數(shù)組中的每個元素被重置為特殊值Nothing。

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ù)。

Function Addm(ParamArray myNumbers() As Variant)

Dim mySum As Single

Dim myValue As Variant

For Each myValue In myNumbers

mySum = mySum myValue

Next

Addm = mySum

End Function

[a1] = =addm(1,212,33,424,55)

[a1] 就會返回上面參數(shù)的總和:725。你可以提供無限制的參數(shù)數(shù)目。注意,每個函數(shù)的參數(shù)之間要用逗號分開。

-End-

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多