VBA 變數的使用範圍和有效期間

 



在進入本篇文章之前,您不妨可以先思考看看,對於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會出現編譯錯誤,變數未定義。


程序2執行時出現,顯示編譯錯誤:  變數未定義。



使用Private關鍵字,模組間無法共享變數

加上Private關鍵字,代表這個變數是模組等級的變數,只能適用在模組內的所有程序,在執行模組內程式時,其值是有效的。

模組等級變數如同剛剛說明的,只能在同一個模組內使用,其他模組並不能使用這個變數,如果使用的話,會產生編譯錯誤: 變數未定義的訊息。

我們可以看下圖,
模組1的程序正常輸出,但模組2的程序並沒辦法正常執行。


使用Const關鍵字,在模組內共享設定的變數值

如果想要在模組內共享變數值,只需要使用Const宣告變數即可,不需要使用Dim。使用Dim無法共享變數值。

如下圖所示,使用Const關鍵字,程序1及程序3皆能正常輸出。


使用Dim的話,不管呼叫哪一個程序都無法共享設定的變數值。


單純只是想共同使用同一個變數,只使用Dim就可以,但千萬要注意...

但如果您只是想使用這個變數,並沒有想要共享設定的變數值,可以不必加上 Const 的常數宣告方式。 

從下圖我們可以看到,程序1和程序3都是使用同一個變數,在各自的程序內給值,都可以正常輸出。


但是千萬要注意一件事情,對於太多程序去使用同一個變數值,如果不是常數,可能會修改到變數,這在撰寫程式時,很容易發生錯誤。

這就像同一件事情給太多人做,A做了一份報告,B也拿了這份報告去改,然後當A要拿著報告去交的時候,才發現,內容已經被修改成B的報告了,自己的報告被覆蓋。已經不是原本A自己的報告了。


如下圖所示,程序1在自己的程序內,重新再呼叫一次變數時,原先賦值給變數的A已經在呼叫程序3時,被程序3修改成B了。

因此當程序1再次呼叫變數,但已經不是原本的A了。



全域變數及區域變數的概念,在每個程式語言應該都會有相同的情況,
您也可以認為把變數放在宣告區,就是全域變數的概念。
放在程序裡面執行的變數,就是區域變數的概念。

在撰寫程式的時候,千萬要注意。

只在程序內使用變數

如果您只想要在程序內宣告變數,程序執行完即失效,那麼只要在程序內單獨使用Dim宣告變數即可。

從下圖可以觀察到,使用Dim 定義在程序1的變數,在程序1內可以正常輸出,但在程序3卻不能使用,這是因為此時的Dim宣告的變數為程序等級變數,只能在自己本身的程序使用,並不能給其他程序使用。

如果您想要程序1和程序3都能使用,請使用模組等級變數的定義方式,也就是在宣告區定義變數,就可以讓模組內的程序都可以使用同一個變數。



張貼留言 (0)
較新的 較舊