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

文章翻譯 文章翻譯
文章編號: 843144 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

簡介

本文說明如何在 Microsoft Visual Basic for Applications 的 Microsoft Excel 子程序中使用變數。

其他相關資訊

子程序中的變數

程式語言有一項強大的功能,就是能夠將某些內容存入變數中,並且稍後可於程序中使用或變更該變數的內容。本文討論 Visual Basic 中的下列變數使用方式:
  • 如何宣告變數。
  • 可使用變數的程序與專案。
  • 變數的存留時間。

在巨集中宣告變數

要在巨集中宣告變數,最簡單的方法就是使用 Dim 陳述式。下列程式碼會將 x 和 y 兩個變數宣告為整數:
Dim x As Integer, y As Integer
x 和 y 指定為整數,就等於告知 Visual Basic 要撥出足夠的記憶體空間給整數變數 (x 和 y 分別有 2 個位元組),而 x 或 y 所儲存的資訊,則是介於 -32768 到 32767 之間的整數。

請注意 如果您使用單一 Dim 陳述式來宣告多個變數,則必須為每個變數指定資料類型。

如果您和下列的 Visual Basic 程式碼一樣,並未指定每個變數的資料類型,則只有變數 y 會設定為整數變數。變數 x 則為 Variant 類型:
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 "the value of x is " & x & _
    Chr(13) & "the value of y is " & y
    End Sub
  5. 執行 Variable_Test 巨集。您會收到下列訊息:
    the value of x is 10 (x 的值為 10)
    the value of y is 100 (y 的值為 100)
  6. 按一下 [確定]
  7. Variable_Test 巨集中,找到下列這行:
    x = 10
    

    並變更成:
    x = "error"
    
  8. 執行 Variable_Test 巨集。
您會收到執行階段錯誤,因為 "error" 並非整數,但您卻嘗試將此字串值指派給整數變數 x。

資料類型摘要

下面的表格列出常見的變數資料類型:

摺疊此表格展開此表格
資料類型儲存大小允許範圍
Boolean2 個位元組True 或 False
Integer2 個位元組-32,768 到 32,767
Long4 個位元組-2,147,483,648 到 2,147,483,647
Double8 個位元組負值為 -1.79769313486232E308 到 -4.94065645841247E-324;正值為 4.94065645841247E-324 到 1.79769313486232E308
Currency8 個位元組-922,337,203,685,477.5808 到 922,337,203,685,477.5807
Date8 個位元組100 年 1 月 1 日到 9999 年 12 月 31 日
String10 個位元組 + 字串長度

Variant 資料類型

如果您在宣告變數時未指定資料類型,或者完全不宣告任何變數,Visual Basic 就會自動為此變數指定 Variant 資料類型。下列是變數宣告為此資料類型的優點:
  • 變數可以包含字串、時間、布林值或數值。
  • 變數可以自動轉換其中包含的值。
缺點是 Variant 變數至少需要 16 個位元組的記憶體。16 個位元組記憶體在大型程序或複雜的模組中,可能會有重大的影響。

若要了解這項作業在 Variable_Test 巨集中如何運作,請依照下列步驟執行:
  1. 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
    
  2. 執行 Variable_Test 巨集。
您不會收到錯誤訊息,因為可以指派任何內容給 Variant 變數 x 和 y。

請注意 您也可以省略下列程式碼,巨集仍可將變數 x 和 y 視為 Variant 資料類型來繼續運作:
Dim x, y

變數的範圍

當您宣告變數時,在相同模組、其他模組或其他專案中的其他巨集不一定看得到該變數。此模組中變數的可用性就是所謂的範圍。範圍的三種類型分別為程序層級、私人模組層級,和公用模組層級。範圍會依您宣告變數的方式及位置而定。

程序層級範圍

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

若要確認屬於程序層級範圍的變數不會出現在其宣告的程序外部,請依照下列步驟執行:
  1. 將新模組插入專案中。
  2. 將下列兩個巨集輸入此模組:
    Sub Macro1()
    Dim x As Integer
    x = 10
    MsgBox "x, as seen by Macro1 is " & x
    'the next line runs Macro2
    Macro2
    End Sub
    Sub Macro2()
    MsgBox "x, as seen by Macro2 is " & x
    End Sub
    
  3. 執行 Macro1

    您會收到下列訊息:
    x, as seen by Macro1 is 10 (Macro1 所看到的 x 為 10)
  4. 按一下 [確定]

    您會收到下列訊息:
    x, as seen by Macro2 is (Macro2 所看到的 x 為)
  5. 按一下 [確定]
Macro2 不會顯示變數 x 的值,因為變數 x 屬於 Macro1

私人與公用模組層級範圍

您可以在模組的宣告區段中定義變數 (位於模組上方,所有子程序之上),並使用 Public 陳述式、Dim 陳述式,或 Private 陳述式來設定變數的範圍。如果您將 Public 陳述式置於您的變數前方,則專案中所有模組的所有巨集都可以使用該變數。如果您將 Dim 陳述式或 Private 陳述式置於您的變數前方,則唯有在其宣告所在之模組中的巨集才可以使用該變數。

