本書前面介紹的都是通過(guò)簡(jiǎn)單變量名來(lái)訪問(wèn)數(shù)據(jù)。在VBA中,除了使用這些簡(jiǎn)單變量名外,對(duì)于在批量的數(shù)據(jù)還可使用數(shù)組來(lái)訪問(wèn)。本章介紹數(shù)組的定義和使用方法。
對(duì)于大量有序的數(shù)據(jù),可以使用數(shù)組對(duì)其進(jìn)行存儲(chǔ)和處理。在其他程序設(shè)計(jì)語(yǔ)言中,數(shù)組中的所有元素都必須為同樣的數(shù)據(jù)類型。在VBA中,數(shù)組中各元素可以是相同的數(shù)據(jù)類型,也可以是不同的數(shù)據(jù)類型。數(shù)組用來(lái)保存一組有序的數(shù)據(jù),如圖8-1所示的數(shù)據(jù)共有5項(xiàng),可使用數(shù)組來(lái)保存這些數(shù)據(jù)。
如圖8-1所示的數(shù)據(jù)又稱為列表數(shù)據(jù),可使用前面的項(xiàng)目名稱加上數(shù)據(jù)元素在列表中的序號(hào)來(lái)表示每一個(gè)數(shù)據(jù)元素。這類數(shù)據(jù)只具有行或列,稱為一維數(shù)組。
如果將由行和列組成的數(shù)據(jù)表定義為一個(gè)數(shù)組,那么這個(gè)數(shù)組就是二維數(shù)組。Excel的工作表就可用一個(gè)二維數(shù)組表示,表中每個(gè)元素的位置由它的行號(hào)和列號(hào)決定,如圖8-2所示。
如果需要處理的數(shù)據(jù)除了在行和列上進(jìn)行排列之外,還具有深度(即多個(gè)二維表格),類似于Excel工作簿中的多個(gè)工作表,如圖8-3所示。保存這種結(jié)構(gòu)數(shù)據(jù)的數(shù)組稱為三維數(shù)組。
計(jì)算機(jī)中數(shù)組占用一片連續(xù)的內(nèi)存空間。在使用之前,必須先對(duì)數(shù)組進(jìn)行定義,讓系統(tǒng)為其分配一片連續(xù)的內(nèi)存空間。
數(shù)組的聲明方式和其他的變量是一樣的,可以使用Dim,Static,Private或Public語(yǔ)句來(lái)聲明。聲明標(biāo)量變量(非數(shù)組)與數(shù)組變量的不同在于必須為數(shù)組指定大小。若數(shù)組的大小被指定的話,則它是個(gè)大小固定的數(shù)組;若程序運(yùn)行時(shí)數(shù)組的大小可以被改變,則它是個(gè)動(dòng)態(tài)數(shù)組。
該格式與其他程序設(shè)計(jì)語(yǔ)言定義數(shù)組的格式相同,只給出數(shù)組下標(biāo)的上界(即可以使用的最大下標(biāo)值)而流程圖下標(biāo)的下界,這時(shí)默認(rèn)值為0,即數(shù)組的下標(biāo)從0開始至定義的上界。例如,
使用該語(yǔ)句指定的數(shù)組下標(biāo)的默認(rèn)下界只能為0或1。該語(yǔ)句只能出現(xiàn)在用戶窗體或模塊的聲明部分,不能出現(xiàn)在過(guò)程中,且必須放在數(shù)組定義之前。
★在VBA中定義數(shù)組時(shí),要求其下標(biāo)必須為常數(shù),不能是變量或表達(dá)式。例如以下代碼在執(zhí)行時(shí)將會(huì)報(bào)錯(cuò),如圖8-4所示。
Dim?。幔ǎ椋?/div>
For j = 1 To 5
a(j) = j
Next
8.2.2 定義二維數(shù)組
二維數(shù)組的定義方式與一維數(shù)組類似,不同的是需要設(shè)置兩個(gè)下標(biāo)變量。其語(yǔ)法格式如下:
Dim 數(shù)組名(第1維上界,第2維上界) As 數(shù)據(jù)類型
或者是:Dim 數(shù)組名(第1維下界 To 第1維上界,第2維下界 To 第2維上界) As 數(shù)據(jù)類型
例如,定義以下數(shù)組用來(lái)保存如圖8-2所示的數(shù)據(jù)表。
Dim MyArray(1 To 3,1 To 5)
其中MyArray(1,1)保存值為“朱元軍”,MyArray(1,2)保存值為“男”,各元素與值的對(duì)應(yīng)關(guān)系如圖8-5所示。
定義多維數(shù)組的格式與二維數(shù)組類似,每一維都使用逗號(hào)隔開即可。要注意的是,定義大數(shù)據(jù)量的數(shù)組將占用很大的內(nèi)存空間,特別是定義多維數(shù)組時(shí)要考慮這一點(diǎn)。例如:
Dim MyArray(1 To 10000) As Integer
定義一個(gè)數(shù)組,具有10000個(gè)元素,相當(dāng)于定義10000個(gè)變量。
Dim MyArray(1 To 10,1 To 10000) As Integer
定義一個(gè)二維數(shù)組,具有10×10000=10萬(wàn)個(gè)元素,而
Dim MyArray(1 To 10,1 To 10,1 To 10000) As Integer
定義一個(gè)三維數(shù)組,具有10×10×10000=100萬(wàn)個(gè)元素。
8.2.3 默認(rèn)數(shù)組
在VBA中,允許定義默認(rèn)數(shù)組,即數(shù)據(jù)類型為Variant(默認(rèn)類型)的數(shù)組。一般情況下,定義數(shù)組時(shí)都要設(shè)置其數(shù)據(jù)類型,例如:
Dim MyArray(10) As String
表示定義一個(gè)名為MyArrayr數(shù)組,該數(shù)組為字符串類型(即每個(gè)元素都為一個(gè)字符串型的變量)。
若將其定義改為:
Dim MyArray(10)
則表示定義一個(gè)名為MyArray的默認(rèn)數(shù)組,與以下語(yǔ)句相同:
Dim MyArray(10) As Variant
使用默認(rèn)數(shù)組的好處是可以讓每個(gè)數(shù)組元素保存一個(gè)不同類型的值,得到一種混合狀態(tài)的數(shù)組。例如:
Dim MyArray(1 To 5)
MyArray(1)="朱元軍"
MyArray(2)="男"
MyArray(3)="30"
MyArray(4)="大專"
MyArray(5)="北京市"
在以上數(shù)組中,第3個(gè)元素保存的是一個(gè)整型數(shù),其余元素保存的是字符串。
8.3 動(dòng)態(tài)數(shù)組
動(dòng)態(tài)數(shù)組是指在程序運(yùn)行時(shí)大小可以改變的數(shù)組。大小不可改變的數(shù)組稱為靜態(tài)數(shù)組。定義靜態(tài)數(shù)組時(shí),其下標(biāo)的下界和上界只能由常量來(lái)進(jìn)行設(shè)置,而動(dòng)態(tài)數(shù)組可使用變量來(lái)設(shè)置下標(biāo)。定義動(dòng)態(tài)數(shù)組一般分兩個(gè)步驟:首先在用戶窗體、模塊或過(guò)程中使用Dim或Public聲明一個(gè)沒(méi)有下標(biāo)的數(shù)組(不能省略括號(hào)),然后在過(guò)程中用ReDim語(yǔ)句重新定義該數(shù)組的大小。
ReDim語(yǔ)句在過(guò)程級(jí)別中使用,用于為動(dòng)態(tài)數(shù)組變量重新分配在存儲(chǔ)空間。其語(yǔ)法格式如下:
ReDim?。跴reserve]數(shù)組名(下標(biāo))?。跘s 數(shù)據(jù)類型]
可以使用ReDim語(yǔ)句反復(fù)改變數(shù)組的元素及維數(shù)的數(shù)目,但是不能在將一個(gè)數(shù)組定義為某種數(shù)據(jù)類型之后,再使用ReDim將該數(shù)組改為其他數(shù)據(jù)類型,除非是Variant所包含的數(shù)組。
如果使用了Preserve關(guān)鍵字,那么只能重定義數(shù)組最后一維的大小,并且不能改變維數(shù)的數(shù)目。例如,以下代碼中,首先由用戶輸入一個(gè)數(shù)值,設(shè)置數(shù)組下標(biāo)的上界;然后要求用戶輸入每個(gè)元素的值,并將用戶輸入的值輸出到“立即窗口”中。
Dim i As Integer, j As Integer
i = Val(InputBox("請(qǐng)輸入數(shù)組的上界","定義動(dòng)態(tài)數(shù)組",5))
ReDim DArray(i)
For j = 1 To i
DArray(j) = InputBox("請(qǐng)輸入數(shù)組的第" & j & "個(gè)元素的值")
Next
For j = 1 To i
Debug.Print DArray(j)
Next
End Sub
以上代碼在模塊的聲明部分定義了一個(gè)動(dòng)態(tài)數(shù)組DArray,然后在“動(dòng)態(tài)數(shù)組”過(guò)程中使用變量i重新定義該動(dòng)態(tài)數(shù)組的大?。╥的值由用戶輸入)。執(zhí)行以上代碼時(shí),將首先打開如圖8-6所示的對(duì)話框,讓用戶設(shè)置數(shù)組的上界。
按用戶輸入的值對(duì)數(shù)組重設(shè)大小后,將打開如圖8-7所示對(duì)話框,要求用戶輸入每一個(gè)元素的值,最后在“立即窗口”中輸出數(shù)組中每個(gè)元素的值。
8.4 數(shù)組的基本操作
聲明一個(gè)數(shù)組后,就可以對(duì)數(shù)組或數(shù)組中的元素進(jìn)行操作了。操作通常包括數(shù)組的初始化、數(shù)組元素的復(fù)制及刪除等。
8.4.1數(shù)組的初始化
在VBA中,創(chuàng)建數(shù)組后將自動(dòng)初始化數(shù)組中的每個(gè)元素:對(duì)于數(shù)值型的數(shù)組,每個(gè)元素都將清零件如果是字符串型的數(shù)組,每個(gè)元素將初始化為空字符串。
注意:如果是重定義動(dòng)態(tài)數(shù)組,并且使用了Preserve關(guān)鍵字,則不會(huì)對(duì)已有元素進(jìn)行初始化,而只對(duì)新增加的元素進(jìn)行初始化。
在對(duì)數(shù)組中的元素進(jìn)行處理之前,仍可能需要對(duì)數(shù)組元素進(jìn)行初始化。一般使用循環(huán)語(yǔ)句來(lái)進(jìn)行操作,可讓用戶逐個(gè)輸入數(shù)組的初始值;也可按一定的規(guī)則讀取工作表單元格中的值來(lái)對(duì)數(shù)組賦初始值。例如,以下代碼要求用戶集資輸入10個(gè)數(shù)組元素的初始值。
For?。椋??。裕铩?0
MyArray(i) = InputBox("請(qǐng)輸入數(shù)組的第" & i & "個(gè)元素的值")
Next
執(zhí)行以上代碼,將反復(fù)顯示輸入框,讓用戶輸入值,并保存到對(duì)應(yīng)的數(shù)組元素中。
注意:InputBox函數(shù)返回的是字符串類型。如果數(shù)組定義為數(shù)值型,還需要使用相關(guān)的函數(shù)將用戶輸入的內(nèi)容進(jìn)行轉(zhuǎn)換,如用Val函數(shù)將字符串轉(zhuǎn)換為數(shù)值,也可以使用如Ccur,Cdate,CDbl,Cint等相關(guān)函數(shù)進(jìn)行轉(zhuǎn)換。
以下代碼使用工作表單元格中的數(shù)據(jù)來(lái)為數(shù)組元素賦初始值。
Sub ArrayInit() '使用工作表單元格中的數(shù)據(jù)來(lái)為數(shù)組元素賦初始值
Dim MyArray(5,5)
Dim i As Integer, j As Integer
For i = 1 To 5
For j = 1 To 5
MyArray(i,j) = Worksheets("sheet2").Cells(i,j)
Next j
Next i
End Sub
工作表就相當(dāng)于一個(gè)二維數(shù)組,每個(gè)單元格就是二維數(shù)組中的一個(gè)元素。使用工作表中某部分單元格為數(shù)組賦初值時(shí),通過(guò)兩個(gè)循環(huán)的嵌套就可完成。
通過(guò)InputBox函數(shù)初始化數(shù)組時(shí),需要用戶逐個(gè)輸入,速度很慢。在VBA中,還可使用Array函數(shù)來(lái)為數(shù)組元素賦值,把一個(gè)數(shù)據(jù)集讀入數(shù)組中。其語(yǔ)法格式如下:
數(shù)組變量名?。健rray(數(shù)據(jù)集)
其中“數(shù)組變量名”是預(yù)先定義的數(shù)組名,后面不跟括號(hào);函數(shù)中的“數(shù)據(jù)集”是由一些常數(shù)構(gòu)成的數(shù)據(jù)集合,各值之間用逗號(hào)分開。例如:
Sub ArrayInitl() '使用Array函數(shù)初始化數(shù)組
Dim MyArray, i As Integer
MyArray = Array("星期日","星期二","星期三","星期四","星期五","星期六")
For i = 0 To 6
Debug.Print MyArray(i)
Next
End Sub
字符串“星期日”、“星期一”、“星期三”、“星期四”、“星期五”和“星期六”分別賦給數(shù)組MyArray中的各對(duì)應(yīng)元素,即MyArray(0)=“星期日”、MyArray(2)=“星期一”……MyArray(6)=“星期六”。
注意:因?yàn)锳rray函數(shù)的返回值為Variant類型,所以在使用Array函數(shù)給數(shù)組變量賦初值之前,定義數(shù)組時(shí)只能將其定義為Variant類型,且不能設(shè)置其下標(biāo),否則將顯示“不能給數(shù)組賦值”錯(cuò)誤提示。
8.4.2 數(shù)組元素的復(fù)制
單個(gè)的數(shù)組元素可像普通變量一樣進(jìn)行訪問(wèn)和賦值。因此,要將一個(gè)數(shù)組中的值復(fù)制到另一個(gè)數(shù)組時(shí),使用For循環(huán)語(yǔ)句將數(shù)組元素逐個(gè)復(fù)制即可。例如:
Sub 數(shù)組元素的復(fù)制()
Dim MyArray1(5) As Integer,MyArray2(5) As Integer
Dim i As Integer
For i = 1 to 5
MyArray1(i) = i
Next
For i = 1 To 5
MyArray2(i) = MyArray1(i)
Next
End Sub
在以上代碼中,如果將數(shù)組MyArray2聲明為一個(gè)Variant變量,那么通過(guò)一條語(yǔ)句就能將MyArray1中的所有元素復(fù)制到MyArray2中。
Sub 數(shù)組元素的復(fù)制()
Dim MyArray1(5) As Integer,MyArray2 As Variant
Dim?。椋健? To 5
MyArray1(i)= i
Next
MyArray2 = MyArray1 '將數(shù)組元素保存到Variant變量中
End Sub
通過(guò)MyArray2=MyArray1語(yǔ)句賦值后,變量MyArray2將保存一個(gè)數(shù)組變量。可使用MyArray2(1),MyArrqy2(2)的形式訪問(wèn)數(shù)組中每個(gè)元素的值。
8.4.3 數(shù)組的清除
對(duì)于靜態(tài)數(shù)組,當(dāng)創(chuàng)建完成后,其內(nèi)存空間也分配完成,數(shù)組的大小將不能再改變。有時(shí)可能需要清除數(shù)組的內(nèi)容或?qū)?shù)組重新定義,可使用Erase語(yǔ)句來(lái)完成。其語(yǔ)法格式如下:
Erase 數(shù)組名1,數(shù)組名2,……
使用Erase語(yǔ)句可重新初始化大小固定的數(shù)組的元素,以及釋放動(dòng)態(tài)數(shù)組的存儲(chǔ)空間。
注意:在Erase語(yǔ)句中,只給出數(shù)組名即可,不能帶括號(hào)和下標(biāo)。
Erase語(yǔ)句根據(jù)參數(shù)是靜態(tài)數(shù)組還是動(dòng)態(tài)數(shù)組而采取完全不同的行為。
如果參數(shù)為靜態(tài)數(shù)組,Erase按表8-1所示的規(guī)則來(lái)設(shè)置固定數(shù)組的元素。
如果參數(shù)為動(dòng)態(tài)數(shù)組,將刪除整個(gè)數(shù)組結(jié)構(gòu)并釋放卻動(dòng)態(tài)數(shù)組所使用的內(nèi)存。在下次引用該動(dòng)態(tài)數(shù)組之前,程序必須使用ReDim語(yǔ)句來(lái)重新定義該數(shù)組變量的維數(shù)。
也就是說(shuō),靜態(tài)數(shù)組在使用Erase語(yǔ)句后仍然存在,只是其內(nèi)容被清空;而動(dòng)態(tài)數(shù)組使用Erase語(yǔ)句后即不存在了。例如:
Sub 刪除數(shù)組()
Dim MyArray() As Integer '動(dòng)態(tài)數(shù)組
Dim MyArray1(5) As Integer '靜態(tài)數(shù)組
Dim?。椤s Integer
i=5
ReDim MyArray(i)
For?。椋? To 5
MyArray1(i)?。健。?/div>
MyArray(i)=?。?/div>
Next
Erase MyArray,MyArray1
Debug.Print MyArray1(1) ?。ъo態(tài)數(shù)組被初始化,其元素值為0
Debug.Print MyArray(1) '動(dòng)態(tài)數(shù)組被刪除,將出錯(cuò)
End Sub
程序中首先定義了一個(gè)動(dòng)態(tài)數(shù)組MyArray和一個(gè)靜態(tài)數(shù)組MyArray1,然后使用循環(huán)語(yǔ)句對(duì)兩個(gè)數(shù)組的元素賦初始值,再使用Erase語(yǔ)句刪除這兩個(gè)數(shù)組,最后再訪問(wèn)兩個(gè)數(shù)組中的一個(gè)元素。對(duì)于靜態(tài)數(shù)組,使用Erase語(yǔ)句只是將其初始化,所以MyArray1(1)的值為0;對(duì)于動(dòng)態(tài)數(shù)組,使用Erase語(yǔ)句后該數(shù)組就不存在了,所以將顯示錯(cuò)誤提示。
8.4.4 數(shù)組函數(shù)
在程序中,有時(shí)需要判斷某個(gè)變量是否為數(shù)組,或數(shù)組的下標(biāo)范圍等。VBA提供了相應(yīng)的函數(shù)來(lái)進(jìn)行這些操作。
VBA中操作數(shù)組的主要有5個(gè)函數(shù):Array,IsArray,Erase,Lbound和Ubound。其中Array和Erase已在前面進(jìn)行了介紹,下面介紹另三個(gè)函數(shù)的使用方法。
1. 檢測(cè)變量是否為數(shù)組
IsArray函數(shù)可檢查指定的變量是否為一個(gè)數(shù)組:如果指定變量是一個(gè)數(shù)組,返回值為True,否則返回False。對(duì)于包含數(shù)組的Variant表達(dá)式來(lái)說(shuō),IsArray尤為有用。例如:
Dim MyArray(1 To 5) As Integer,YourArray,MyCheck ?。暶鲾?shù)組變量
YourArray = Array(1,2,3) '使用數(shù)組函數(shù)
MyCheck?。健sArray(MyArray) '返回True
MyCheck?。健sArray(YourArray) '返回True
2. 獲得數(shù)組下標(biāo)的范圍
LBound函數(shù)和UBound函數(shù)可獲得數(shù)組下標(biāo)的下界和上界。其語(yǔ)法格式為:
LBound(數(shù)組名[,維數(shù)])
UBound(數(shù)組名[,維數(shù)])
其中“維數(shù)”為“1”表示一維,“2”表示二維,如此類推。如果省略該參數(shù),表示返回一維的下標(biāo)下界或上界。例如,定義以下數(shù)組
Dim A(1 To?。保埃?,0 To?。?,-3 To?。矗?/div>
則使用LBound函數(shù)的返回值分別為:
LBound(A,1) ?。Х祷刂禐椋?/div>
LBound(A,2) ?。Х祷刂禐?
LBound(A,3) ?。Х祷刂禐?3
★★
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存
查看更多類似文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!
微信登錄中...
請(qǐng)勿關(guān)閉此頁(yè)面
先別劃走!
送你5元優(yōu)惠券,購(gòu)買VIP限時(shí)立減!
優(yōu)惠券還有10:00過(guò)期
馬上使用
×