數(shù)組
很多初學(xué)者都要問(wèn),為什么要學(xué)數(shù)組?
?數(shù)組很重要的一個(gè)特點(diǎn)就是讀寫(xiě)速度快(因?yàn)閿?shù)組的數(shù)據(jù)是存儲(chǔ)在電腦內(nèi)存中的)。因此數(shù)組可以提速。
?另一個(gè)就是可以將單元格區(qū)域賦值給數(shù)組,這一點(diǎn)可以極大的簡(jiǎn)化VBA代碼。
下面我們做個(gè)小測(cè)試:我們把表格中A1:G10區(qū)域的數(shù)據(jù)復(fù)制到A12:G21區(qū)域,我們分別用copy方法和數(shù)組寫(xiě)入的方法來(lái)測(cè)試運(yùn)行時(shí)間。
以下是運(yùn)行代碼及運(yùn)行耗費(fèi)時(shí)間對(duì)比。
copy方法寫(xiě)入
數(shù)組寫(xiě)入
我們明顯可以看到用數(shù)組方法將數(shù)據(jù)寫(xiě)入單元格要比直接從單元格復(fù)制到另外一個(gè)單元格節(jié)省一半時(shí)間。
?那么什么是VBA數(shù)組呢?
VBA數(shù)組就是儲(chǔ)存一組數(shù)據(jù)的數(shù)據(jù)空間。數(shù)據(jù)類型可以數(shù)字,可以是文本,可以是對(duì)象,也可以是VBA數(shù)組.
?VBA數(shù)組的形式
VBA數(shù)組是以變量形式存放的一個(gè)空間,它也有行有列,也可以是三維空間。數(shù)組中的元素按次序存儲(chǔ)在數(shù)組中,通過(guò)索引號(hào)進(jìn)行區(qū)分。
?數(shù)組分類
數(shù)組按類型可以分為三種
a.一般分為:常量數(shù)組,靜態(tài)數(shù)組,動(dòng)態(tài)數(shù)組
b.如按維度為:1維,2維,3維......60 維
?常量數(shù)組
array(4,6),這里array是個(gè)函數(shù),功能是返回一個(gè)包含數(shù)組
array(array(34,3,4),array("q","r"))
?靜態(tài)數(shù)組
x(10) 有10個(gè)位置,編號(hào)從0~10,這種情況,默認(rèn)從0開(kāi)始編號(hào)
arr(1 to 10) ,有10個(gè)位置,編號(hào)1~10
arr(1 to 10,1 to 2) 10行2列的空間(可比喻成單元格區(qū)域來(lái)理解),總共20個(gè)位置,這是二維數(shù)組
arr(1 to 10,1 to 2,1 to 3) 三維數(shù)組,總10*2*3=60個(gè)位置。這是三維數(shù)組
?動(dòng)態(tài)數(shù)組
arr() 不知道有多少行多少列
?請(qǐng)認(rèn)真看: ①arr只是一個(gè)數(shù)組變量的代稱,不要跟array函數(shù)混淆。你當(dāng)然可以用brr、crr、acc、a等等作為數(shù)組變量。
②靜態(tài)數(shù)組在執(zhí)行期間不可改變其最大上界限,而動(dòng)態(tài)數(shù)組可以。動(dòng)態(tài)數(shù)組必須強(qiáng)制聲明變量。比如:dim arr() ,而且在使用的時(shí)候需要從新用redim arr()再聲明一次,為了給動(dòng)態(tài)數(shù)組分配存儲(chǔ)空間及維數(shù)、上下界。若要保存動(dòng)態(tài)數(shù)組中之前的數(shù)據(jù)用redim preserve arr() 聲明。動(dòng)態(tài)數(shù)組可以適應(yīng)程序需要并節(jié)省內(nèi)存。
Sub 動(dòng)態(tài)數(shù)組寫(xiě)入()
Dim arr()
Dim row
row = Sheets("sheet2").Range("a65536").End(xlUp).row - 1
ReDim arr(1 To row)'重新定義arr數(shù)組的上界
For x = 1 To row
arr(x) = Cells(x, 1) '將單元格數(shù)據(jù)寫(xiě)入數(shù)組
Next x
Stop
End Sub
關(guān)于動(dòng)態(tài)數(shù)組,我自己的理解 :在將某些符合條件的數(shù)據(jù)寫(xiě)入數(shù)組的時(shí)候,你不知道符合條件的個(gè)數(shù)是多少,數(shù)組的上界你就不知道,這個(gè)時(shí)候就要用到動(dòng)態(tài)數(shù)組了。如果大致估計(jì)一個(gè)上界來(lái)寫(xiě)入數(shù)據(jù),會(huì)出現(xiàn)數(shù)組大小不夠(下標(biāo)越界),或者空余空間過(guò)多而沒(méi)有數(shù)據(jù)的情況。
?創(chuàng)建數(shù)組三大方式
三個(gè)方法:①array函數(shù)創(chuàng)建 ② split函數(shù)創(chuàng)建 ③ 通過(guò)Range對(duì)象直接創(chuàng)建數(shù)組
arr = array(4,6)
arr = split("你好@vba@歡迎@關(guān)注@","@"),以 "@"為間隔將字符串劃分為一個(gè)下標(biāo)從0開(kāi)始的數(shù)組。注意:下標(biāo)從0開(kāi)始。
arr = range("a1:a10") ,這就是在本節(jié)課最開(kāi)始的時(shí)候單元格區(qū)域?qū)懭霐?shù)組的方法。這里arr的大小就是(1 to 10, 1 to 1 ),10行一列。
下面的內(nèi)容,句句是經(jīng)典,處處容易產(chǎn)生疑問(wèn)。
?請(qǐng)認(rèn)真看:①VBA“眼”中的單元格區(qū)域,全部都是二維的,不存在一維。單元格區(qū)域(無(wú)論是一行還是一列,還是多行多列)直接導(dǎo)入內(nèi)存形成的VBA數(shù)組,全部都是二維VBA數(shù)組,不會(huì)形成VBA一維數(shù)組。
②由單元格區(qū)域?qū)雰?nèi)存形成的VBA數(shù)組的最小下標(biāo),都是1(無(wú)論是行下標(biāo)還是列下標(biāo))
③單行單元格區(qū)域的值,經(jīng)過(guò)二次轉(zhuǎn)置會(huì)“脫離”單元格區(qū)域而形成“一行”純數(shù)值,其對(duì)應(yīng)VBA數(shù)組是一維數(shù)組,轉(zhuǎn)置用transpose函數(shù)
例如:arr1 = Application.Transpose(Application.Transpose([a7:d7]))
?數(shù)組的兩個(gè)重要函數(shù):Ubound和Lbound函數(shù)
使用Ubound和Lbound函數(shù)可以計(jì)算數(shù)組的最大和最小索引號(hào)。
一個(gè)一維數(shù)組arr,如果想要知道它得最大索引號(hào)是多少,代碼為: Ubound(arr)
一個(gè)一維數(shù)組arr,如果想要知道它得最小索引號(hào)是多少,代碼為: Lbound(arr)
好了,到這里的分享就結(jié)束了,關(guān)于數(shù)組的東西重在思考理解。慢慢就不覺(jué)得抽象了。
聯(lián)系客服