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