VBA中的If…Then語句

2021-12-08 14:28 更新

你在你的VBA過程里面通過使用專門的控制結構里的條件表達式來做決定。條件表達式是使用關系運算符(見表5-1),邏輯運算符(見表5-2)或者兩者結合的表達式。當VB在你程序里遇到條件表達式時,它將評估該表達式是對還是錯。


VBA

關系運算符

表5-1 VBA中的關系運算符


邏輯運算符

表5-2 VBA中的邏輯運算符


If…Then語句

在VBA過程里面作決定的最簡單的方法就是使用If…Then語句。假使你想要基于某個條件選擇一個行動,那么你可以使用下述結構:


If 條件Then 語句
例如,要刪除工作表里面的空行,首先得確認當前單元格為空白的,如果測試的結果為真則繼續(xù)刪除包含本單元格在內的整行:

If ActiveCell = "" Then Selection.EntireRow.Delete

如果當前單元格不是空白的,VB將忽略關鍵字Then后面的語句。
如果條件為真,你有時候可能想要執(zhí)行好幾個操作,雖然你可以在同一行加上其它的語句,通過冒號分隔它們,但是如果你使用多行If…Then語句,你的代碼將更清晰,如下:


If 條件Then
    語句1
    語句2
    語句N
End If


例如,當當前單元格的數(shù)值大于50時執(zhí)行一些操作,你可以編寫如下指令:

If ActiveCell.Value >50 Then
    MsgBox "The exact value is " & ActiveCell.Value
    Debug.Print ActiveCell.Adress & ": " & ActiveCell.Value
End If

在上面的例子中,如果當前單元格數(shù)值小于等于50的話,那么在關鍵字Then和EndIf之間的語句就不會執(zhí)行。注意,If…Then語句必須以關鍵字End  If結束。VB如何作決定呢?它評估在關鍵字If和Then中間找到的條件。我們來評估一下下面的條件:

ActiveCell.Value >50

1.  在一個空白工作表上選擇任意一個單元格并輸入50


2.  切換到VB編輯器窗口


3.  激活立即窗口


4.  輸入下述語句,并且按下回車鍵

? ActiveCell.Value >50

回車后,VB寫下測試結果——false。當測試結果為假時,VB將不會讀代碼中關鍵字Then之后的語句,它將直接跳過去讀下行代碼,但是,如果沒有其它的代碼行時,程序就將結束。


5.  現(xiàn)在,將運算符改為小于等于號,并且讓VB評估下述條件:

? ActiveCell.Value <= 50

這次測試返回真(true),并且VB跳到關鍵字Then后面的語句上。


6.  關閉立即窗口。


既然你已經(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進行比較。如果比較的結果為真(也就是說,變量weeks的值不等于52),VB就會顯示信息“TryAgain”


5.  運行過程SimpleIfThen并且輸入一個除52之外的數(shù)字


6.  重新運行過程SimpleIfThen并輸入數(shù)字52。當你輸入正確的周數(shù),VB將不會做任何事情,程序就直接結束了。當用戶猜對時,最好也顯示一信息。


7.  在關鍵字End Sub前的另外一行輸入下述指令:

If weeks = 52 Then MsgBox "Congratulations!"

8.  再次運行過程SimpleIfThen并輸入52。當你輸入了正確的答案,VB不會執(zhí)行語句MsgBox“Try Again.”。如果提供的條件測試結果為假時,過程的執(zhí)行結果就是忽略關鍵字Then右邊的語句。回想一下,VBA過程可以調用另外一個過程,我們來看看它是否可以調用本身。


技巧: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”。在第二個例子里,當變量secretCode值等于01W01時,VB就將變量alpha設置為真,變量beta為假。注意,執(zhí)行的第二條語句用冒號與第一條語句分隔開來。


如果當條件為真需要執(zhí)行很多語句或將要執(zhí)行的語句及其長時,多行的If…Then語句會更清楚,如下例所示:

If ActiveSheet.Name = "Sheet1" Then
ActiveSheet.Move after:=Sheets _
(Worksheets.Count)
End If

在這個例子中,VB將會檢查當前工作表的名稱。如果它是“Sheet1”,條件ActiveSheet .Name =“Sheet1”將為真,并且VB將繼續(xù)執(zhí)行關鍵字Then后面的代碼行。結果,當前工作表將會被移動到工作簿的最后。

9.  按下面方法修改過程SimpleIfThen里的第一個If語句:

If weeks <> 52 Then MsgBox "Try Again" : SimpleIfThen

我們在原來的過程SimpleIfThen后面加上一個冒號和SimpleIfThen過程名稱。如果用戶輸入了不正確的答案,他將看到一信息,并且他一旦點擊確定按鈕后,他將獲得另外一次機會來提供正確的答案——輸入框將再次出現(xiàn)。用戶將能夠不斷地猜測答案,事實上,他不能適當?shù)赝瞥鲈撨^程,直到他提供了正確的答案。如果他點擊了取消按鈕,他將不得不去處理不友好的錯誤信息“類型不匹配”。


在上章里,你看到了如何使用On Error GoTo標志語句來繞過錯誤,現(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í)行關鍵字Then右邊的語句。例如:

If sales = 10000 AND salary <45000 Then SlsCom = Sales * 0.07

在這個例子中,條件1 sales=10000,條件2 salary<45000。當AND使用在該條件表達式中時,兩個條件都必須為真,VB才會計算銷售傭金(SlsCom)。如果兩個條件中只要有一個為假,或者都為假,VB將會忽略Then后面的語句。如果符合其中一個條件就足夠好時,你就應該使用運算符OR。這里是語法:

If 條件1 OR 條件2 Then 語句


運算符OR更靈活一些,只要任何一個條件為真時,VB就會執(zhí)行關鍵字Then后面的語句。我們來看看這個例子:

If dept = "S" OR dept = "M" Then bonus = 500
在上面的例子里,如果有個條件為真,VB就將給變量bonus賦值500。如果兩個條件都為假,那么VB就會忽略該行剩余的代碼。


現(xiàn)在我們來看個完整的例子。假設如果你采購50套產品的話,就可以獲得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的內容。在If…Then關鍵字之間的運算符AND使得測試多于一個的條件成為可能。使用了AND運算符時,所有條件都必須為真,VB才會去執(zhí)行關鍵字Then和End之間的語句。因為過程的運行依賴于工作表單元格里輸入的數(shù)據(jù),所以從Excel窗口來運行它比較方便。

2.  切換到Excel應用窗口,并且選擇“工具”-“宏”-“運行宏”

3.  在宏對話框里,選擇IfThenAnd并點擊“選項”按鈕

4.  給你的宏設置快捷鍵:Ctrl+Shift+I,并且退出宏對話框

5.  在工作表里輸入以下數(shù)據(jù):

數(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


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號