Excel VBA:如果ActiveCell类似于“*string*”,则选择Case

13

我正在编写一个宏,该宏获取ActiveCell的当前值,并根据选择的情况更改该值。

然而,我无法确定ActiveCell是否包含通配符字符串。我不确定我的语法是否正确。如何使我的选择情况进行比较?

Select Case ActiveCell.Value

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

End Select

2
我认为在Select Case语句块中不应该像那样使用通配符测试。尝试使用“if... then... elseif...end if”代替。 - Our Man in Bananas
Case Is Like替换Case ActiveCell.Value Like - SeanC
这个问题有一个有效的答案。你应该公正地接受它。并且对于你的其他问题也要做同样的事情。 - iDevlop
2个回答

37

可以使用通配符。请记住以下两点:首先,字符串比较表达式的结果为布尔数据类型(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

正如您所看到的,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运算符,使代码更加简洁)。


这个解释得非常好。我重新查看了一些时间以前做的代码,不记得它的作用是什么了,这让我想起来了。 - mojo3340
非常好的答案。我原本以为这是不可能的,但事实证明如此简单。谢谢Nero057。 - perfo

4
在VBA的选择语句中,不能使用"is"和"like"作为比较运算符。
如果可能的话,最好使用if-then语句进行替换。
If ActiveCell.Value Like "*string*" Then ActiveCell.Value = "string"

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接