首先,声明变量 ro 为 Range 类型,然后将当前工作表中的 A1 单元格赋给 ro。接下来的 Select Case 语句使用了 Like 操作符。VBA 中的 Like 操作符是一个非常简单的模式匹配操作符,其语法格式如下:
result= string Likepattern
string 是任意字符串,pattern 也是一个字符串,其中含有模式匹配操作符。Like 操作符的结果类型是 Boolean 类型:如果字符串 string 匹配模式 pattern,则返回 True,否则,返回 False。pattern 中的模式匹配符列于下表:图1 Like 中的模式匹配符了解了 Like 中的模式匹配符,现在再来看上面的例子,就容易理解了。ro.Value Like Empty:这是单元格为空的情况(Empty 表示空字符串),此时设置单元格背景为白色。IsNumeric(ro.Value) And Not (ro.Value Like “*[!0-9]*”):这是由两个 Boolean 表达式由 And 和 Not 逻辑操作符组合起来的复杂 Boolean 表达式,可以简化为:A And Not B。这里 A 等于 IsNumeric(ro.Value),B 等于 (ro.Value Like “*[!0-9]*”)。IsNumeric 是 VBA 函数,作用是判断给定的值是否是数值。所以 IsNumeric(ro.Value) 就是判断单元格 ro 中的值是不是数值。这里的“数值”指浮点数值,即可以包含小数点以及指数,如 IsNumeric(3.5E10) 返回 True,IsNumeric(“23”) 也返回 True,但 IsNumeric(“23 Help”) 则返回 False。所以,IsNumeric(ro.Value) 用来判断单元格 ro 中的值是不是数值。对于表达式 ro.Value Like “*[!0-9]*”,我们先来看看模式字符串 “*[!0-9]*”,根据图1,这个模式匹配不含数字的任意字符串,所以表达式 ro.Value Like “*[!0-9]*” 的意思是单元格的值不含数字。Not (ro.Value Like “*[!0-9]*”) 的意思是单元格的值只含有数字。两个子表达式组合起来,IsNumeric(ro.Value) And Not (ro.Value Like “*[!0-9]*”) 的意思:单元格 ro 的值是数值,并且只含有 0-9 的数字。简单一句话,就是单元格 ro 的值是任意大小的非负整数。如果单元格的值满足这个条件,则单元格的背景就设置为红色。ro.Value Like “[a-z]*”:模式 [a-z]* 表示“以小写字母开头,后面跟有 0 个或多个任意字符”组成的字符串。如果单元格的值满足这个模式,则背景设置为青色。ro.Value Like “[A-Z]*”:模式 [A-Z]* 表示“以大写字母开头,后面跟有 0 个或多个任意字符”组成的字符串。如果单元格的值满足这个模式,则背景设置为橘色。要注意的是,模式 [a-z]* 和 [A-Z]* 的作用依赖于字符串比较方式的设置。如果当前字符串的比较方式设置为:
Option Compare Binary
那么,模式 [a-z]* 和 [A-Z]* 是不同的。而如果设置为:
Option Compare Text
那么,这两个模式 [a-z]* 和 [A-Z]* 是相同的,因为 Text 方式的字符串比较不区分大小写。可以看出,Select Case 语句的语法还是比较灵活的,如果 testexpr 是变量或表达式,则 Case condition 中的 condition 或者是 Is 表达式,或者是枚举值,或者是区间表达式。如果 testexpr 是 True,那么 Case condition 中的 condition 就是 Boolean 表达式,包括我们今天讨论的模式匹配表达式。这种灵活的表达方式使得 Select Case 功能非常强大。当然,Select Case 语句和 If 语句是等价的,上面的例子可以用 If 语句表达如下:
Dim ro As RangeSet ro = ActiveSheet.Range("A1")If ro.Value Like Empty Thenro.Interior.Color = RGB(255, 255, 255)ElseIf IsNumeric(ro.Value) And Not (ro.Value Like "*[!0-9]*") Thenro.Interior.Color = RGB(255, 0, 0)ElseIf ro.Value Like "[a-z]*" Thenro.Interior.Color = RGB(0, 255, 255)ElseIf ro.Value Like "[A-Z]*" Thenro.Interior.Color = RGB(255, 0, 255)Elsero.Interior.Color = RGB(0, 0, 0)End If