用Else子句。如果第一种情况(ActiveCell。Value = 0)为假,VB将跳到下一个ElseIf语句,并且
评估该条件(ActiveCell。Value》0),如果该值不大于0,VB将跳到下个ElseIf并检查条件
ActiveCell。Value 0 Then
ActiveCell。Offset(0; 1)。Value = 〃positive〃
ElseIf ActiveCell。Value 《 0 Then
ActiveCell。Offset(0; 1)。Value = 〃negative〃
‘End If (原文错误,多一个End If)
End If
End Sub
因为你需要运行过程WhatValue好几次来测试各种条件,所以,我们给它设置个临时的快捷键。
4。 打开立即窗口,并且输入下列语句:
Application。OnKey 〃^+y〃; 〃WhatValue〃
一旦按下回车键,VB就会运行OnKey方法将过程WhatValue赋予组合键Ctrl+Shift+Y。这个键盘快捷
键只是临时的——当你重新启动Excel后它就不起作用了。你同样也可以用Excel界面…工具菜单…
宏对话框里的选项来设置快捷键。
5。 切换到Excel界面,并激活Sheet1
6。 在单元格A1里输入0,并且按下Ctrl+Shift+Y。VB将调用过程WhatValue并在单元格B1厘米输入
“zero”
109
… 页面 126…
7。 在单元格A1里输入任意大于0的数字,并按下Ctrl+Shift+Y,VB将再次调用WhatValue。VB评估
第一种条件,因为该测试的结果为假,所以它跳到ElseIf语句。第二个条件为真,因此VB执行
Then后面的语句,并且跳过下一条语句,直接到End If。因为End If后面并没有其它的语句了,
该过程便结束了,单元格B1现在显示“positive”。
8。 在单元格A1里输入任意小于0的数字,并按下Ctrl+Shift+Y。这次,前面两个条件都返回假,
因此VB继续检查第三个条件。因为这次的测试为真,VB就在单元格B1里贴上标签“negative”
9。 在单元格A1里输入任何文本,并按下Ctrl+Shift+Y,VB的反应是“positive”,然而,这不是
个满意的答案。你也许希望VB通过显示“text”来区分开正数和文本。要使你的过程WhatValue
更“聪明”些,你就需要学习如何通过使用嵌套的If…Then语句来作一些更复杂的决定。
6。嵌套的 If…Then 语句
将一个If…Then语句或If…Then…Else语句放在另外一个If…Then语句或If…Then…Else语句里
面,你可以在你的VBA过程里作出更复杂的决定。这种一个If语句里包含另一个If指令块的结构称
为嵌套的If语句。
接下来的过程TestConditions世上节里的过程WhatValue的修正版,演示嵌套的If…Then语句是如
何工作的:
Sub TestConditions()
Range(〃A1〃)。Select
If IsEmpty(ActiveCell) Then
MsgBox 〃The cell is empty。〃
Else
If IsNumeric(ActiveCell。Value) Then
If ActiveCell。Value = 0 Then
ActiveCell。Offset(0; 1)。Value = 〃zero〃
ElseIf ActiveCell。Value 》 0 Then
ActiveCell。Offset(0; 1)。Value = 〃positive〃
ElseIf ActiveCell。Value 《 0 Then
ActiveCell。Offset(0; 1)。Value = 〃negative〃
End If
Else
ActiveCell。Offset(0; 1)。Value = 〃text〃
End If
End If
End Sub
为了使过程TestConditions更容易理解,每个If…Then语句都显示为不同的格式,现在你可以清楚
地看到过程使用了三个If…Then程序块。
第一个If块(粗体)检查当前单元格是否为空,如果为真,就会显示信息,然后VB将跳过Else部分
找到相应的End If,该语句位于关键字End Sub之前。
如果当前单元格不为空,IsEmpty (ActiveCell)条件返回假,并且VB运行粗体Else下面的单下划线
的If块。该单下划线的If…Then…Else语句就是嵌套在第一个If块(粗体)的。该语句检查当前单
元格是否是个数字。注意,我们通过另一个内置函数IsNumeric来做这个。如果当前单元格的值不
是一个数字,条件就为假,因此,VB跳到单下划线的Else处,并且在B1里输入“text”。然而,如
果当前单元格包含个数字时,VB就会运行双下划线的If块,评估每种情况并作出相应的决定。
第一个If块(粗体)被称为外部If语句,这个外部语句包含两个内部的If语句(单下划线和双下划
线)。
技巧5…5 嵌套语句
嵌套是指将一种控制结构放在另外一控制结构里面。你将在第六章里的循环结构里看到更多的嵌套
的例子。
7。Select Case 语句
为了避免难以弄清的复杂的嵌套的If语句,你可以使用Select Case语句代替。它的语法为:
110
… 页面 127…
Select Case 测试表达式
Case 表达式1
如果表达式1匹配测试表达式的语句
Case 表达式2
如果表达式2匹配测试表达式的语句
Case 表达式N
如果表达式N匹配测试表达式的语句
Case Else
如果没有表达式匹配测试表达式要执行的语句
End Select
你在关键字Select Case和End Select之间放置任意多个条件以测试。子句Case Else是可选的,当
你希望可能有条件表达式返回假时使用它。在Select Case语句里,VB将每个表达式和测试表达式
相比较。
这里是Select Case语句背后的逻辑。当VB遇到Select Case子句,它记下测试表达式的值。然后它
前进到下面的第一个Case子句,如果这个表达式的值和测试表达式的值匹配的话,VB就会执行语句
直到遇到另外一个Case子句并且跳到End Select语句。然而,如果第一个Case子句后面的表达式测
试结果和测试表达式不匹配时,VB就会检查每一个Case子句,直到它找到一个匹配的为止。如果没
有一个Case子句后面的表达式匹配测试表达式的值的话,VB就会跳到Case Else子句并执行该语句
直到遇到关键字End Select。注意,Case Else子句是可选的,如果你的程序里面没有使用Case Else
并且没有一个Case子句的表达式和测试表达式相匹配,VB就会跳到End Select后面的语句,并且继
续执行你的程序。
我们来一个使用Select Case语句的程序例子。在第四章里,你学习了MsgBox函数允许你显示带有
一个或多个按钮的信息,你也学习了MsgBox函数的结果可以赋予一个变量。使用Select Case语句,
你现在可以基于用户按下的按钮决定采取哪个行动。
1。 在当前工程里插入一新模块
2。 重命名新模块SelectCase。
3。 输入下述过程TestButtons:
Sub TestButtons()
Dim question As String
Dim bts As Integer
Dim myTitle As String
Dim myButton As Integer
question = 〃Do you want to open a new workbook?〃
bts = vbYesNoCancel + vbQuestion + vbDefaultButton1
myTitle = 〃New Workbook〃
myButton = MsgBox(prompt:=question; buttons:=bts; _ title:=myTitle)
Select Case myButton
Case 6
Workbooks。Add
Case 7
MsgBox 〃You can open a new book manually later。〃
Case Else
MsgBox 〃You pressed Cancel。〃
End Select
End Sub
过程TestButtons的第一部分显示一个带有三个按钮的信息框:是,否和取消。用户选择按钮的值
赋予变量myButton。
如果用户点击“是”,那么变量myButton就会被赋值常量vbYes或它对应的值6;如果用户点击“否”,
那么变量myButton则赋值为常量vbNo或它对应的值7;最后,如果点击了“取消”,变量myButton
的内容就等于vbCancel或2。
111
… 页面 128…
Select Case语句对照储存在变量myButton里的值检查Case子句提供的值。当有匹配时,就会执行
适当的Case语句。
如果你使用常量,而不是按钮值,过程TestButtons同样会运行一致。
Select Case myButton
Case vbYes
Workbooks。Add
Case vbNo
MsgBox 〃You can open a new book manually later。〃
Case Else
MsgBox 〃You pressed Cancel。〃
End Select
你可以忽略Else子句,可以按下述方法修改一下Select Case语句:
Select Case myButton
Case vbYes
Workbooks。Add
Case vbNo
MsgBox 〃You can open a new book manually later。〃
Case vbCancel
MsgBox 〃You pressed Cancel。〃
End Select
4。 运行过程TestButtons三次,每次选择一个不同的按钮。
技巧5…6 通过Case Else捕捉错误
尽管在Select Case语句里使用Case Else不是强制的,使用它总是很好的,以防止万一测试有没有
预料到的值。Case Else子句是个放置错误信息的好地方。
8。和 Case 子句一起使用 Is
有时候,作决定是基于测试表达式的条件,例如它是否大于,小于,等于或使用一些其它的关系运
算符(参见表5…1)。关键字Is使你能够在Case子句里使用条件表达式。使用关键字Is的Select Case
语句的语法如下:
Select Case 测试表达式
Case Is 条件1
如果条件1为真时执行的语句
Case Is 条件2
如果条件2为真时执行的语句
Case Is 条件N
如果条件N为真时执行的语句
End Select
例如,我们来比较几个数字:
Select Case myNumber
Case Is =100
MsgBox 〃The number is greater than or equal to 100。〃
Case Else
MsgBox 〃The number is between 12 and 99。〃
End Select
假设变量myNumber为120,那么第三个Case子句为真,并且只