如何在 Visual Basic for Applications 中使用 Excel 子程序中的變數

簡介

本文說明如何在 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 資料型別
 

若要執行變數測試,請遵循下列步驟:

  1. 儲存並關閉任何開啟的活頁簿,然後開啟新的活頁簿。

  2. 啟動 Visual Basic 編輯器 (按 ALT+F11)。

  3. 在 [插入] 功能表上,按一下 [模組]

  4. 輸入以下代碼:

    Sub Variable_Test()
        Dim x 作為整數,y 作為整數
        x = 10
        y = 100
        MsgBox「x 的值是 」& x & _
        Chr (13) &「y 的價值是」& y
    End Sub

  5. 執行 Variable_Test 巨集。 您將收到以下訊息:

    the value of x is 10
    the value of y is 100

  6. 按一下 [確定]

  7. Variable_Test 中巨集更改以下行:

    x = 10

  8. 收件人:

    x = "error"

  9. 執行 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

變數的範圍

當您宣告變數時,同一模組中的其他巨集、在其他模組或專案中可能無法看見該變數。 模組中變數的可用性稱為範圍。 這三種範圍類型為程序-層級、私人模組-層級和公用模組-層級。 範圍取決於您宣告變數的方式和位置或變數。

程序-層級範圍

具有程序層級範圍的變數不會出現在宣告程序的範圍之外。 如果您設定具有程序-層級範圍的變數值,其他巨集將不會看到該變數的內容。

若要確認具有程序-層級範圍的變數未出現在宣告的程序之外,請遵循下列步驟:

  1. 在專案中插入新模組。

  2. 請在此模組中輸入以下兩個巨集:
      Sub Macro1 () Dim x 作為整數 x = 10 MsgBox 「x,Macro1 所見為 “ & x '下一行執行 Macro2 Macro2 結束子 Sub Macro2 () MsgBox 「x,Macro2 所見 是 ” & x 結束 Sub

  3. 執行 Macro1,你會看到以下訊息:

    x, as seen by Macro1 is 10

  4. 點擊 確定,你會收到以下訊息:

    x, as seen by Macro2 is

  5. 按一下 [確定]

Macro2 不會顯示變數 x 的值,因為變數 x 是 Macro1 的局部值。

私人和公用模組-層級範圍

您可以在模組的宣告區段中定義變數 (模組頂端、在所有子程序之上),並使用公開陳述式、Dim 陳述式或私人陳述式來設定變數的範圍。 如果您將公用陳述式放在變數前面,則變數將可供專案中所有模組中的所有巨集使用。 如果您將 Dim 陳述式或私人陳述式放在變數前面,則變數只能給在宣告它的模組中的巨集使用。

若要查看公開陳述式與 Dim 陳述式之間的差異,請遵循下列步驟:

  1. 儲存並關閉任何開啟的活頁簿,然後開啟新的活頁簿。

  2. 啟動 [Visual Basic 編輯器]。

  3. 在專案中插入模組。

  4. 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
    
  5. 在專案中插入另一個模組。

  6. 在新模組中輸入下列程式碼:
    Sub Macro2()
        x = x * 3
        訊息盒 x
    End Sub

  7. 在第一個模組中執行 Macro_1a 巨集。

  8. 當變數 x 宣告為「Public x As Integer」時,專案中的所有三個巨集都可存取 x 的值。 第一個訊息框會顯示值為 10。 第二個消息框會顯示值為 20 (因為 x 在 Macro_1b 中乘以 2)。 第三個訊息框會顯示值為 60 (因為 x 的值在 Macro_1b 中已變更為 20,然後在 Macro2 中乘以 3)。

  9. 將第一個模組中的宣告行從以下位置更改:

       Public x As Integer

    收件人:

       Dim x As Integer

  10. 執行 Macro_1a 巨集。

  11. 當變數 x 宣告為「Dim x As Integer」時,只有第一個模組中的巨集可以使用 x 的值。 因此,第一個訊息框會顯示值為 10,第二個消息框會顯示值為 20, (因為 x 在 Macro_1b 中乘以 2),而第三個訊息框會顯示值為 0 (因為 Macro2 不會看到 x 的值,巨集 2 會使用未初始化的零值)。

  12. 將第一個模組中的宣告行從以下位置更改:

      Dim x As Integer

    收件人:

        Private x As Integer

  13. 執行 Macro_1a 巨集。

  14. 使用私人陳述式範圍與使用 Dim 陳述式時所顯示的訊息框相同。 變數 x 具有相同的範圍,且對其宣告所在範圍的模組為私人。

注意: 如果您想要將變數的範圍限制在宣告該變數的模組,請使用 Privatestatement 而非 Dim 陳述式。 它們都會產生相同的效果,但如果您使用私人陳述式,當您讀取代碼時,範圍會更清楚。
 

變數的存留期

變數保留其值的時間稱為其存留期。 變數的值在其存留期間可能會變更,但會保留值。 此外,當變數遺失範圍時,它就不再具有值。
 

將變數值初始化

當您執行巨集時,所有變數都會初始化為值。 將數值變數初始化為零、將變數長度字串初始化為零長度字串 (“) ,而固定長度字串則填入 ASCII 程式代碼 0。 變體變數會初始化為空白。 空白變數是以數值內容中的零和字串內容中的零長度字串 (“) 表示。

程序-層級變數

如果您有使用 Dim 陳述式在巨集中宣告的變數,只要巨集在執行中,變數就會保留其值。 如果此巨集呼叫其他巨集,則變數的值會保留 (但無法供其他巨集使用),只要這些其他巨集也執行。

若要示範程序-層級變數的運作方式,請遵循下列步驟:

  1. 在專案中插入新模組。

  2. 請在此模組中輸入以下兩個巨集:

    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

  3. 執行巨集 1。

  4. 您將收到以下訊息:

        the initialized value of x is 0

  5. 點擊 確定,你會看到訊息:

     x is 10

  6. 點擊 確定,你會收到以下訊息:

    x, as seen by Macro2 is

  7. 按一下 [確定]

  8. Macro2 不會顯示變數 x 的值,因為變數 x 是 Macro1 的局部值。 你會收到以下訊息:

    x is still 10

  9. 按一下 [確定]

  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. 執行巨集 1。

  2. 你會收到訊息:

    the initialized value of x is 0

  3. 點擊 確定,你會看到訊息:

    x is 10

  4. 按一下 [確定]

  5. 執行 Macro1,你會看到以下訊息:

    the initialized value of x is 10

  6. 點擊 確定,你會收到以下訊息:

    x is 20

  7. 按一下 [確定]

第二次出現在訊息中的值會不同,因為變數 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
  1. 執行 Macro1,你會看到以下訊息:

    the initialized value of x is 0

  2. 點擊確定,您將收到以下訊息:

    x is 10

  3. 點擊確定,

  4. 執行 Macro1,你會看到這個訊息:

    the initialized value of x is 10

  5. 按一下 [確定]

  6. 您將收到以下訊息:

    x is 20

  7. 按一下 [確定]

第二次出現在訊息中的值會不同,因為變數 x 已宣告為靜態變數,且第一次執行 Macro1 後,會保留其值。
 

重設專案以重設變數

如果你想重設靜態變數或模組層級變數的值,請點擊
Standard工具列,或在執行選單中點擊重置。

如果您針對 Macro1 專案執行此動作,然後重新執行 Macro1,變數 x 的值會初始化回零,而您會收到第一則訊息:

    the initialized value of x is 0