VBA陣列宣告與寫入是進階學習必須掌握的工具,主要用於儲存、處理、分析大量的資料,本文介紹基本語法,同時補充資料形態與動態陣列2個重要觀念。
目錄
Toggle一、陣列宣告與寫入
陣列是依照固定順序或者結構所組成的多數資料,VBA宣告陣列的語法相對簡單:「Dim A(2)」,Dim關鍵字加上陣列名稱(A),括號裡面是需要的資料數量(2)。這裡宣告指的是程式跟電腦作業系統請求使用資料倉庫,亦即在電腦記憶體空間中保留幾個位置給程式使用。
在此特地提到資料倉庫的概念,不僅僅因為它對應到電腦的記憶體容量,更因為既然是倉庫,就會有空間大小的考量。為了能夠容納各種不同的資料形態,宣告陳列的時候如果沒有指定資料形態,預設會是最大的Variant。以簡單的整數和帶小數的數字為例,很明顯同樣大小的數值,不帶小數的整數(10)會比帶個小數(10.00)的數字更節省空間。因此建議養成設定資料類型的習慣,例如這裡範例看到的「Dim A(2) As String」是宣告文字類型的陣列。
另外有個要補充的是陣列和一般電腦計算機程式相同,都是從零開始,因此這裡賦值的時候是從第0個空間,然後第1個空間這樣的順序賦值,最後以「Join」合併陣列元素再列印出來,在右側「即時運算」視窗到的結果是「0 1 2」。
二、固定空間陣列編號
上個步驟最後提到陣列預設從零開始,所以「A(2)」可說是省略起始值,實際上是從0開始到2,有0、1、2共三個資料倉庫空間。
既然瞭解了它是省略的預設值,如果想要符合一般自然數連續編號的習慣,可以明定從1開始,例如這裡看到的宣告方式「Dim A(1 To 3)」,表示是1到3的陣列空間,當然這裡的1和3只是範例,實際設計程式可依照需求設定為不同數字,或者跟上個步驟一樣,簡潔語法宣告陣列即可。
三、陣列索引超出範圍
熟悉了陣列宣告,應該知道它就類似於飯店房間一樣,一整排的房間、或者櫃子、或者抽屜。在此簡單做個測試,宣告的是「A(2)」,定下了0到2的空間,但是想要把資料放進抽屜的時候,如果硬要放到不存在的A(3),很顯然程式無法執行,就會跳出「執行階段錯誤」,表示「陣列索引超出範圍」,有了先前步驟的基礎,應該很容易可以瞭解這裡的意義。
四、刪除不存在工作表
上個步驟所看到的陣列索引超出範圍是很常見到的錯誤類型,尤其是在很多並沒有明顯使用陣列的場合也會看到,因此這裡特地以一個範例跟各位介紹。
例如目前活頁簿裡面只有三個工作表,設計程式硬要刪除第4個工作表,實際執行就會跳出同樣的「陣列索引超出範圍」的錯誤。
可以想做活頁簿就是一個陣列,在這個陣列裡面目前只有三個元素,依序分別為「工作表1」、「工作表2」、「工作表3」。在這種情況下,要求VBA程式去刪除第4張工作表,因此會回應陣列索引超出1到3的範圍了,這是用程式語言的描述,白話文是這個東西不存在,叫我怎麼刪除!
五、不同資料型態陣列
先前第一步驟提到宣告陣列如果沒有明文指定資料類型,它會跟一般VBA設定變數一樣預設是Variant形態。原則上建議最好是指定類型,然而反過來說,在一些少數的特殊情況,也許就是希望陣列元素可以容納不同形態的資料,此正好反過來利用Variant的特性。
例如這裡簡單範例所看到的,宣告並設定三個陣列元素,第1個是數值,第2個是文字,第3個是真假值,三個元素不同資料形態,一起放在同一個Variant陣列中。
六、變數設定陣列錯誤
程式專案設計的時候,可能會希望以變數設定陣列範圍,可是如同這裡範例所看到的,VBA提示「編譯錯誤」,意即程式語法結構上就有問題,陣列的範圍邊界「必須是常數運算式」。
這部分其實也可以理解,因為先前提到陣列宣告就是要求在電腦記憶體中保留一定的空間,但如果空間範圍都沒有辦法確定,是使用變數的話,程式或者是電腦作業系統無法執行此項命令。
七、Const常數設定陣列
既然必須是常數運算式,而在VBA除了變變是使用Dim跟Let宣告設定之外,其實還有較少用到的Const,其作用是設定常數。在此沿用上個步驟基本相同的語法,但是名稱前面加一個Const,如此成功宣告陣列。
八、動態陣列ReDim調整
雖然用Const語法可以宣告陣列,但其實是用擬定一個常數的方式,而在VBA或者在一般程式裡面常數的值是不會也不能夠改變,所以用到的機會較少。以陣列而言,通常是使用動態陣列。
實務上會用到動態陣列的場合,是類似於想舉辦一個活動,可是不知道會有多少人參加,因此先擺放無數張椅子,等到人陸續進來都坐好了,不會再有變動了,這時候已經確認椅子數量,把多的椅子收起來,也就是從變動不確定到需求固定的過程。
對應到這裡的VBA程式範例,先宣告一個不確定、不固定的動態陣列:「Dim A()」,然後再以關鍵字ReDim重新定義或者確認陣列的空間大小,這時候就可以使用變數了「ReDim A(N)」。
這裡是極為簡單的範例,實際的專案程式通常中間會有一些執行計算的過程﹐確定了到底需要多少元素,再以ReDim固定陣列範圍。
Excel工作表與VBA陣列應用
陣列是處理大量資料的核心概念,大部份程式語言都會以陣列作為基本工具,而在VBA由於Excel的工作表儲存格本身可說是預先定義好的陣列空間,因此設計程式也許會直接在工作表上處理資料,可是當資料量大或者要進行複雜計算分析的時候,使用陣列會是比較效率也是比較方便的,關於這部分的實際應用,可以參考贊贊小屋相關文章。
VBA大量爬蟲程式:陣列、Application.Wait、Hyperlinks實務應用。
微軟說明參考:宣告陣列。
歡迎報名課程:
VBA課程:職場及投資應用,20小時入門進階: