阅读(4906) (0)

VBA中的If…Then语句

2016-11-17 18:08:35 更新

你在你的VBA过程里面通过使用专门的控制结构里的条件表达式来做决定。条件表达式是使用关系运算符(见表5-1),逻辑运算符(见表5-2)或者两者结合的表达式。当VB在你程序里遇到条件表达式时,它将评估该表达式是对还是错。


VBA

关系运算符

表5-1 VBA中的关系运算符


逻辑运算符

表5-2 VBA中的逻辑运算符


If…Then语句

在VBA过程里面作决定的最简单的方法就是使用If…Then语句。假使你想要基于某个条件选择一个行动,那么你可以使用下述结构:


If 条件Then 语句
例如,要删除工作表里面的空行,首先得确认当前单元格为空白的,如果测试的结果为真则继续删除包含本单元格在内的整行:

If ActiveCell = "" Then Selection.EntireRow.Delete

如果当前单元格不是空白的,VB将忽略关键字Then后面的语句。
如果条件为真,你有时候可能想要执行好几个操作,虽然你可以在同一行加上其它的语句,通过冒号分隔它们,但是如果你使用多行If…Then语句,你的代码将更清晰,如下:


If 条件Then
    语句1
    语句2
    语句N
End If


例如,当当前单元格的数值大于50时执行一些操作,你可以编写如下指令:

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

在上面的例子中,如果当前单元格数值小于等于50的话,那么在关键字Then和EndIf之间的语句就不会执行。注意,If…Then语句必须以关键字End  If结束。VB如何作决定呢?它评估在关键字If和Then中间找到的条件。我们来评估一下下面的条件:

ActiveCell.Value >50

1.  在一个空白工作表上选择任意一个单元格并输入50


2.  切换到VB编辑器窗口


3.  激活立即窗口


4.  输入下述语句,并且按下回车键

? ActiveCell.Value >50

回车后,VB写下测试结果——false。当测试结果为假时,VB将不会读代码中关键字Then之后的语句,它将直接跳过去读下行代码,但是,如果没有其它的代码行时,程序就将结束。


5.  现在,将运算符改为小于等于号,并且让VB评估下述条件:

? ActiveCell.Value <= 50

这次测试返回真(true),并且VB跳到关键字Then后面的语句上。


6.  关闭立即窗口。


既然你已经知道了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的变量上,然后,该变量的值将会和数值52进行比较。如果比较的结果为真(也就是说,变量weeks的值不等于52),VB就会显示信息“TryAgain”


5.  运行过程SimpleIfThen并且输入一个除52之外的数字


6.  重新运行过程SimpleIfThen并输入数字52。当你输入正确的周数,VB将不会做任何事情,程序就直接结束了。当用户猜对时,最好也显示一信息。


7.  在关键字End Sub前的另外一行输入下述指令:

If weeks = 52 Then MsgBox "Congratulations!"

8.  再次运行过程SimpleIfThen并输入52。当你输入了正确的答案,VB不会执行语句MsgBox“Try Again.”。如果提供的条件测试结果为假时,过程的执行结果就是忽略关键字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为假。注意,执行的第二条语句用冒号与第一条语句分隔开来。


如果当条件为真需要执行很多语句或将要执行的语句及其长时,多行的If…Then语句会更清楚,如下例所示:

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

在这个例子中,VB将会检查当前工作表的名称。如果它是“Sheet1”,条件ActiveSheet .Name =“Sheet1”将为真,并且VB将继续执行关键字Then后面的代码行。结果,当前工作表将会被移动到工作簿的最后。

9.  按下面方法修改过程SimpleIfThen里的第一个If语句:

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

我们在原来的过程SimpleIfThen后面加上一个冒号和SimpleIfThen过程名称。如果用户输入了不正确的答案,他将看到一信息,并且他一旦点击确定按钮后,他将获得另外一次机会来提供正确的答案——输入框将再次出现。用户将能够不断地猜测答案,事实上,他不能适当地推出该过程,直到他提供了正确的答案。如果他点击了取消按钮,他将不得不去处理不友好的错误信息“类型不匹配”。


在上章里,你看到了如何使用On Error GoTo标志语句来绕过错误,现在,你可以这样来修改你的过程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才会执行关键字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就会执行关键字Then后面的语句。我们来看看这个例子:

If dept = "S" OR dept = "M" Then bonus = 500
在上面的例子里,如果有个条件为真,VB就将给变量bonus赋值500。如果两个条件都为假,那么VB就会忽略该行剩余的代码。


现在我们来看个完整的例子。假设如果你采购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才会去执行关键字Then和End之间的语句。因为过程的运行依赖于工作表单元格里输入的数据,所以从Excel窗口来运行它比较方便。

2.  切换到Excel应用窗口,并且选择“工具”-“宏”-“运行宏”

3.  在宏对话框里,选择IfThenAnd并点击“选项”按钮

4.  给你的宏设置快捷键:Ctrl+Shift+I,并且退出宏对话框

5.  在工作表里输入以下数据:

数据

6.  按下Ctrl+Shift+I运行过程IfThenAnd

7.  改变单元格B1和B2的值,以便你每次运行该过程时,不同的If…Then语句为真

技巧:指令块和缩进
要使If程序块更容易阅读和理解,可以使用缩进。对比下面的代码书写:
If condition Then
action1
End If
If condition Then
   action
End If