前文我们讨论了 Select Case 语句中 Case 条件的各种表达方式,今天继续探讨这个话题。讨论之前,还是把 Select Case 语句的一般形式写在下面:Select Case textexpr Case condition_n statement_n Case Else statement_elseEnd Select
Case condition_n 表示有多个 Case 分支。Case Else 可以有,表示所有前面的条件都不满足的话,就到 Case Else 这里。如果没有 Case Else,而且所有的 Case codition_n 都不满足,则就相当于没有这个 Select Case 语句一样,跳过此 Select Case,直接执行此语句下面的语句。textexpr 可以是一个变量,也可以是一个表达式。针对该变量(或表达式)的值,在下面的 Case condition_n 中寻找匹配者。如果找到了匹配者,则执行匹配 Case 下面的语句,如果没找到,但存在 Case Else,则执行 Case Else 下面的语句。如果不存在 Case Else 且没有找到匹配者,则跳过这个 Select Case 语句。testexpr 既可以是数值型变量或表达式,也可以是字符串型的变量或表达式,当然也可以是布尔型变量或表达式。前文讨论的都是数值型变量或表达式的情形,下面看一个布尔型变量或表达式的例子:Dim n As Integer...Select Case n Mod 2 = 0 Case True Debug.Print n & " is Even" Case False Debug.Print n & " is Odd"End Select
此例中的 testexpr 是 n Mod 2 = 0,这是一个 Boolean 表达式,该表达式只可能有两个值:True 或 False。例子中的 Case True 和 Case False 涵盖了所有的情况。Dim a As IntegerDim b As Integer...Select Case True Case a > b Debug.Print "a > b" Case a < b Debug.Print "a < b" Case Else Debug.Print "a = b"End Select
这个例子很有意思,testexpr 是布尔值 True,这个 Select Case 语句的执行过程是:拿 True 和下面的 Case condition_n 相比较,譬如 a > b 的值等于 True 的话,则执行这个 Case 下面的 Debug.Print,输出 "a > b" 的结果。其他以此类推。这个 Select Case 和下面的 Select Case 等价:Dim a As IntegerDim b As Integer...Select Case a Case Is > b Debug.Print "a > b" Case Is < b Debug.Print "a < b" Case Else Debug.Print "a = b"End Select
虽然两个 Select Case 语句等价,但第一个似乎更直观一些。下面讨论 testexpr 为字符串型变量或表达式(以下简称字符串类型表达式,变量作为表达式的特例)的例子。Dim wkDay As IntegerDim wkDayName As String...Select Case wkDayName Case "星期天", "礼拜天", "周日" wkDay = 1 Case "星期一", "礼拜一", "周一" wkDay = 2 Case "星期二", "礼拜二", "周二" wkDay = 3 Case "星期三", "礼拜三", "周三" wkDay = 4 Case "星期四", "礼拜四", "周四" wkDay = 5 Case "星期五", "礼拜五", "周五" wkDay = 6 Case "星期六", "礼拜六", "周六" wkDay = 0End Select
同一天可能有不同称呼,这里只是按照最常用的三种称呼来判断。当前工作表中的选择是 Selection 对象,这个对象属于 Application,完整的隶属关系应该是 Application.Selection。这个例子演示了 Select Case 的三个特点:- Select Case 的嵌套结构:与 If 语句一样,Select Case 语句也可以嵌套,组合成复杂的判断结构。
- Case condition_n 所对应的 statement_n 可以包含多条语句。
testexpr 为字符串类型表达式时,需要注意字符串比较的方式,不同的比较方式可能导致不同的结果。- Binary:说明字符串按照内部的二进制编码来比较,区分大小写。
- Text:字符串按照文字形式来比较,不区分大小写。
在 testexpr 为字符串表达式的情形下,根据比较方式的不同,同一个 Case condition_n 的结果可能会不同。对于上图的例子:...Select Case typName Case "Range" ......
...Select Case typName Case "range" ......
有可能会显示不同的结果,取决于当前的字符串比较方式。Option Compare BinaryOption Compare Text
顾名思义,Option Compare Binary 设定字符串按照二进制编码来比较,此时将区分字符的大小写。而 Option Compare Text 则设定字符串按照文字来比较,不区分大小写。注意:字符串比较方式不仅影响 Select Case,所有需要比较字符串的地方都受影响,譬如 If 语句,以及我们下面将会讨论的循环语句等。VBA 的默认设置是二进制方式。所以要根据自己的需求来设定字符串的比较方式。如我们已经讨论过的 Option Explicit 语句一样,Option Compare 语句也必须置于代码文件的起始位置才能起作用。