為了避免難以弄清的復(fù)雜的嵌套的If語句,你可以使用Select Case語句代替。它的語法為:
Select Case 測試表達式
Case 表達式1
如果表達式1匹配測試表達式的語句
Case 表達式2
如果表達式2匹配測試表達式的語句
Case 表達式N
如果表達式N匹配測試表達式的語句
Case Else
如果沒有表達式匹配測試表達式要執(zhí)行的語句
End Select
你在關(guān)鍵字Select Case和End Select之間放置任意多個條件以測試。子句Case Else是可選的,當(dāng)你希望可能有條件表達式返回假時使用它。在Select Case語句里,VB將每個表達式和測試表達式相比較。
這里是Select Case語句背后的邏輯。當(dāng)VB遇到Select Case子句,它記下測試表達式的值。然后它前進到下面的第一個Case子句,如果這個表達式的值和測試表達式的值匹配的話,VB就會執(zhí)行語句直到遇到另外一個Case子句并且跳到End Select語句。然而,如果第一個Case子句后面的表達式測試結(jié)果和測試表達式不匹配時,VB就會檢查每一個Case子句,直到它找到一個匹配的為止。如果沒有一個Case子句后面的表達式匹配測試表達式的值的話,VB就會跳到Case Else子句并執(zhí)行該語句直到遇到關(guān)鍵字End Select。注意,Case Else子句是可選的,如果你的程序里面沒有使用Case Else并且沒有一個Case子句的表達式和測試表達式相匹配,VB就會跳到End Select后面的語句,并且繼續(xù)執(zhí)行你的程序。
我們來一個使用Select Case語句的程序例子。在第四章里,你學(xué)習(xí)了MsgBox函數(shù)允許你顯示帶有一個或多個按鈕的信息,你也學(xué)習(xí)了MsgBox函數(shù)的結(jié)果可以賦予一個變量。使用Select Case語句,你現(xiàn)在可以基于用戶按下的按鈕決定采取哪個行動。
1. 在當(dāng)前工程里插入一新模塊
2. 重命名新模塊SelectCase.
3. 輸入下述過程TestButtons:
Sub TestButtons()
Dim question As String
Dim bts As Integer
Dim myTitle As String
Dim myButton As Integer
question = "Do you want to open a new workbook?"
bts = vbYesNoCancel + vbQuestion + vbDefaultButton1
myTitle = "New Workbook"
myButton = MsgBox(prompt:=question, buttons:=bts, _ title:=myTitle)
Select Case myButton
Case 6
Workbooks.Add
Case 7
MsgBox "You can open a new book manually later."
Case Else
MsgBox "You pressed Cancel."
End Select
End Sub
過程TestButtons的第一部分顯示一個帶有三個按鈕的信息框:是,否和取消。用戶選擇按鈕的值賦予變量myButton。
如果用戶點擊“是”,那么變量myButton就會被賦值常量vbYes或它對應(yīng)的值6;如果用戶點擊“否”,那么變量myButton則賦值為常量vbNo或它對應(yīng)的值7;最后,如果點擊了“取消”,變量myButton的內(nèi)容就等于vbCancel或2。
Select Case語句對照儲存在變量myButton里的值檢查Case子句提供的值。當(dāng)有匹配時,就會執(zhí)行適當(dāng)?shù)?span lang="EN-US">Case語句。
如果你使用常量,而不是按鈕值,過程TestButtons同樣會運行一致。
Select Case myButton
Case vbYes
Workbooks.Add
Case vbNo
MsgBox "You can open a new book manually later."
Case Else
MsgBox "You pressed Cancel."
End Select
你可以忽略Else子句,可以按下述方法修改一下Select Case語句:
Select Case myButton
Case vbYes
Workbooks.Add
Case vbNo
MsgBox "You can open a new book manually later."
Case vbCancel
MsgBox "You pressed Cancel."
End Select
4. 運行過程TestButtons三次,每次選擇一個不同的按鈕。
技巧5-6 通過Case Else捕捉錯誤
盡管在Select Case語句里使用Case Else不是強制的,使用它總是很好的,以防止萬一測試有沒有預(yù)料到的值。Case Else子句是個放置錯誤信息的好地方。
有時候,作決定是基于測試表達式的條件,例如它是否大于,小于,等于或使用一些其它的關(guān)系運算符(參見表5-1)。關(guān)鍵字Is使你能夠在Case子句里使用條件表達式。使用關(guān)鍵字Is的Select Case語句的語法如下:
Select Case 測試表達式
Case Is 條件1
如果條件1為真時執(zhí)行的語句
Case Is 條件2
如果條件2為真時執(zhí)行的語句
Case Is 條件N
如果條件N為真時執(zhí)行的語句
End Select
例如,我們來比較幾個數(shù)字:
Select Case myNumber
Case Is <10
MsgBox "The number is less than 10"
Case 11
MsgBox "You entered eleven."
Case Is >=100
MsgBox "The number is greater than or equal to 100."
Case Else
MsgBox "The number is between 12 and 99."
End Select
假設(shè)變量myNumber為120,那么第三個Case子句為真,并且只有Case Is >=100和Case Else之間的語句會被執(zhí)行。
在前面的例子里,你看到了在每個Case子句里使用一個簡單表達式。然而,很多時候,你可能需要在Case子句里確定一個數(shù)值范圍??梢酝ㄟ^關(guān)鍵字To用于表達式的數(shù)值之間來實現(xiàn)它,如下所示:
Select Case unitsSold
Case 1 to 100
Discount = 0.05
Case Is <= 500
Discount = 0.1
Case 501 to 1000
Discount = 0.15
Case Is >1000
Discount = 0.2
End Select
我們來分析一下上面的Select Case代碼塊,假設(shè)變量unitsSold當(dāng)前值為99。VB將變量unitsSold的值與Case子句的條件表達式進行比較。第一和第三條Case子句示范如何通過使用關(guān)鍵字To在條件表達式里使用數(shù)值范圍。因為unitsSold=99,第一個Case子句里的條件表達式為真,因此,VB將0.05賦給變量Discount。第二個Case子句如何呢?它也為真。盡管,很明顯99小于等于500,VB不會執(zhí)行相關(guān)的語句Discount=0.1。原因是,一旦VB找到了一個真條件的Case子句,它就不會去管其它的Case子句,它將跳過那些代碼,繼續(xù)執(zhí)行End Select語句后面可能有的語句。
我們來練練使用Select Case語句,在函數(shù)過程里使用它。回想在第四章里,函數(shù)過程允許你將結(jié)果返回給一個子過程。假設(shè)該子過程必須根據(jù)銷售的套數(shù)來顯示一個折扣,你可以從用戶那里獲得銷售套數(shù),然后允許一個函數(shù)來確定需要的折扣:
1. 在模塊SelectCase里輸入下列子過程:
Sub DisplayDiscount()
Dim unitsSold As Integer
Dim myDiscount As Single
unitsSold = InputBox("Enter the number of sold units:")
myDiscount = GetDiscount(unitsSold)
MsgBox myDiscount
End Sub
2. 輸入下列函數(shù)過程:
Function GetDiscount(unitsSold As Integer)
Select Case unitsSold
Case 1 To 200
GetDiscount = 0.05
Case Is <=500
GetDiscount = 0.1
Case 501 To 1000
GetDiscount = 0.15
Case Is >1000
GetDiscount = 0.2
End Select
End Function
3. 將光標(biāo)放在過程DisplayDiscount的任意地方并且按下F5來運行它。
過程DisplayDiscount將儲存于變量unitsSold的值傳遞給函數(shù)GetDiscount。當(dāng)VB遇到Select Case語句時,它檢查第一個Case子句里的值是否合儲存于unitsSold里面的值是否匹配。如果匹配,VB給函數(shù)名稱賦值百分之五(0.05),并且跳到關(guān)鍵字End Select。因為,在函數(shù)過程里面沒有更多需要運行的語句,VB就返回主調(diào)過程——DisplayDiscount,在這里,它將函數(shù)的結(jié)果賦予變量myDiscount。最后的語句用信息框來顯示獲得的折扣。
你可以使用逗號明確單一Case子句里的多個表達式:
Select Case myMonth
Case "January", "February", "March"
Debug.Print myMonth & ": 1st Qtr."
Case "April", "May", "June"
Debug.Print myMonth & ": 2nd Qtr."
Case "July", "August", "September"
Debug.Print myMonth & ": 3rd Qtr."
Case "October", "November", "December"
Debug.Print myMonth & ": 4th Qtr."
End Select
技巧5-7 Case子句的多個條件