VBA動態陣列是程式在處理大量資料時必須掌握的工具,本文介紹ReDim和Preserve這2個主要語法,先建立觀念,再以一個簡單Excel範例說明在實務場合可以如何使用。
目錄
Toggle一、VBA編譯錯誤
VBA中ReDim作用是可以變更陣列的空間大小,在此先用一個簡單的錯誤範例,從反面瞭解它的特性。
先用Array函數設定一個包含ABC三個文字的陣列,然後想要用ReDim重新設定將陣列空間縮減為上限是一:「ReDim A(1)」,執行的時候會提示「編譯錯誤:不正確的ReDim」。
可以想做是本來已經打造了一個固定空間的倉庫,或者說就是只有三個木製抽屜,沒有辦法再做調整,因此程式回應此項任務是窒礙難行。

二、動態陣列Redim
藉由錯誤初步瞭解了性質之後,接下來做個修正。在最前面加一個「Dim ()」,這是宣告動態陣列的語句,有點類似於它是一個雲端空間,有伸縮彈性,也可以理解為是並沒有事先確定此空間的大小,而是先預告提出來有這個需求。
接著是和上個步驟相同的程式語句﹐如此就能順利執行了,不會再有編譯錯誤。
注意到通常程式語言的編譯錯誤是接近於文法錯誤,而其實在這裡的「Dim A()」除了是動態陣列之外,另一層意義是它並沒有設定資料形態,等同於是最廣泛的Variant變數。因此程式是否能夠執行成功,除了要考慮陣列本身的特性,還有一個可能是資料形態是否符合。
不過話說回來也是和語言一樣,文法只是個檢查機制,以程式而言最重要的是執行成功,能否實現預期效果。只要能夠順利執行,到底是資料形態有沒有影響在一一開始可以先不深入探討。
這裡有一個實質上必須注意的地方,ReDim預設會將原來的資料刪除,因此在此使用Join合併陣列元素的時候,其實所有元素都已經是空白,合併之後也是一片空白,因此在右側的即時運算視窗沒有看到任何東西。

三、Preserve修飾詞
依照專案需求,有時候也許是一個彈性的陣列空間,每次ReDim填入不同數目的全新資料進去﹐例如1月份資料、2月份資料,但是也有些時候是想要進行資料更新添加,在這種場合會希望變更範圍的動態陣列會保留原來的值,此時可以再加一個修飾詞,亦即這裡看到的「ReDim Preserve A(1)」。所以原先陣列是「”A”,”B”,”C”」,經過調整且保留原值之後,變成是「A B」。

四、資料型態與預設
關於動態陣列有兩個特性有兩個可以補充的地方。首先由於動態陣列會需要保留更多彈性空間,在資料形態的部份不用特別限定,如果像這裡範例所看到的整數形態「Dim A() As Integer」,執行時會提示錯誤:「型態不符合」。所以原則上直接省略保留預設值Variant就可以了。
另外使用Preserve保留值的時候,可能會遇到調整後的空間比原先的陣列還要大,那麼針對多出來的空間,程式會給予預設的資料值,也就是空白。此時在Join第2個參數特別使用逗號:「Join(A, ”,”)」,如此在右側的「即時運算」結果很容易看出來是有空白值:「1,2,3,,,」。

五、陣列迴圈設定
先前第三步驟提到資料可能會持續更新增加,希望在每一次增加都可以動態調整陣列大小,保留原有資料的同時將新的資料加進去,在此設計簡單的迴圈語句模擬這個機制和過程。
「For i = 1 to 3」是設定i為1到3的遞增變數,也就是1、2、3,在迴圈裡面每次i增加1就把動態陣列增加一個空間的位置,並且把這個新的位置填入i值,進行三次迴圈結束之後,把陣列合併顯示出來,得到的結果一如預期就是「1 2 3」。

六、工作表報表資料
經過VBA編輯器測試之後比較瞭解了動態陣列的特性,在Excel工作表同樣是一個相對比較簡單、但是有點接近實際狀況的資料。其中「一月」欄位有三筆資料:「A001」、「A002」、「A003」,這三筆也許是業務訂單,也許是會計傳票,也許是人事的員工編號。

七、Excel陣列應用
依照Excel資料狀況設計相對應的VBA程式,首先假設不知道到底有多少筆資料,因此宣告動態陣列,利用「N = [A1].CurrentRegion.Rows.Count」確定資料有多少筆,然後以「ReDim A(1 To N)」調整動態陣列的空間,最後跑迴圈將工作表資料寫入調整空間後的陣列中,最後簡單的「Debug.Print Join(A, “,”)」將結果列印出來,便是「一月, A001, A002, A003」。

VBA動態陣列的重要性
動態陣列算是在VBA學習地圖中較為進階的內容,本篇文章雖然將範例簡化,剛開始接觸的讀者應該也會覺得有些困難度。儘管如此,這部份是在實務應用上一定要掌握的技能,分兩個層面說明:
其一,從簡單範例也可以大概看到實務上當資料量大且結構較為複雜,可能會持續更新增加的情況下,此時勢必要使用動態陣列變數進行處理。
其二,動態陣列在很多程式語言其實都有類似工具,而且在處理資料時是用類似的方法。
從以上兩個角度而言,動態陣列是無可避免必須學習的項目。
微軟說明頁面:使用陣列。
想要更多完整的學習資源嗎?歡迎前往贊贊小屋VBA教學中心!