簡介
本文說明如何在 Microsoft Visual Basic for Applications 中使用 Microsoft Excel 子程序中的變數。
更多資訊
子程序中的變數
程式設計語言的一項強大功能,是將某個項目儲存在變數中,以便在程序稍後使用或變更變數的內容。 本文件探討 Visual Basic 中變數的使用方式:
- 如何宣告變數。
- 可使用變數的程序和專案。
- 變數的存留期。
宣告巨集中的變數
在巨集中宣告變數最簡單的方法是使用 Dim 陳述式。 下列行會將兩個變數宣告為整數:
Dim x As Integer, y As Integer
將 x 和 y 指定為整數,即告訴 Visual Basic 為 x 和 y 各設定一個整數變數 (x 和 y 各 2 位元組) 的足夠記憶體,而儲存在 x 或 y 中的資訊是介於 -32768 和 32767 之間的整數。
注意:如果您使用單一 Dim 陳述式宣告多個變數,則必須指定每個變數的資料型別。
如果您沒有指定每個變數的資料型別,如下列 Visual Basic 程式碼所示,則只會將變數 y 設定為整數變數。 變數 x 會是一種變體類型:
Dim x, y As Integer
如需詳細資訊,請參閱下方的 VARIANT 資料型別。
若要執行變數測試,請遵循下列步驟:
儲存並關閉任何開啟的活頁簿,然後開啟新的活頁簿。
啟動 Visual Basic 編輯器 (按 ALT+F11)。
在 [插入] 功能表上,按一下 [模組]。
輸入以下代碼:
Sub Variable_Test()
Dim x 作為整數,y 作為整數
x = 10
y = 100
MsgBox「x 的值是 」& x & _
Chr (13) &「y 的價值是」& y
End Sub執行 Variable_Test 巨集。 您將收到以下訊息:
the value of x is 10
the value of y is 100按一下 [確定]。
在 Variable_Test 中巨集更改以下行:
x = 10收件人:
x = "error"執行 Variable_Test 巨集。
您會收到執行階段錯誤,因為「錯誤」不是整數,而您嘗試將此字串值指派給整數變數 x。
資料型別摘要
以下是常見的變數資料型別:
VARIANT 資料類型
如果您在宣告變數時未指定資料型別,或完全不宣告變數,則 Visual Basic 會自動指定此變數的變數資料型別。 下列是宣告為此資料型別的變數的優點:
- 變數可以包含字串、日期、時間、布林值或數值。
- 變數可以自動轉換所包含的值。
缺點是變體變數需要至少 16 位元組的記憶體。 在大型程序或複雜模組中,16 位元組的記憶體可能相當顯著。
若要查看其在 Variable_Test 巨集中的運作方式,請遵循下列步驟:
將 Variable_Test 巨集中的程式碼變更為:
Sub Variable_Test()
Dim x, y
x = "string"
y = 1.23
MsgBox "the value of x is " & x & _
Chr(13) & "the value of y is " & y
End Sub
執行 Variable_Test 巨集。
您不會收到錯誤,因為您可以將任何值指派給變體變數 x 和 y。
注意: 您也可以離開下列行,巨集仍可運作,因為變數 x 和 y 會被視為 Variant 資料型別:
Dim x, y
變數的範圍
當您宣告變數時,同一模組中的其他巨集、在其他模組或專案中可能無法看見該變數。 模組中變數的可用性稱為範圍。 這三種範圍類型為程序-層級、私人模組-層級和公用模組-層級。 範圍取決於您宣告變數的方式和位置或變數。
程序-層級範圍
具有程序層級範圍的變數不會出現在宣告程序的範圍之外。 如果您設定具有程序-層級範圍的變數值,其他巨集將不會看到該變數的內容。
若要確認具有程序-層級範圍的變數未出現在宣告的程序之外,請遵循下列步驟:
在專案中插入新模組。
請在此模組中輸入以下兩個巨集:
Sub Macro1 () Dim x 作為整數 x = 10 MsgBox 「x,Macro1 所見為 “ & x '下一行執行 Macro2 Macro2 結束子 Sub Macro2 () MsgBox 「x,Macro2 所見 是 ” & x 結束 Sub執行 Macro1,你會看到以下訊息:
x, as seen by Macro1 is 10點擊 確定,你會收到以下訊息:
x, as seen by Macro2 is按一下 [確定]。
Macro2 不會顯示變數 x 的值,因為變數 x 是 Macro1 的局部值。
私人和公用模組-層級範圍
您可以在模組的宣告區段中定義變數 (模組頂端、在所有子程序之上),並使用公開陳述式、Dim 陳述式或私人陳述式來設定變數的範圍。 如果您將公用陳述式放在變數前面,則變數將可供專案中所有模組中的所有巨集使用。 如果您將 Dim 陳述式或私人陳述式放在變數前面,則變數只能給在宣告它的模組中的巨集使用。
若要查看公開陳述式與 Dim 陳述式之間的差異,請遵循下列步驟:
儲存並關閉任何開啟的活頁簿,然後開啟新的活頁簿。
啟動 [Visual Basic 編輯器]。
在專案中插入模組。
-
Type the following code into this module: Public x As Integer Sub Macro_1a() x = 10 MsgBox x Macro_1b End Sub Sub Macro_1b() x = x * 2 MsgBox x Macro2 End Sub 在專案中插入另一個模組。
在新模組中輸入下列程式碼:
Sub Macro2()
x = x * 3
訊息盒 x
End Sub在第一個模組中執行 Macro_1a 巨集。
當變數 x 宣告為「Public x As Integer」時,專案中的所有三個巨集都可存取 x 的值。 第一個訊息框會顯示值為 10。 第二個消息框會顯示值為 20 (因為 x 在 Macro_1b 中乘以 2)。 第三個訊息框會顯示值為 60 (因為 x 的值在 Macro_1b 中已變更為 20,然後在 Macro2 中乘以 3)。
將第一個模組中的宣告行從以下位置更改:
Public x As Integer收件人:
Dim x As Integer執行 Macro_1a 巨集。
當變數 x 宣告為「Dim x As Integer」時,只有第一個模組中的巨集可以使用 x 的值。 因此,第一個訊息框會顯示值為 10,第二個消息框會顯示值為 20, (因為 x 在 Macro_1b 中乘以 2),而第三個訊息框會顯示值為 0 (因為 Macro2 不會看到 x 的值,巨集 2 會使用未初始化的零值)。
將第一個模組中的宣告行從以下位置更改:
Dim x As Integer收件人:
Private x As Integer執行 Macro_1a 巨集。
使用私人陳述式範圍與使用 Dim 陳述式時所顯示的訊息框相同。 變數 x 具有相同的範圍,且對其宣告所在範圍的模組為私人。
注意: 如果您想要將變數的範圍限制在宣告該變數的模組,請使用 Privatestatement 而非 Dim 陳述式。 它們都會產生相同的效果,但如果您使用私人陳述式,當您讀取代碼時,範圍會更清楚。
變數的存留期
變數保留其值的時間稱為其存留期。 變數的值在其存留期間可能會變更,但會保留值。 此外,當變數遺失範圍時,它就不再具有值。
將變數值初始化
當您執行巨集時,所有變數都會初始化為值。 將數值變數初始化為零、將變數長度字串初始化為零長度字串 (“) ,而固定長度字串則填入 ASCII 程式代碼 0。 變體變數會初始化為空白。 空白變數是以數值內容中的零和字串內容中的零長度字串 (“) 表示。
程序-層級變數
如果您有使用 Dim 陳述式在巨集中宣告的變數,只要巨集在執行中,變數就會保留其值。 如果此巨集呼叫其他巨集,則變數的值會保留 (但無法供其他巨集使用),只要這些其他巨集也執行。
若要示範程序-層級變數的運作方式,請遵循下列步驟:
在專案中插入新模組。
請在此模組中輸入以下兩個巨集:
Sub Macro1()
「將 x 設為程序層級變數
Dim x 作為整數
MsgBox「x 的初始值是 」& x
x = 10
MsgBox 「x 是」& x
「下一行跑 Macro2
Macro2
MsgBox「x 仍然是」& x
End Sub
子巨集2 ()
MsgBox「x」,從 Macro2 中顯示為 “ & x
End Sub執行巨集 1。
您將收到以下訊息:
the initialized value of x is 0點擊 確定,你會看到訊息:
x is 10點擊 確定,你會收到以下訊息:
x, as seen by Macro2 is按一下 [確定]。
Macro2 不會顯示變數 x 的值,因為變數 x 是 Macro1 的局部值。 你會收到以下訊息:
x is still 10按一下 [確定]。
執行 Macro1。
您會收到步驟 3 到 6 所述的相同訊息,因為 Macro1 在步驟 6 中停止執行後,會遺失變數 x 的值。 因此,當您在步驟 7 中重新執行 Macro1 時,第一則訊息會將 x 的值顯示為零, (初始化值)。
靜態關鍵字
如果使用靜態關鍵字宣告程序層級變數,則變數會保留其值,直到重設項目為止。 因此,如果您有靜態變數,下次呼叫程序時,靜態變數會初始化為最後一個值。
若要查看靜態關鍵字的運作方式,請遵循下列步驟:
1.
Change the code in Macro1 to:
Sub Macro1()
'set x as a procedure level variable
Static x As Integer
MsgBox "the initialized value of x is " & x
x = x + 10
MsgBox "x is " & x
End Sub
執行巨集 1。
你會收到訊息:
the initialized value of x is 0點擊 確定,你會看到訊息:
x is 10按一下 [確定]。
執行 Macro1,你會看到以下訊息:
the initialized value of x is 10點擊 確定,你會收到以下訊息:
x is 20按一下 [確定]。
第二次出現在訊息中的值會不同,因為變數 x 會宣告為靜態變數,而變數會在您第一次執行 Macro1 後保留其值。
注意: 如果你有一個模組層級變數,它的壽命與靜態程序層級變數相同。
若要確認模組層級變數的存留期,請遵循下列步驟:
1.
Change the code in the module that contains Macro1 to the following:
Dim x As Integer 'create a module-level variable
Sub Macro1()
MsgBox "the initialized value of x is " & x
x = x + 10
MsgBox "x is " & x
End Sub
執行 Macro1,你會看到以下訊息:
the initialized value of x is 0點擊確定,您將收到以下訊息:
x is 10點擊確定,
執行 Macro1,你會看到這個訊息:
the initialized value of x is 10按一下 [確定]。
您將收到以下訊息:
x is 20按一下 [確定]。
第二次出現在訊息中的值會不同,因為變數 x 已宣告為靜態變數,且第一次執行 Macro1 後,會保留其值。
重設專案以重設變數
如果你想重設靜態變數或模組層級變數的值,請點擊
Standard工具列,或在執行選單中點擊重置。
如果您針對 Macro1 專案執行此動作,然後重新執行 Macro1,變數 x 的值會初始化回零,而您會收到第一則訊息:
the initialized value of x is 0