數組基礎知識精華版
這節課分享VBA基礎知識中的數組知識。小編吸取各個教程的精華,加上自己對數組的理解及易錯點,特此奉上數組的知識講解。請認真看,你會收穫滿滿。
很多初學者都要問,為什麼要學數組?
?數組很重要的一個特點就是讀寫速度快(因為數組的數據是存儲在電腦內存中的)。因此數組可以提速。
?另一個就是可以將單元格區域賦值給數組,這一點可以極大的簡化VBA代碼。
下面我們做個小測試:我們把表格中A1:G10區域的數據複製到A12:G21區域,我們分別用copy方法和數組寫入的方法來測試運行時間。
以下是運行代碼及運行耗費時間對比。
copy方法寫入
數組寫入
我們明顯可以看到用數組方法將數據寫入單元格要比直接從單元格複製到另外一個單元格節省一半時間。
?那麼什麼是VBA數組呢?
VBA數組就是儲存一組數據的數據空間。數據類型可以數字,可以是文本,可以是對象,也可以是VBA數組.
?VBA數組的形式
VBA數組是以變數形式存放的一個空間,它也有行有列,也可以是三維空間。數組中的元素按次序存儲在數組中,通過索引號進行區分。
?數組分類
數組按類型可以分為三種
a.一般分為:常量數組,靜態數組,動態數組
b.如按維度為:1維,2維,3維......60 維
?常量數組
array(4,6),這裡array是個函數,功能是返回一個包含數組
array(array(34,3,4),array("q","r"))
?靜態數組
x(10) 有10個位置,編號從0~10,這種情況,默認從0開始編號
arr(1 to 10) ,有10個位置,編號1~10
arr(1 to 10,1 to 2) 10行2列的空間(可比喻成單元格區域來理解),總共20個位置,這是二維數組
arr(1 to 10,1 to 2,1 to 3) 三維數組,總10*2*3=60個位置。這是三維數組
?動態數組
arr() 不知道有多少行多少列
?請認真看: ①arr只是一個數組變數的代稱,不要跟array函數混淆。你當然可以用brr、crr、acc、a等等作為數組變數。
②靜態數組在執行期間不可改變其最大上界限,而動態數組可以。動態數組必須強制聲明變數。比如:dim arr() ,而且在使用的時候需要從新用redim arr()再聲明一次,為了給動態數組分配存儲空間及維數、上下界。若要保存動態數組中之前的數據用redim preserve arr() 聲明。動態數組可以適應程序需要並節省內存。
Sub 動態數組寫入()
Dim arr()Dim row
row = Sheets("sheet2").Range("a65536").End(xlUp).row - 1 ReDim arr(1 To row)重新定義arr數組的上界 For x = 1 To row arr(x) = Cells(x, 1) 將單元格數據寫入數組 Next x StopEnd Sub
關於動態數組,我自己的理解 :在將某些符合條件的數據寫入數組的時候,你不知道符合條件的個數是多少,數組的上界你就不知道,這個時候就要用到動態數組了。如果大致估計一個上界來寫入數據,會出現數組大小不夠(下標越界),或者空餘空間過多而沒有數據的情況。
?創建數組三大方式
三個方法:①array函數創建 ② split函數創建 ③ 通過Range對象直接創建數組
arr = array(4,6)
arr = split("你好@vba@歡迎@關注@","@"),以 "@"為間隔將字元串劃分為一個下標從0開始的數組。注意:下標從0開始。
arr = range("a1:a10") ,這就是在本節課最開始的時候單元格區域寫入數組的方法。這裡arr的大小就是(1 to 10, 1 to 1 ),10行一列。
下面的內容,句句是經典,處處容易產生疑問。
?請認真看:①VBA「眼」中的單元格區域,全部都是二維的,不存在一維。單元格區域(無論是一行還是一列,還是多行多列)直接導入內存形成的VBA數組,全部都是二維VBA數組,不會形成VBA一維數組。
②由單元格區域導入內存形成的VBA數組的最小下標,都是1(無論是行下標還是列下標)
③單行單元格區域的值,經過二次轉置會「脫離」單元格區域而形成「一行」純數值,其對應VBA數組是一維數組,轉置用transpose函數
例如:arr1 = Application.Transpose(Application.Transpose([a7:d7]))
?數組的兩個重要函數:Ubound和Lbound函數
使用Ubound和Lbound函數可以計算數組的最大和最小索引號。
一個一維數組arr,如果想要知道它得最大索引號是多少,代碼為: Ubound(arr)
一個一維數組arr,如果想要知道它得最小索引號是多少,代碼為: Lbound(arr)
好了,到這裡的分享就結束了,關於數組的東西重在思考理解。慢慢就不覺得抽象了。
整理自公眾號:每天學點Excel vba(ID:todayvba)
歡迎騷擾。
推薦閱讀: