你在你的VBA過程里面通過使用專門的控制結(jié)構(gòu)里的條件表達(dá)式來做決定。條件表達(dá)式是使用關(guān)系運(yùn)算符(見表5-1),邏輯運(yùn)算符(見表5-2)或者兩者結(jié)合的表達(dá)式。當(dāng)VB在你程序里遇到條件表達(dá)式時(shí),它將評估該表達(dá)式是對還是錯(cuò)。
表5-1 VBA中的關(guān)系運(yùn)算符
表5-2 VBA中的邏輯運(yùn)算符
If 條件Then 語句
例如,要?jiǎng)h除工作表里面的空行,首先得確認(rèn)當(dāng)前單元格為空白的,如果測試的結(jié)果為真則繼續(xù)刪除包含本單元格在內(nèi)的整行:
If ActiveCell = "" Then Selection.EntireRow.Delete
如果當(dāng)前單元格不是空白的,VB將忽略關(guān)鍵字Then后面的語句。
如果條件為真,你有時(shí)候可能想要執(zhí)行好幾個(gè)操作,雖然你可以在同一行加上其它的語句,通過冒號分隔它們,但是如果你使用多行If…Then語句,你的代碼將更清晰,如下:
If 條件Then
語句1
語句2
語句N
End If
例如,當(dāng)當(dāng)前單元格的數(shù)值大于50時(shí)執(zhí)行一些操作,你可以編寫如下指令:
If ActiveCell.Value >50 Then
MsgBox "The exact value is " & ActiveCell.Value
Debug.Print ActiveCell.Adress & ": " & ActiveCell.Value
End If
在上面的例子中,如果當(dāng)前單元格數(shù)值小于等于50的話,那么在關(guān)鍵字Then和EndIf之間的語句就不會(huì)執(zhí)行。注意,If…Then語句必須以關(guān)鍵字End If結(jié)束。VB如何作決定呢?它評估在關(guān)鍵字If和Then中間找到的條件。我們來評估一下下面的條件:
ActiveCell.Value >50
1. 在一個(gè)空白工作表上選擇任意一個(gè)單元格并輸入50
2. 切換到VB編輯器窗口
3. 激活立即窗口
4. 輸入下述語句,并且按下回車鍵
? ActiveCell.Value >50
回車后,VB寫下測試結(jié)果——false。當(dāng)測試結(jié)果為假時(shí),VB將不會(huì)讀代碼中關(guān)鍵字Then之后的語句,它將直接跳過去讀下行代碼,但是,如果沒有其它的代碼行時(shí),程序就將結(jié)束。
5. 現(xiàn)在,將運(yùn)算符改為小于等于號,并且讓VB評估下述條件:
? ActiveCell.Value <= 50
這次測試返回真(true),并且VB跳到關(guān)鍵字Then后面的語句上。
6. 關(guān)閉立即窗口。
既然你已經(jīng)知道了VB如何評估條件的,我們就來在VBA過程里試試If…Then語句吧。
1. 打開一個(gè)新工作簿并保存為Chap05.xls
2. 切換到VB編輯器窗口,并且將VBA工程重命名為Decisions
3. 插入一新模塊并重命名為IfThen
4. 在IfThen模塊里,輸入下述過程:
Sub SimpleIfThen()
Dim weeks As String
weeks = InputBox("How many weeks are in a year:", "Quiz")
If weeks<>52 Then MsgBox "Try Again"
End Sub
過程SimpleIfThen將用戶的答案儲(chǔ)存于一個(gè)名為weeks的變量上,然后,該變量的值將會(huì)和數(shù)值52進(jìn)行比較。如果比較的結(jié)果為真(也就是說,變量weeks的值不等于52),VB就會(huì)顯示信息“TryAgain”
5. 運(yùn)行過程SimpleIfThen并且輸入一個(gè)除52之外的數(shù)字
6. 重新運(yùn)行過程SimpleIfThen并輸入數(shù)字52。當(dāng)你輸入正確的周數(shù),VB將不會(huì)做任何事情,程序就直接結(jié)束了。當(dāng)用戶猜對時(shí),最好也顯示一信息。
7. 在關(guān)鍵字End Sub前的另外一行輸入下述指令:
If weeks = 52 Then MsgBox "Congratulations!"
8. 再次運(yùn)行過程SimpleIfThen并輸入52。當(dāng)你輸入了正確的答案,VB不會(huì)執(zhí)行語句MsgBox“Try Again.”。如果提供的條件測試結(jié)果為假時(shí),過程的執(zhí)行結(jié)果就是忽略關(guān)鍵字Then右邊的語句?;叵胍幌?,VBA過程可以調(diào)用另外一個(gè)過程,我們來看看它是否可以調(diào)用本身。
技巧:If…Then語句的兩種格式
If…Then語句有兩種格式——單行和多行。這種短格式適合于可以寫在一行里的語句,例如:
If secretCode <> 01W01 Then MsgBox “Access denied”
或者:
If secretCode = 01W01 Then alpha=True : beta = False
這里的secreCode,alpha和beta是變量名稱。在第一個(gè)例子里,如果變量secretCode的值不等于01W01,那么VB顯示信息“Accessdenied”。在第二個(gè)例子里,當(dāng)變量secretCode值等于01W01時(shí),VB就將變量alpha設(shè)置為真,變量beta為假。注意,執(zhí)行的第二條語句用冒號與第一條語句分隔開來。
如果當(dāng)條件為真需要執(zhí)行很多語句或?qū)⒁獔?zhí)行的語句及其長時(shí),多行的If…Then語句會(huì)更清楚,如下例所示:
If ActiveSheet.Name = "Sheet1" Then
ActiveSheet.Move after:=Sheets _
(Worksheets.Count)
End If
在這個(gè)例子中,VB將會(huì)檢查當(dāng)前工作表的名稱。如果它是“Sheet1”,條件ActiveSheet .Name =“Sheet1”將為真,并且VB將繼續(xù)執(zhí)行關(guān)鍵字Then后面的代碼行。結(jié)果,當(dāng)前工作表將會(huì)被移動(dòng)到工作簿的最后。
9. 按下面方法修改過程SimpleIfThen里的第一個(gè)If語句:
If weeks <> 52 Then MsgBox "Try Again" : SimpleIfThen
我們在原來的過程SimpleIfThen后面加上一個(gè)冒號和SimpleIfThen過程名稱。如果用戶輸入了不正確的答案,他將看到一信息,并且他一旦點(diǎn)擊確定按鈕后,他將獲得另外一次機(jī)會(huì)來提供正確的答案——輸入框?qū)⒃俅纬霈F(xiàn)。用戶將能夠不斷地猜測答案,事實(shí)上,他不能適當(dāng)?shù)赝瞥鲈撨^程,直到他提供了正確的答案。如果他點(diǎn)擊了取消按鈕,他將不得不去處理不友好的錯(cuò)誤信息“類型不匹配”。
在上章里,你看到了如何使用On Error GoTo標(biāo)志語句來繞過錯(cuò)誤,現(xiàn)在,你可以這樣來修改你的過程SimpleIfThen:
Sub SimpleIfThen()
Dim weeks As String
On Error GoTo VeryEnd
weeks = InputBox("How many weeks are in a year:", "Quiz")
If weeks<>52 Then MsgBox "Try Again": SimpleIfThen
If weeks=52 Then MsgBox "Congratulations!"
VeryEnd:
End Sub
10. 運(yùn)行幾遍過程SimpleIfThen,提供一些不正確的答案。你在程序里面加的錯(cuò)誤捕捉指令使得用戶可以推出猜測,而不必面對這可惡的錯(cuò)誤信息。在上面段落里的過程SimpleIfThen里,If…Then語句僅評估一個(gè)條件,然而,這個(gè)語句可以使用一個(gè)以上的條件。你必須使用邏輯運(yùn)算符AND和OR(參見本章前面的表5-2)來明確If…Then語句里的多個(gè)條件。這里是使用AND運(yùn)算符的語法:
If 條件1 AND 條件2 Then 語句
在上面的語法例,條件1和條件2都必須為真,VB才會(huì)執(zhí)行關(guān)鍵字Then右邊的語句。例如:
If sales = 10000 AND salary <45000 Then SlsCom = Sales * 0.07
在這個(gè)例子中,條件1 sales=10000,條件2 salary<45000。當(dāng)AND使用在該條件表達(dá)式中時(shí),兩個(gè)條件都必須為真,VB才會(huì)計(jì)算銷售傭金(SlsCom)。如果兩個(gè)條件中只要有一個(gè)為假,或者都為假,VB將會(huì)忽略Then后面的語句。如果符合其中一個(gè)條件就足夠好時(shí),你就應(yīng)該使用運(yùn)算符OR。這里是語法:
If 條件1 OR 條件2 Then 語句
運(yùn)算符OR更靈活一些,只要任何一個(gè)條件為真時(shí),VB就會(huì)執(zhí)行關(guān)鍵字Then后面的語句。我們來看看這個(gè)例子:
If dept = "S" OR dept = "M" Then bonus = 500
在上面的例子里,如果有個(gè)條件為真,VB就將給變量bonus賦值500。如果兩個(gè)條件都為假,那么VB就會(huì)忽略該行剩余的代碼。
現(xiàn)在我們來看個(gè)完整的例子。假設(shè)如果你采購50套產(chǎn)品的話,就可以獲得10%的折扣,單價(jià)為$7.00。過程IfThenAnd示范運(yùn)算符AND的使用。
1. Decisions (Chap05.xls)工程的IfThen模塊里輸入下述過程:
Sub IfThenAnd()
Dim price As Single
Dim units As Integer
Dim rebate As Single
Const strmsg1 = "To get a rebate you must buy an additional "
Const strmsg2 = "Price must equal $7.00"
units = Range("B1").Value
price = Range("B2").Value
If price = 7 AND units >= 50 Then
rebate = (price * units) * 0.1
Range("A4").Value = "The rebate is: $" & rebate
End If
If price = 7 AND units < 50 Then
Range("A4").Value = strmsg1 & 50 - units & " unit(s)."
End If
If price <> 7 AND units >= 50 Then
Range("A4").Value = strmsg2
End If
If price <> 7 AND units < 50 Then
Range("A4").Value = "You didn't meet the criteria."
End If
End Sub
上面的過程IfThenAnd使用了四個(gè)If…Then語句來評估兩個(gè)變量price和units的內(nèi)容。在If…Then關(guān)鍵字之間的運(yùn)算符AND使得測試多于一個(gè)的條件成為可能。使用了AND運(yùn)算符時(shí),所有條件都必須為真,VB才會(huì)去執(zhí)行關(guān)鍵字Then和End之間的語句。因?yàn)檫^程的運(yùn)行依賴于工作表單元格里輸入的數(shù)據(jù),所以從Excel窗口來運(yùn)行它比較方便。If condition Then
action1
End If
If condition Then
action
End If
更多建議: