VBA強制聲明變量

2021-12-08 14:26 更新

VB使用Option Explicit語句自動提醒你正式地聲明你的變量,這個語句必須放在每個模塊的最上面。如果你試圖運行一個含有未定義的變量的過程時,Option Explicit語句會讓VB產生一個錯誤信息。


1.  返回代碼窗口你輸入過程CalcCost的地方

2.  在模塊的最上面輸入Option Explicit并回車,Excel將該語句顯示為藍色

3.  運行過程CalcCost,VB顯示錯誤信息“編譯錯誤:變量未定義”

4.  點擊確定關閉信息框。

VB加亮變量名稱slsPrice?,F在你需要正式聲明這個變量。當你聲明了變量slsPrice并再次運行該過程時,VB一旦遇到另外一個未聲明的變量時,將再次產生同樣的錯誤。


5.  在CalcCost過程的開始部分輸入下述聲明:

'declaration of variables (聲明變量)

Dim slsPrice as Currency

Dim slsTax as Single

Dim Cost as Currency

Dim strMsg as String


6.  按下F5來運行該過程,修改后的程序顯示如下“
Option Explicit
Sub CalcCost()
'declaration of variables
             Dim slsPrice As Currency
             Dim slsTax As Single
             Dim Cost As Currency
             Dim strMsg As String
             slsPrice = 35
             slsTax = 0.085
             Range("A1").Formula = "The cost of calculator"
             Range("A4").Formula = "Price"
             Range("B4").Formula = slsPrice
             Range("A5").Formula = "Sales Tax"
             Range("A6").Formula = "Cost"
             Range("B5").Formula = Format((slsPrice * slsTax), "0.00")
             Cost = Format(slsPrice + (slsPrice * slsTax), "0.00")
             With Range("B6").Formula = Cost
             strMsg = "The calculator total is " & "$" & Cost & "."
             Range("A8").Formula = strMsg
End Sub



在模塊上面輸入的Option Explicit語句強迫你聲明變量,因為如果你需要聲明變量的話,你必須每次在添加新模塊時輸入Option Explicit語句,所以你可以讓VB幫你輸入它。按照下述步驟來自動在新模塊里添加Option Explicit語句:


1.  選擇“工具”-“選項”


2.  確保選項對話框(編輯器頁)上的“要求變量聲明”被勾選上了


3.  點擊確定關閉對話框


從現在開始,每個新模塊都會在第一行添加Option Explicit語句。如果你要在一起創(chuàng)建的模塊里
強制聲明變量的話,你必須手動輸入Option Explicit。


技巧:Option Explicit更多信息
Option Explicit強迫正式(顯式)聲明模塊里的所有變量。使用它的一個重大優(yōu)點是,輸入錯誤會在編譯時(VB試圖將源代碼翻譯為可執(zhí)行代碼)被檢測到。Option Explicit語句必須在模塊里的任何過程之前出現。


了解變量范圍

不同的變量在VBA過程里有不同的影響范圍。Scope(范圍)這個術語定義某個特定的變量在同一個過程,其它過程,或者其它VBA工程里的可用性。變量在VBA里可以是下面三種級別的范圍:

過程級別范圍
模塊級別范圍
工程級別范圍

過程級別(當地)變量

你已經知道如何通過關鍵字Dim來聲明變量,在關鍵字Dim在模塊中的位置決定了該變量的范圍。在VBA過程中用Dim關鍵字聲明的變量擁有過程級別的范圍,過程級別的變量經常被稱為當地變量。當地變量只能使用在聲明它的過程里面。未聲明的變量總是過程級別的變量。在它的范圍內,變量的名稱必須是唯一的,這意味著你不可以在同一個過程里使用同樣的名稱來聲明兩個變量。然而,你可以在不同的過程里面使用同樣的變量名稱。換句話說,過程CalcCost里可以有slsTax變量,同一個模塊里的過程ExpenseRep里頁可以有它自己的變量slsTax,兩個變量相互獨立。

模塊級別變量

當地變量有助于節(jié)省電腦內存,一旦該過程結束,該變量便立即消失,并且電腦釋放該變量占用的內存空間。然而,在編程中,你經常需要變量在本過程結束后仍然在其它過程里可用,這種情形需要你改變變量的范圍。你可能就需要定義一個模塊級別的變量,而不是過程級別的了。要定義模塊級別的變量的話,你必須將關鍵字Dim放在模塊表里任何過程的上面(緊接著在關鍵字OptionExplicit的下面)。例如,將slsTax設置為任何Variables模塊里的過程都可以使用,按照下述方法聲明slsTax變量:

Option Explicit
Dim slsTax As Single
Sub CalcCost( )
            <放置過程指令>
End Sub

在上面的例子里,關鍵字Dim在模塊的上面,緊挨著OptionExplicit語句。你需要另外一個過程來使用變量slsTax,這樣你才能查看這是如何工作的。

1.在代碼窗口里,將變量聲明行Dim slsTax As Single從Variables模塊的CalcCost過程里剪切,并且粘貼到該模塊的上面Option Explicit語句的下面。

2.  在CalcCost過程的同一個模塊里輸入ExpenseRep過程代碼:

Sub ExpenseRep()
         Dim slsPrice As Currency
         Dim Cost As Currency
         slsPrice = 55.99
         Cost = slsPrice + (slsPrice * slsTax)
         MsgBox slsTax
         MsgBox Cost
End Sub