若要了解 Public 陳述式和 Dim 陳述式之間的差異,請依照下列步驟執行:
  1. 儲存並關閉所有開啟的活頁簿,然後開啟新的活頁簿。
  2. 啟動 Visual Basic 編輯器。
  3. 將模組插入專案中。
  4. 將下列程式碼輸入此模組:
    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 巨集。

    變數 x 宣告為 "Public x As Integer" 之後,專案中所有三個巨集都可以存取 x 的值。第一個訊息方塊會顯示值為 10。第二個訊息方塊會顯示值為 20 (因為 x 在 Macro_1b 中乘以 2)。第三個訊息方塊會顯示值為 60 (因為 x 的值在 Macro_1b 中變更為 20,然後又在 Macro2 中乘以 3)。
  8. 請將第一個模組中的宣告行從:
    Public x As Integer

    變更成:
    Dim x As Integer
  9. 執行 Macro_1a 巨集。

    變數 x 宣告為 "Dim x As Integer" 之後,只有第一個模組中的巨集可以存取 x 的值。因此第一個訊息方塊會顯示值為 10,第二個訊息方塊會顯示值為 20 (因為 x 在 Macro_1b 中乘以 2),而第三個訊息方塊會顯示值為 0 (因為 Macro2 看不到 x 的值,而未初始化的零值是由 Macro 2 使用)。
  10. 請將第一個模組中的宣告行從:
    Dim x As Integer

    變更成:
    Private x As Integer
  11. 執行 Macro_1a 巨集。
相同的訊息方塊會使用 Private 陳述式範圍來顯示,如同使用 Dim 陳述式。變數 x 有相同的範圍,是其宣告所在模組的私人範圍。

請注意 如果您希望變數的範圍可以限制在其宣告的模組中,請使用 Private 陳述式,而非 Dim 陳述式。這兩種都能達到相同的效果,但如果您使用 Private 陳述式,閱讀程式碼時範圍會比較清楚。

變數的存留時間

變數保留其值的期間,就稱為存留時間。變數的值可能在存留時間內變更,但仍會保留一個值。另外,變數若遺失範圍,其值也不會存在。

初始化變數的值

執行巨集時,所有變數都初始化為值。數值變數初始化為零,變數長度字串則初始化為長度為零的字串 (""),而固定長度字串則會以 ASCII 碼 0 填滿。Variant 變數初始化為空白。空白變數是以數字內容中的零,以及字串內容中長度為零的字串 ("") 表示。

程序層級變數

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

若要示範程序層級變數如何運作,請依照下列步驟執行:
  1. 將新模組插入專案中。
  2. 將下列兩個巨集輸入此模組:
    Sub Macro1()
    'set x as a procedure level variable
    Dim x As Integer
       MsgBox "the initialized value of x is " & x
    x = 10
    MsgBox "x is " & x
    'the next line runs Macro2
    Macro2
    MsgBox "x is still " & x
    End Sub
    Sub Macro2()
    MsgBox "x, as seen by Macro2 is " & x
    End Sub
    
  3. 執行 Macro1

    您會收到下列訊息:
    the initialized value of x is 0 (x 的初始化值為 0)
  4. 按一下 [確定]

    您會收到下列訊息:
    x is 10 (x 為 10)
  5. 按一下 [確定]

    您會收到下列訊息:
    x, as seen by Macro2 is (Macro2 所看到的 x 為)
  6. 按一下 [確定]

    Macro2 不會顯示變數 x 的值,因為變數 x 屬於 Macro1。您會收到下列訊息:
    x is still 10 (x 仍為 10)
  7. 按一下 [確定]
  8. 執行 Macro1
您收到的訊息會與步驟 3 到 6 所描述的相同,因為只要 Macro1 在步驟 6 停止執行,變數 x 的值就會遺失。因此,當您重新執行步驟 7 的 Macro1 時,第一個訊息會顯示 x 的值為零 (初始化值)。

靜態關鍵字

如果程序層級變數要使用靜態關鍵字宣告,那麼在您的專案重設之前,變數都會保留其值。因此如果您有靜態變數,下次呼叫程序時,靜態變數就會初始化為上次的值。

若要了解靜態關鍵字如何運作,請依照下列步驟執行:
  1. Macro1 中的程式碼變更為:
    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. 執行 Macro1

    您會收到下列訊息:
    the initialized value of x is 0 (x 的初始化值為 0)
  3. 按一下 [確定]

    您會收到下列訊息:
    x is 10 (x 為 10)
  4. 按一下 [確定]
  5. 執行 Macro1

    您會收到下列訊息:
    the initialized value of x is 10 (x 的初始化值為 10)
  6. 按一下 [確定]

    您會收到下列訊息:
    x is 20 (x 為 20)
  7. 按一下 [確定]
第二次顯示在訊息中的值並不相同,因為變數 x 宣告為靜態變數,而變數在第一次執行 Macro1 後仍會保留其值。

請注意 如果您有模組層級變數,其存留時間就會與靜態程序層級變數相同。

若要確認模組層級變數的存留時間,請依照下列步驟執行:
  1. 將包含 Macro1 之模組中的程式碼變更為:
    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. 執行 Macro1

    您會收到下列訊息:
    the initialized value of x is 0 (x 的初始化值為 0)
  3. 按一下 [確定]

    您會收到下列訊息:
    x is 10 (x 為 10)
  4. 按一下 [確定]
  5. 執行 Macro1

    您會收到下列訊息:
    the initialized value of x is 10 (x 的初始化值為 10)
  6. 按一下 [確定]

    您會收到下列訊息:
    x is 20 (x 為 20)
  7. 按一下 [確定]
第二次顯示在訊息中的值並不相同,因為變數 x 宣告為靜態變數,而變數在第一次執行 Macro1 後仍會保留其值。

重設專案以重設變數

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

如果您在 Macro1 專案中執行這個動作,然後重新執行 Macro1,則變數 x 的值就會初始化為零,並且您會收到第一個訊息:
the initialized value of x is 0 (x 的初始化值為 0)
如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
843145 Description of Excel sub-procedures in Visual Basic for Applications (Arrays)
回到頁首

屬性

文章編號: 843144 - 上次校閱: 2007年3月19日 - 版次: 3.0
這篇文章中的資訊適用於:
  • Microsoft Office Excel 2007
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
關鍵字:?
kbvba kbprogramming kbinfo KB843144
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com