簡介

本文將說明如何在 Microsoft Microsoft Excel副程式使用Visual Basic for Applications。

更多資訊

副程式中的變數

程式設計語言的一項強大功能是能夠將內容儲存在變數中,以便日後在程式中使用或變更變數的內容。 本檔討論下列變數在 Visual Basic:

  • 如何宣告變數。

  • 可以使用變數的程式和專案。

  • 變數的生命週期。

在宏中宣告變數

在宏中宣告變數最簡單的方法就是使用 Dim 語句。 下一行將兩個變數宣告為整數:

    Dim x As Integer, y As Integer

將 x 和 y 指定為整數時,您要求 Visual Basic 為整數變數保留足夠的記憶體 (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 As Integer, y As Integer
        x = 10
        y = 100
        MsgBox "x 的值是 " & x & _
        Chr (13) & "y 的值是" & y
    End Sub

  5. 執行Variable_Test。 您會收到下列訊息


    the value of x is 10the 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 As Integer x = 10 MsgBox "x,如宏1 所看見的是" & x '下一行會執行 Macro2 Macro2 End Sub Macro2 () MsgBox "x,如 Macro2 所看到的是" & x End Sub

  3. 執行宏1,您就會收到下列
    訊息:x, as seen by Macro1 is 10

  4. 按一下[確定,然後您收到下列訊息:x, as seen by Macro2 is

  5. 按一下 [確定]。

宏2 不會顯示變數 x 的值,因為變數 x 是 Macro1 的區域變數。

私人和公用模組層級範圍

您可以在模組頂端的模組 (宣告區段定義變數,高於所有副程式) ,然後使用公用語句、Dim 語句或 Private 語句來設定變數的範圍。 如果您將公用語句放在變數的前面,您的變數將可供專案內所有模組的所有宏使用。 如果您將 Dim 語句或 Private 語句放在變數的前面,則變數僅適用于宣告變數的模組中的宏。

若要查看公用語句與 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
        MsgBox x
    End Sub

  7. 執行 Macro_1a模組中的宏。

  8. 當變數 x 宣告為「公用 x 為整數」時,專案中的所有三個宏都能夠存取 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 語句。 這兩者的效果相同,但如果您使用 Private 語句閱讀程式碼時,範圍會更清楚。
 

變數的生命週期

變數保留其值的時間稱為其生命週期。 變數的值可能會在其生命週期內變更,但會保留值。 此外,當變數失去範圍時,它不再具有值。
 

初始化變數的值

當您執行宏時,所有變數會初始化為值。 數值變數初始化為零,可變長度字串初始化為零長度字串 ("") ,而固定長度字串會填入 ASCII 程式碼 0。 Variant 變數會初始化為 Empty。 空白變數在數值上下文中以零表示,而零長度字串 ("") 字串上下文。

程式層級變數

如果您有使用 Dim 語句在宏中宣告的變數,只要宏執行,變數即會保留其值。 如果此宏會呼叫其他宏,則變數的值會保留 (不會供其他宏使用) 只要這些其他宏也同時進行。

若要示範程式層級變數如何工作,請遵循下列步驟:

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

  2. 在此模組中輸入下列兩個
    宏:Sub Macro1()

        'set x 做為程式層級變數
       將 x 變暗為整數
       MsgBox"x 的初始化值為 " & x
       x = 10
        MsgBox "x is" & x
        '下一行會執行宏2
        宏2
        MsgBox "x 仍然是" & x
    End Sub
    Sub Macro2 ()
        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. 宏2 不會顯示變數 x 的值,因為變數 x 是 Macro1 的區域變數。 您收到下列訊息:x is still 10

  9. 按一下 [確定]。

  10. 執行宏1

您會收到步驟 3 到步驟 6 中所述的相同訊息,因為當宏1 在步驟 6 中停止執行時,x 變數的值就會遺失。 因此,當您在步驟 7 中重新執行 Macro1 時,第一封郵件會顯示 x 的值為零 (初始化的值) 。

靜態關鍵字

如果使用 Static 關鍵字宣告程式層級變數,變數會保留其值,直到專案重設。 因此,如果您有靜態變數,下次您稱為程式時,靜態變數會初始化為其最後一個值。

若要瞭解 Static 關鍵字如何運作,請遵循下列步驟:

  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
  2. 執行宏1。

  3. 您就會收到
    訊息:the initialized value of x is 0

  4. 按一下[確定,然後您就會收到訊息

    x is 10

  5. 按一下 [確定]。

  6. 執行宏1,您收到下列
    訊息:the initialized value of x is 10

  7. 按一下[確定,然後您收到下列訊息:x is 20

  8. 按一下 [確定]。

第二次出現在郵件中的值會有所不同,因為變數 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
  2. 執行宏1,您就會收到下列
    訊息:the initialized value of x is 0

  3. 按一下 [確定,然後您收到下列訊息

    x is 10

  4. 按一下 [確定,

  5. 執行宏1,您就會收到這則訊息:the initialized value of x is 10

  6. 按一下 [確定]。

  7. 您會收到下列訊息

    x is 20

  8. 按一下 [確定]。

第二次出現于郵件中的值會有所不同,因為變數 x 會宣告為靜態變數,且在您第一次執行Macro1後會保留其值。
 

重設專案以重設變數

如果您想要重設靜態
變數或模組層級變數的值,請按一下 標準工具列,或按一下 [執行功能表上的重設

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

    the initialized value of x is 0

Need more help?

Expand your skills
Explore Training
Get new features first
Join Microsoft Office Insiders

Was this information helpful?

How satisfied are you with the translation quality?
What affected your experience?

Thank you for your feedback!

×