昨天我们讲到了 Select Case 语句。Select Case 语句主要用于“多中选一”的场合,If 语句虽然适用于各种条件判断的场景,但正如我们上文例子所展示的,在多重嵌套的情况下,使用 Select Case 会使得逻辑更加清晰。今天我们继续讨论 Select Case 语句。Select Case testexpr Case condition_1 statement_1 Case condition_2 statement_2 ... Case condition_n statement_n Case Else statement_elseEnd Select
testexpr 是一个测试表达式,Select Case 语句将这个表达式求值的结果和 Case 中的条件 condition 相比较,和哪个 condition 的比较结果为真,就执行哪个对应的 statement。Dim n As Integer...Select Case n Mod 2 Case 0 Debug.Print "n is Even" Case Else Debug.Print "n is Odd"End Select
上面代码的意思是:如果 n Mod 2 的结果为 0,则执行 Case 0 对应的 Debug.Print,输出 n 是偶数 的结果。如果不为 0,则执行 Case Else 对应的 Debug.Print,输出 n 是奇数的结果。上面的 Select Case 与下面的 If ... End If 等价:Dim n As Integer...If n Mod 2 = 0 Then Debug.Print "n is Even"Else Debug.Print "n is Odd"End If
Dim n As Integer...Select Case n Case 0 Debug.Print n & " 是 0" Case 1 Debug.Print n & " 是 1" Case 2, 3, 5, 7 Debug.Print n & " 是素数" Case Else Debug.Print n & " 是合数"End Select
根据素数还是合数将 0 ~ 9 的数字进行分类,其中要区别出 0 和 1,因为这两个数既不是素数也不是合数。这个例子中特别有意思的是 Case 2, 3, 5, 7,这说明 Case condition 中的 condition 可以是若干个值的列举。这实际上是下列若干条件的简化表示法:...Case 2 Debug.Print ...Case 3 Debug.Print ...Case 5 Debug.Print ...Case 7 Debug.Print ......
这种简化表示法使得代码简洁优美,表达力强,超过了 If 语句。上面的 Case 2, 3, 5, 7 如果用 If 语句来写,就会是这样:...If (n = 2) Or (n = 3) Or (n = 5) Or (n = 7) Then Debug.Print n & " 是素数"End If...
这一长串由 Or 组合起来的布尔表达式(boolean expression),明显不如 Case 2, 3, 5, 7 来得简洁优美。布尔表达式就是求值结果为 True 或 False 的表达式。我们前面已经介绍过,Boolean 类型的值域就是集合 { True, False },并且 VBA 内部用 -1 代表 True,0 代表 False。所以,在将一个算术表达式转换为 Boolean 类型的时候,如果表达式的求值结果为 0,则转换为 Boolean 类型的 False,非 0 则一律转换为 Boolean 的 True,转换以后的内部值是 -1。请见下面的测试例子:这个测试用例说明:所有的算术值(不论是整型还是浮点型)都可以使用 CBool 转换函数转换为 Boolean 类型;而且,根据其值为 True 或 False,分别以其内部表示 -1 或 0,Boolean 类型还可以参与算术运算。Boolean 表达式还可以用 And、Or、Not 等逻辑运算符连接起来组成更复杂的 Boolean 表达式。参见下面的例子。Dim n As Integer...Select Case n Case Is < 0 Debug.Print n & " 是负数" Case 0 to 9 Debug.Print n & " 是小于 10 的非负整数" Case Is >= 10 Debug.Print n & " 是大于等于 10 的整数" Case Else Debug.Print "未知"End Select
Case condition 中的 condition 还可以是 Is < 0 这样的布尔表达式,注意这里的 Is 是 VBA 的关键字(keyword),不是变量名。也可以认为此处的 Is 是一个占位符:因为 Case < 0 不合语法,也不能写 Case n < 0,所以使用 Is < 0 来表示 n < 0。第二个有意思的地方是 0 to 9 这种写法。这种写法表示一个范围:0 - 9。Case 0 to 9 等价于 Case 0, 1, 2, 3, 4, 5, 6, 7, 8, 9。对于项数很多的情况,一一列举显得很累赘,用 0 to 9 这样的区间表示法就既简洁又优美。注意:Select Case 中用 Is 表示的 Boolean 表达式不能再用 And、Or 等逻辑运算符连接组成更复杂的 Boolean 表达式。譬如,Case 0 to 9 就不能表示为 Case (Is >= 0) And (Is <= 9)。虽然在 Case 中可以写 Case Is >= 0, Is <= 9,但这个中间的逗号表示 Or 的意思,表示两个区间:(-∞, 9] 和 [0, ∞)。因此并不等价于用 And 表示的区间 [0, 9]。