codecamp

VBA中嵌套的If…Then语句和Select Case语句

将一个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语句(单下划线和双下划线)。

技巧:嵌套语句
嵌套是指将一种控制结构放在另外一控制结构里面。你将在后面的循环结构里看到更多的嵌套的例子。 

Select Case语句

为了避免难以弄清的复杂的嵌套的If语句,你可以使用Select Case语句代替。它的语法为:
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子句并且跳到EndSelect语句。然而,如果第一个Case子句后面的表达式测试结果和测试表达式不匹配时,VB就会检查每一个Case子句,直到它找到一个匹配的为止。如果没有一个Case子句后面的表达式匹配测试表达式的值的话,VB就会跳到Case Else子句并执行该语句直到遇到关键字EndSelect。注意,CaseElse子句是可选的,如果你的程序里面没有使用CaseElse并且没有一个Case子句的表达式和测试表达式相匹配,VB就会跳到EndSelect后面的语句,并且继续执行你的程序。

我们来一个使用Select Case语句的程序例子。在第四章里,你学习了MsgBox函数允许你显示带有一个或多个按钮的信息,你也学习了MsgBox函数的结果可以赋予一个变量。使用SelectCase语句,你现在可以基于用户按下的按钮决定采取哪个行动。

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。

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三次,每次选择一个不同的按钮。

技巧:通过Case Else捕捉错误
尽管在Select Case语句里使用Case Else不是强制的,使用它总是很好的,以防止万一测试有没有预料到的值。Case Else子句是个放置错误信息的好地方。



VBA中的If…Then…ElseIf 语句
和Case子句一起使用Is的方法
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }