我正在研究一个宏,它采用当前值ActiveCell
并根据选择情况更改该值。
但是,我无法确定是否ActiveCell
包含通配符字符串。我不确定我的语法是否正确。如何让我的选择案例进行比较?
Select Case ActiveCell.Value
Case ActiveCell.Value Like "*string*"
ActiveCell.Value = "contains string"
End Select
我正在研究一个宏,它采用当前值ActiveCell
并根据选择情况更改该值。
但是,我无法确定是否ActiveCell
包含通配符字符串。我不确定我的语法是否正确。如何让我的选择案例进行比较?
Select Case ActiveCell.Value
Case ActiveCell.Value Like "*string*"
ActiveCell.Value = "contains string"
End Select
可以使用通配符。请记住这两点:首先,字符串比较表达式计算为布尔数据类型(真/假);其次,根据 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
如您所见, Select...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 运算符,使代码更简洁的)。
Is 和 like 不能用作 VBA 中的 select case 语句中的比较运算符。
如果可能的话,最好用 if-then 语句代替:
If ActiveCell.Value Like "*string*" Then ActiveCell.Value = "string"
来自比较运算符的 VBA 词汇表:
表示两个或多个值或表达式之间关系的字符或符号。这些运算符包括小于 (<)、小于或等于 (<=)、大于 (>)、大于或等于 (>=)、不等于 (<>) 和等于 (=)。其他比较运算符包括 Is 和 Like。请注意,Is 和 Like 不能用作 Select Case 语句中的比较运算符。