乐于分享
好东西不私藏

Excel VBA 编程基础 — 语句(七)- 条件语句(五)

Excel VBA 编程基础 — 语句(七)- 条件语句(五)

前面我们已经讨论了 Select Case 语句的各种情况,今天再深入探讨一下 Select Case 语句中字符串模式匹配的用法。
还是先来看例子。
例6. 根据 A1 单元格的内容设置背景颜色
Dim ro AsRangeSet ro = ActiveSheet.Range("A1")SelectCaseTrueCase ro.Value LikeEmpty    ro.Interior.Color = RGB(255255255)Case IsNumeric(ro.Value) AndNot (ro.Value Like "*[!0-9]*")    ro.Interior.Color = RGB(25500)Case ro.Value Like "[a-z]*"    ro.Interior.Color = RGB(0255255)Case ro.Value Like "[A-Z]*"    ro.Interior.Color = RGB(2550255)CaseElse    ro.Interior.Color = RGB(000)EndSelect
首先,声明变量 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(255255255)ElseIf IsNumeric(ro.Value) And Not (ro.Value Like "*[!0-9]*") Thenro.Interior.Color = RGB(25500)ElseIf ro.Value Like "[a-z]*" Thenro.Interior.Color = RGB(0255255)ElseIf ro.Value Like "[A-Z]*" Thenro.Interior.Color = RGB(2550255)Elsero.Interior.Color = RGB(000)End If
两段代码虽然等价,但从美学的角度来看,Select Case 结构要优美得多。这就是为什么虽然有了“无所不能”的 If 语句,还要提供一个等价的 Select Case 语句的原因。
VBA 中的 Like 表达式还是比较初级的,只能表示一些比较简单的模式匹配,譬如不能表达“任意大小的非负整数字符串”这样的模式,必须要借助于 IsNumeric 函数。VBA 中有专门的功能强大的正则表达式,这个我们以后会讲到。
相关阅读
Excel VBA 编程基础 — 语句(三)- 条件语句
Excel VBA 编程基础 — 语句(四)- 条件语句
Excel VBA 编程基础 — 语句(五)- 条件语句(三)
Excel VBA 编程基础 — 语句(六)- 条件语句(四)