ExpenseRep過程里聲明了兩個貨幣類型的變量:slsPrice和Cost。slsPrice變量隨后賦值55.99,slsPrice和CalcCost過程里聲明的變量slsPrice是獨立工作的。ExpenseRep過程計算采購的費用,該費用包括銷售稅,因為銷售稅和CalcCost過程里使用的是一樣的,所以將slsTax變量聲明為模塊級別的變量。VB執(zhí)行CalcCost過程后,變量slsTax的內容等于0.085。如果slsTax是當地變量的話,隨著CalcCost過程的終結,變量slsTax的內容將被清空。過程ExpenseRep結束時顯示兩個信息框來輸出變量slsTax和Cost的值。當你運行CalcCost后,VB清空除了slsTax之外的所有變量的內容,因為slsTax以被定義為模塊級別的變量。一旦你試圖通過運行ExpenseRep來計算價格,VB就會找到slsTax的值,并且將它用到計算中。

技巧:私有變量
當你在模塊級別聲明變量時,除了關鍵字Dim之外,你還可以使用關鍵字Private。例如:

Private slsTax As Single

私有變量僅僅在聲明該變量的模塊里的過程中可用。私有變量總是在模塊的上面Option Explicit語句之后聲明。

技巧:保持工程級別的變量為私有
為了避免工程級別的變量內容被工程之外使用,你可以在Option Explicit語句下面,模塊的上面輸入Option Private Module,例如:

Option Explicit
Option Private Module
Public slsTax As Single
Sub CalcCost( )
            <這里是過程代碼>
End Sub


工程級別變量

模塊級別的變量用關鍵字Public(而不是Dim)聲明時,擁有工程級別范圍。這意味著它們可以在VBA任何模塊里使用。當你想要在一個打開的VBA工程的所有過程里使用某個變量時,必須用Public關鍵字來聲明它,例如:

Option Explicit
Public slsTax As Single
Sub CalcCost( )
            <過程代碼>
End Sub

注意,變量slsTax在模塊上面以Public關鍵字聲明的,它將會在該VBA工程里的任何過程里都可用。

變量的存活期

除了范圍之外,變量還有存活期,變量的存活期決定了該變量能保存它的值有多久。一旦該工程打開,模塊級別和工程級別的變量就會保留它們的值。然而,如果程序的邏輯需要,VB能夠重新初始化這些變量。使用Dim語句聲明的當地變量當過程結束時就會丟失值,當地變量的存活期是隨著過程的運行的,并且它們在程序每次運行的時候可以被重新初始化。VB允許你通過改變聲明方式延長當地變量的存活期。

了解和使用靜態(tài)變量

用Static關鍵字聲明的變量是特殊的當地變量,靜態(tài)變量在過程級別聲明。和那些用關鍵字Dim聲明的當地變量相反,靜態(tài)變量在程序已經不在它們的過程里時仍然不會丟失它們的內容。例如,當一個帶有靜態(tài)變量的VBA過程調用另外一個過程時,在VB執(zhí)行完被調用的過程語句后返回主調過程時,靜態(tài)變量仍然保留它原來的值。過程CostOfPurchase示范靜態(tài)變量allPurchase的使用:

Sub CostOfPurchase()
         'declare variables
          Static allPurchase
          Dim newPurchase As String
          Dim purchCost As Single
          newPurchase = InputBox("Enter the cost of a purchase:")
          purchCost = CSng(newPurchase)
          allPurchase = allPurchase + purchCost
          'display results
          MsgBox "The cost of a new purchase is: " & newPurchase
          MsgBox "The running cost is: " & allPurchase
End Sub

上面的過程以一個名為allPurchase的靜態(tài)變量和兩個當地變量newPurchase和purchCost的聲明開始。該過程中使用的InputBox函數顯示一個對話框并且等著用戶輸入數值,一旦用戶輸入數值并且點擊確定后,VB就會將該數值賦給變量newPurchase。在第四章中有InputBox函數的討論。因為InputBox函數的結果總是字符串,變量newOurchase被聲明為字符串數據類型了。然而,你不能在數學計算中使用字符串,這就是為什么需要在下一指令中使用一個類型轉換函數(CSng)來將字符串值轉換為單精度浮點類型的數字。函數CSng只需要一個自變量——你要轉換的數值。函數CSng轉換的數字結果保存在變量purchCost上。

技巧:類型轉換函數
在CSng上的任意地方按下F1,可以查看更多關于函數CSng的信息(也可以查看其它類型轉換函數信息)下一行指令:allPurchase = allPurchase + purchCost,將InputBox函數提供的新數值加和到目前的采購數值上。當你第一次運行這個過程的時候,變量allPurchase和變量purchCost的內容是一樣的;當你第二次運行它的時候,這個靜態(tài)變量的值由對話框提供的值增加了。你可以隨意多次運行過程CostOfPurchase,只要該工程是開著的,變量allPurchase就會不斷的變化。依照下述步驟來試驗該過程:

1.  將光標放在過程CostOfPurchase里的任意地方并且按下F5
2.  當對話框出現時,輸入一個數字,例如,輸入100然后回車。VB顯示信息““Thecostofanew
purchase is: 100.”
3.點擊確定,VB顯示第二個信息“The running cost is: 100.”
4.重新運行該程序,當對話框出現時,輸入另外一個數字,例如輸入50再回車。VB顯示信息“The
cost of a new purchase is 50.”
5.  點擊確定,VB顯示第二個信息“The running cost is: 150.”
6.  多次運行該程序,看看VB是如何追蹤運行的總量的。




以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號