我正在处理一个宏,它接受ActiveCell
的当前值并根据选择的大小写更改该值。
但是,我无法确定ActiveCell
是否包含通配符字符串。我不确定我的语法是否正确。如何让我的选择案例进行比较?
Select Case ActiveCell.Value
Case ActiveCell.Value Like "*string*"
ActiveCell.Value = "contains string"
End Select
答案 0 :(得分:21)
可以使用通配符。请记住以下两点:首先,字符串比较表达式计算为布尔数据类型(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
如果我们在任何工作表中选择了包含字符串值的单元格,然后使用立即窗口使用TypeName()函数测试这两个表达式的数据类型,我们将得到以下结果:
?TypeName(ActiveCell.Value)
String
?TypeName(ActiveCell.Value Like "*string*")
Boolean
正如你所看到的,选择...... Case在这里不起作用,因为数据类型不是隐含相同的(如果宏在包含单个工作表的任何单元格上运行,则会出现一个小例外 - " True"或" False"的字值,Excel自动转换为布尔值。
解决方案实际上非常简单。只需将测试表达式更改为 True 。
Select Case True
Case (ActiveCell.Value Like "*string*")
ActiveCell.Value = "contains string"
End Select
这与写作基本相同:
If (ActiveCell.Value Like "*string*") = True Then ActiveCell.Value = "contains string"
无论您使用If ... Then还是Select ... Case,这主要取决于个人喜好。我个人喜欢Select ... Case构造,因为代码的可读性,但也有其他好处(例如能够传递每个Case由逗号分隔的表达式列表而不是使用OR运算符,使代码更多简明)。
答案 1 :(得分:4)
在VBA的select case语句中,不能用作比较运算符 如果可能的话,最好用if-then语句替换:
If ActiveCell.Value Like "*string*" Then ActiveCell.Value = "string"
从VBA术语表中进行比较运算:
表示两个或更多个之间关系的字符或符号 价值观或表达。这些运算符包括小于(<),less 大于或等于(< =),大于(>),大于或等于 (> =),不等于(<>),等于(=)。其他比较运算符 包括Is和Like。请注意,Is和Like不能用作比较 Select Case语句中的运算符。