你在你的VBA过程里面通过使用专门的控制结构里的条件表达式来做决定。条件表达式是使用关系运算符(见表5-1),逻辑运算符(见表5-2)或者两者结合的表达式。当VB在你程序里遇到条件表达式时,它将评估该表达式是对还是错。
表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.ValueEnd 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" ThenActiveSheet.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 didnt meet the criteria." End IfEnd Sub
上面的过程IfThenAnd使用了四个If…Then语句来评估两个变量price和units的内容。在If…Then关键字之间的运算符AND使得测试多于一个的条件成为可能。使用了AND运算符时,所有条件都必须为真,VB才会去执行关键字Then和End之间的语句。因为过程的运行依赖于工作表单元格里输入的数据,所以从Excel窗口来运行它比较方便。
要使If程序块更容易阅读和理解,可以使用缩进。对比下面的代码书写:
If condition Then
action1
End If
If condition Then
action
End If
作者:唐伯虎点蚊香,如若转载,请注明出处:https://www.web176.com/vba/20259.html