Excel VBA:如果ActiveCell像"*string*"那样选择Case

the*_*eld 10 excel vba wildcard select-case vb-like-operator

我正在处理一个宏,它接受当前值ActiveCell并根据选择的情况更改该值.

但是,我无法确定是否ActiveCell包含通配符字符串.我不确定我的语法是否正确.如何让我的选择案例进行比较?

Select Case ActiveCell.Value

    Case ActiveCell.Value Like "*string*"
        ActiveCell.Value = "contains string"

End Select
Run Code Online (Sandbox Code Playgroud)

小智 24

可以使用通配符.请记住以下两点:首先,字符串比较表达式计算为布尔数据类型(True/False); 其次,根据Select ... Case语句的开发人员参考,任何Case表达式必须"可隐式转换"为与Select Case 测试表达式相同的数据类型.为了演示,让我们使用上面原始帖子中的代码.

Select Case ActiveCell.Value  '-->ActiveCell.Value is the test expression

    Case ActiveCell.Value Like "*string*"  '-->(ActiveCell.Value Like "*string*") is the Case expression.
        ActiveCell.Value = "contains string"

End Select
Run Code Online (Sandbox Code Playgroud)

如果我们在任何工作表中选择了包含字符串值的单元格,然后使用立即窗口使用TypeName()函数测试这两个表达式的数据类型,我们将得到以下内容:

?TypeName(ActiveCell.Value)
 String
?TypeName(ActiveCell.Value Like "*string*")
 Boolean
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,Select ... Case在这里不起作用,因为数据类型不是隐含相同的(如果宏在包含单字值的工作表中的任何单元格上运行,则会有一个小例外. "True"或"False",Excel自动转换为布尔值).

解决方案实际上非常简单.只需将测试表达式更改为True即可.

Select Case True

    Case (ActiveCell.Value Like "*string*")
        ActiveCell.Value = "contains string"

End Select
Run Code Online (Sandbox Code Playgroud)

这与写作基本相同:

If (ActiveCell.Value Like "*string*") = True Then ActiveCell.Value = "contains string"
Run Code Online (Sandbox Code Playgroud)

无论您使用If ... Then还是Select ... Case,这主要取决于个人喜好.我个人喜欢Select ... Case构造,因为代码的可读性,但也有其他好处(例如能够传递每个Case一个由逗号分隔的表达式而不是使用OR运算符,使代码更多简洁).


Aar*_*mas 4

Is 和 like 不能用作 VBA 中 select case 语句中的比较运算符。
如果可能的话,最好用 if-then 语句替换:

If ActiveCell.Value Like "*string*" Then ActiveCell.Value = "string"
Run Code Online (Sandbox Code Playgroud)

来自比较运算符的 VBA 术语表:

表示两个或多个值或表达式之间关系的字符或符号。这些运算符包括小于 (<)、小于或等于 (<=)、大于 (>)、大于或等于 (>=)、不等于 (<>) 和等于 (=)。其他比较运算符包括 Is 和 Like。请注意,Is 和 Like 不能用作 Select Case 语句中的比较运算符。