VB使用Option Explicit語句自動(dòng)提醒你正式地聲明你的變量,這個(gè)語句必須放在每個(gè)模塊的最上面。如果你試圖運(yùn)行一個(gè)含有未定義的變量的過程時(shí),Option Explicit語句會(huì)讓VB產(chǎn)生一個(gè)錯(cuò)誤信息。
1. 返回代碼窗口你輸入過程CalcCost的地方
2. 在模塊的最上面輸入Option Explicit并回車,Excel將該語句顯示為藍(lán)色
3. 運(yùn)行過程CalcCost,VB顯示錯(cuò)誤信息“編譯錯(cuò)誤:變量未定義”
4. 點(diǎn)擊確定關(guān)閉信息框。
VB加亮變量名稱slsPrice。現(xiàn)在你需要正式聲明這個(gè)變量。當(dāng)你聲明了變量slsPrice并再次運(yùn)行該過程時(shí),VB一旦遇到另外一個(gè)未聲明的變量時(shí),將再次產(chǎn)生同樣的錯(cuò)誤。
5. 在CalcCost過程的開始部分輸入下述聲明:
'declaration of variables (聲明變量)
Dim slsPrice as Currency
Dim slsTax as Single
Dim Cost as Currency
Dim strMsg as String
6. 按下F5來運(yùn)行該過程,修改后的程序顯示如下“
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語句強(qiáng)迫你聲明變量,因?yàn)槿绻阈枰暶髯兞康脑?,你必須每次在添加新模塊時(shí)輸入Option Explicit語句,所以你可以讓VB幫你輸入它。按照下述步驟來自動(dòng)在新模塊里添加Option Explicit語句:
1. 選擇“工具”-“選項(xiàng)”
2. 確保選項(xiàng)對(duì)話框(編輯器頁)上的“要求變量聲明”被勾選上了
3. 點(diǎn)擊確定關(guān)閉對(duì)話框
從現(xiàn)在開始,每個(gè)新模塊都會(huì)在第一行添加Option Explicit語句。如果你要在一起創(chuàng)建的模塊里
強(qiáng)制聲明變量的話,你必須手動(dòng)輸入Option Explicit。
技巧:Option Explicit更多信息
Option Explicit強(qiáng)迫正式(顯式)聲明模塊里的所有變量。使用它的一個(gè)重大優(yōu)點(diǎn)是,輸入錯(cuò)誤會(huì)在編譯時(shí)(VB試圖將源代碼翻譯為可執(zhí)行代碼)被檢測(cè)到。Option Explicit語句必須在模塊里的任何過程之前出現(xiàn)。
了解變量范圍
不同的變量在VBA過程里有不同的影響范圍。Scope(范圍)這個(gè)術(shù)語定義某個(gè)特定的變量在同一個(gè)過程,其它過程,或者其它VBA工程里的可用性。變量在VBA里可以是下面三種級(jí)別的范圍:
過程級(jí)別范圍
模塊級(jí)別范圍
工程級(jí)別范圍
過程級(jí)別(當(dāng)?shù)兀┳兞?/h2>
你已經(jīng)知道如何通過關(guān)鍵字Dim來聲明變量,在關(guān)鍵字Dim在模塊中的位置決定了該變量的范圍。在VBA過程中用Dim關(guān)鍵字聲明的變量擁有過程級(jí)別的范圍,過程級(jí)別的變量經(jīng)常被稱為當(dāng)?shù)刈兞?。?dāng)?shù)刈兞恐荒苁褂迷诼暶魉倪^程里面。未聲明的變量總是過程級(jí)別的變量。在它的范圍內(nèi),變量的名稱必須是唯一的,這意味著你不可以在同一個(gè)過程里使用同樣的名稱來聲明兩個(gè)變量。然而,你可以在不同的過程里面使用同樣的變量名稱。換句話說,過程CalcCost里可以有slsTax變量,同一個(gè)模塊里的過程ExpenseRep里頁可以有它自己的變量slsTax,兩個(gè)變量相互獨(dú)立。
模塊級(jí)別變量
當(dāng)?shù)刈兞坑兄诠?jié)省電腦內(nèi)存,一旦該過程結(jié)束,該變量便立即消失,并且電腦釋放該變量占用的內(nèi)存空間。然而,在編程中,你經(jīng)常需要變量在本過程結(jié)束后仍然在其它過程里可用,這種情形需要你改變變量的范圍。你可能就需要定義一個(gè)模塊級(jí)別的變量,而不是過程級(jí)別的了。要定義模塊級(jí)別的變量的話,你必須將關(guān)鍵字Dim放在模塊表里任何過程的上面(緊接著在關(guān)鍵字OptionExplicit的下面)。例如,將slsTax設(shè)置為任何Variables模塊里的過程都可以使用,按照下述方法聲明slsTax變量:
Option Explicit
Dim slsTax As Single
Sub CalcCost( )
<放置過程指令>
End Sub
在上面的例子里,關(guān)鍵字Dim在模塊的上面,緊挨著OptionExplicit語句。你需要另外一個(gè)過程來使用變量slsTax,這樣你才能查看這是如何工作的。
1.在代碼窗口里,將變量聲明行Dim slsTax As Single從Variables模塊的CalcCost過程里剪切,并且粘貼到該模塊的上面Option Explicit語句的下面。
2. 在CalcCost過程的同一個(gè)模塊里輸入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過程里聲明了兩個(gè)貨幣類型的變量:slsPrice和Cost。slsPrice變量隨后賦值55.99,slsPrice和CalcCost過程里聲明的變量slsPrice是獨(dú)立工作的。ExpenseRep過程計(jì)算采購的費(fèi)用,該費(fèi)用包括銷售稅,因?yàn)殇N售稅和CalcCost過程里使用的是一樣的,所以將slsTax變量聲明為模塊級(jí)別的變量。VB執(zhí)行CalcCost過程后,變量slsTax的內(nèi)容等于0.085。如果slsTax是當(dāng)?shù)刈兞康脑?,隨著CalcCost過程的終結(jié),變量slsTax的內(nèi)容將被清空。過程ExpenseRep結(jié)束時(shí)顯示兩個(gè)信息框來輸出變量slsTax和Cost的值。當(dāng)你運(yùn)行CalcCost后,VB清空除了slsTax之外的所有變量的內(nèi)容,因?yàn)閟lsTax以被定義為模塊級(jí)別的變量。一旦你試圖通過運(yùn)行ExpenseRep來計(jì)算價(jià)格,VB就會(huì)找到slsTax的值,并且將它用到計(jì)算中。
技巧:私有變量
當(dāng)你在模塊級(jí)別聲明變量時(shí),除了關(guān)鍵字Dim之外,你還可以使用關(guān)鍵字Private。例如:
Private slsTax As Single
私有變量?jī)H僅在聲明該變量的模塊里的過程中可用。私有變量總是在模塊的上面Option Explicit語句之后聲明。
技巧:保持工程級(jí)別的變量為私有
為了避免工程級(jí)別的變量?jī)?nèi)容被工程之外使用,你可以在Option Explicit語句下面,模塊的上面輸入Option Private Module,例如:
Option Explicit
Option Private Module
Public slsTax As Single
Sub CalcCost( )
<這里是過程代碼>
End Sub
工程級(jí)別變量
模塊級(jí)別的變量用關(guān)鍵字Public(而不是Dim)聲明時(shí),擁有工程級(jí)別范圍。這意味著它們可以在VBA任何模塊里使用。當(dāng)你想要在一個(gè)打開的VBA工程的所有過程里使用某個(gè)變量時(shí),必須用Public關(guān)鍵字來聲明它,例如:
Option Explicit
Public slsTax As Single
Sub CalcCost( )
<過程代碼>
End Sub
注意,變量slsTax在模塊上面以Public關(guān)鍵字聲明的,它將會(huì)在該VBA工程里的任何過程里都可用。
變量的存活期
除了范圍之外,變量還有存活期,變量的存活期決定了該變量能保存它的值有多久。一旦該工程打開,模塊級(jí)別和工程級(jí)別的變量就會(huì)保留它們的值。然而,如果程序的邏輯需要,VB能夠重新初始化這些變量。使用Dim語句聲明的當(dāng)?shù)刈兞慨?dāng)過程結(jié)束時(shí)就會(huì)丟失值,當(dāng)?shù)刈兞康拇婊钇谑请S著過程的運(yùn)行的,并且它們?cè)诔绦蛎看芜\(yùn)行的時(shí)候可以被重新初始化。VB允許你通過改變聲明方式延長(zhǎng)當(dāng)?shù)刈兞康拇婊钇凇?br>
了解和使用靜態(tài)變量
用Static關(guān)鍵字聲明的變量是特殊的當(dāng)?shù)刈兞?,靜態(tài)變量在過程級(jí)別聲明。和那些用關(guān)鍵字Dim聲明的當(dāng)?shù)刈兞肯喾?,靜態(tài)變量在程序已經(jīng)不在它們的過程里時(shí)仍然不會(huì)丟失它們的內(nèi)容。例如,當(dāng)一個(gè)帶有靜態(tài)變量的VBA過程調(diào)用另外一個(gè)過程時(shí),在VB執(zhí)行完被調(diào)用的過程語句后返回主調(diào)過程時(shí),靜態(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
上面的過程以一個(gè)名為allPurchase的靜態(tài)變量和兩個(gè)當(dāng)?shù)刈兞縩ewPurchase和purchCost的聲明開始。該過程中使用的InputBox函數(shù)顯示一個(gè)對(duì)話框并且等著用戶輸入數(shù)值,一旦用戶輸入數(shù)值并且點(diǎn)擊確定后,VB就會(huì)將該數(shù)值賦給變量newPurchase。在第四章中有InputBox函數(shù)的討論。因?yàn)镮nputBox函數(shù)的結(jié)果總是字符串,變量newOurchase被聲明為字符串?dāng)?shù)據(jù)類型了。然而,你不能在數(shù)學(xué)計(jì)算中使用字符串,這就是為什么需要在下一指令中使用一個(gè)類型轉(zhuǎn)換函數(shù)(CSng)來將字符串值轉(zhuǎn)換為單精度浮點(diǎn)類型的數(shù)字。函數(shù)CSng只需要一個(gè)自變量——你要轉(zhuǎn)換的數(shù)值。函數(shù)CSng轉(zhuǎn)換的數(shù)字結(jié)果保存在變量purchCost上。
技巧:類型轉(zhuǎn)換函數(shù)
在CSng上的任意地方按下F1,可以查看更多關(guān)于函數(shù)CSng的信息(也可以查看其它類型轉(zhuǎn)換函數(shù)信息)下一行指令:allPurchase = allPurchase + purchCost,將InputBox函數(shù)提供的新數(shù)值加和到目前的采購數(shù)值上。當(dāng)你第一次運(yùn)行這個(gè)過程的時(shí)候,變量allPurchase和變量purchCost的內(nèi)容是一樣的;當(dāng)你第二次運(yùn)行它的時(shí)候,這個(gè)靜態(tài)變量的值由對(duì)話框提供的值增加了。你可以隨意多次運(yùn)行過程CostOfPurchase,只要該工程是開著的,變量allPurchase就會(huì)不斷的變化。依照下述步驟來試驗(yàn)該過程:
1. 將光標(biāo)放在過程CostOfPurchase里的任意地方并且按下F5
2. 當(dāng)對(duì)話框出現(xiàn)時(shí),輸入一個(gè)數(shù)字,例如,輸入100然后回車。VB顯示信息““Thecostofanew
purchase is: 100.”
3.點(diǎn)擊確定,VB顯示第二個(gè)信息“The running cost is: 100.”
4.重新運(yùn)行該程序,當(dāng)對(duì)話框出現(xiàn)時(shí),輸入另外一個(gè)數(shù)字,例如輸入50再回車。VB顯示信息“The
cost of a new purchase is 50.”
5. 點(diǎn)擊確定,VB顯示第二個(gè)信息“The running cost is: 150.”
6. 多次運(yùn)行該程序,看看VB是如何追蹤運(yùn)行的總量的。
更多建議: