在進入本篇文章之前,您不妨可以先思考看看,對於VBA變數的使用範圍和有效期間,是否了解呢?
如果您都了解了,在撰寫Excel
VBA時,在使用變數上,也許就比較不容易踩坑。畢竟不管在進行哪種語言的程式設計時,一定要先了解變數的使用範圍,以及變數在什麼時候會失效無法使用。
目錄
{tocify} $title={目錄}
前言
變數會因為宣告時,所在的位置或者是使用關鍵字(例如 Public (公開) , Dim ,
Private (私有)),而有不同的使用範圍和有效期間。
變數種類 | 宣告位置 | 關鍵字 | 說明 |
---|---|---|---|
公開變數 | 宣告區 | Public | 可適用專案內的所有程序,執行專案內程式時其值均有效。 |
模組等級變數 | 宣告區 | Dim或Private | 可適用於模組內的所有程序,執行模組內程式時其值均有效 |
程序等級變數 | 程序內 | Dim | 僅執行程序時其值有效 |
下圖為VBA編輯器的畫面
從上面的左上角可以看到,專案總管的視窗,一個活頁簿就是一個VBA
Project專案。
跨模組使用公開變數
如果您想要在模組1寫一個公開變數給另外的模組使用時,可在宣告區加上Public即可,這樣在模組間使用公開變數時,就不用另外特別宣告變數。
使用Public關鍵字,加上 Const 用常數宣告共享設定的變數值
但如果您想要在跨模組之間共享同一個變數值時,務必要再加上Const
常數的宣告方式,才能共享使用公開變數的變數值,實際畫面如下圖所示,
專案總管區有兩個模組,分別為模組1及模組2,如果要在模組間共享同一個變數值,可看見下方測試結果正常取得設定值 A。
程式碼
'模組1
'宣告Public + Const
Public Const 公開變數 As String = "A"
Sub test1()
Debug.Print "test1呼叫空開變數 = " & 公開變數
End Sub
程式碼
'模組2
' 顯示模組1的公開變數
Sub test2()
Debug.Print "test2呼叫空開變數 = " & 公開變數
End Sub
使用Public關鍵字,未加上使用Const 宣告變數時,無法共享設定的變數值
未加上使用 Const 宣告變數時,不管執行哪一個程序,都會發生錯誤。
單純只是想共享公開變數,只使用Public,但千萬要注意...
但如果您只是想使用這個變數,並沒有想要共享同一個設定的變數值,可以不必加上 Const
的常數宣告方式。
從下圖我們可以看到,模組1和模組2皆使用共同的公開變數,但對於變數的賦值卻是各自給定一個值,在這樣的狀況下,變數在使用時,在程序內不用特別再宣告後才能使用。
千萬要注意:
太多模組共同使用同一個變數時可能會發生的狀況,變數被修改。
這也就是為什麼要使用常數宣告比較安全一點。
如下圖所示,程序1在自己的程序內,重新再呼叫一次變數時,原先賦值給變數的A已經在呼叫程序2時,被程序2修改成B了。
因此當程序1再次呼叫變數,但已經不是原本的A了。
只在模組內使用變數
使用Private關鍵字,加上 Const 用常數宣告,模組間也無法共享設定的變數值
即使是使用了Const的常數宣告,在其他模組也無法共享設定的變數值。
從下圖可以觀察到,程序1正常輸出私有變數,而模組2會出現編譯錯誤,變數未定義。
使用Private關鍵字,模組間無法共享變數
加上Private關鍵字,代表這個變數是模組等級的變數,只能適用在模組內的所有程序,在執行模組內程式時,其值是有效的。
模組等級變數如同剛剛說明的,只能在同一個模組內使用,其他模組並不能使用這個變數,如果使用的話,會產生編譯錯誤: 變數未定義的訊息。
我們可以看下圖,
模組1的程序正常輸出,但模組2的程序並沒辦法正常執行。
使用Const關鍵字,在模組內共享設定的變數值
如果想要在模組內共享變數值,只需要使用Const宣告變數即可,不需要使用Dim。使用Dim無法共享變數值。
如下圖所示,使用Const關鍵字,程序1及程序3皆能正常輸出。
單純只是想共同使用同一個變數,只使用Dim就可以,但千萬要注意...
但如果您只是想使用這個變數,並沒有想要共享設定的變數值,可以不必加上 Const 的常數宣告方式。
從下圖我們可以看到,程序1和程序3都是使用同一個變數,在各自的程序內給值,都可以正常輸出。
這就像同一件事情給太多人做,A做了一份報告,B也拿了這份報告去改,然後當A要拿著報告去交的時候,才發現,內容已經被修改成B的報告了,自己的報告被覆蓋。已經不是原本A自己的報告了。
如下圖所示,程序1在自己的程序內,重新再呼叫一次變數時,原先賦值給變數的A已經在呼叫程序3時,被程序3修改成B了。
全域變數及區域變數的概念,在每個程式語言應該都會有相同的情況,
您也可以認為把變數放在宣告區,就是全域變數的概念。
放在程序裡面執行的變數,就是區域變數的概念。
在撰寫程式的時候,千萬要注意。
只在程序內使用變數
如果您只想要在程序內宣告變數,程序執行完即失效,那麼只要在程序內單獨使用Dim宣告變數即可。
從下圖可以觀察到,使用Dim 定義在程序1的變數,在程序1內可以正常輸出,但在程序3卻不能使用,這是因為此時的Dim宣告的變數為程序等級變數,只能在自己本身的程序使用,並不能給其他程序使用。
如果您想要程序1和程序3都能使用,請使用模組等級變數的定義方式,也就是在宣告區定義變數,就可以讓模組內的程序都可以使用同一個變數。