当第一个为false时,VBA“和”运算符是否会评估第二个参数?

Function Foo(thiscell As Range) As Boolean

  Foo = thiscell.hasFormula And (InStr(1, UCase(Split(thiscell.formula, Chr(40))(0)), "bar") > 0)

End Function

存在此函数的目的是测试(之前)是否存在某个子字符串(在这种情况下为bar)。


我遇到问题的情况是当传递给函数的单元格为空时,thisCell.hasFormula为false,但是and之后的语句仍在评估中。这使我在运行时出现下标超出范围错误。


VBA是否真的继续评估And的第二个参数,即使第一个参数为假?


浮云间
浏览 566回答 3
3回答

侃侃尔雅

正如DOK提到的:不,VBA没有短路评估。从技术上讲,使用2条If-then语句而不是使用AND运算符会更有效,但是除非您多次这样做,否则您不会注意到节省的地方,因此请选择可读性更高的内容。而且,如果您想真正掌握技术,VBA的处理多个If-then语句的速度也要比处理这些语句快Select Case。VBA古怪:)

守着星空守着你

答案是肯定的,VBA不会短路评估。这不仅仅是风格问题;在这样的情况下会有很大的不同:If i <= UBound(Arr, 1) And j <= UBound(Arr, 2) And Arr(i, 1) <= UBound(Arr2, 1) Then&nbsp; &nbsp; Arr2(Arr(i, 1), j) = Arr(i, j)End If...这是不正确的。更合适的是:If i <= UBound(Arr, 1) And j <= UBound(Arr, 2) Then&nbsp; &nbsp; If Arr(i, 1) <= UBound(Arr2, 1) Then&nbsp; &nbsp; &nbsp; &nbsp; Arr2(Arr(i, 1), j) = Arr(i, j)&nbsp; &nbsp; End IfEnd If或者,如果您不喜欢嵌套的ifs:If i > UBound(Arr, 1) Or j > UBound(Arr, 2) Then&nbsp; &nbsp; ' Do NothingElseIf Arr(i, 1) > UBound(Arr2, 1) Then&nbsp; &nbsp; ' Do NothingElse&nbsp; &nbsp; Arr2(Arr(i, 1), j) = Arr(i, j)End If

白衣染霜花

您正在寻找的被称为“ 短路评估 ”。VBA没有它。您可以在此处看到可能适合您情况的方法。这是选择参与有一个替代的方法Select Case为If。还有一个使用nested的示例Ifs。
打开App,查看更多内容
随时随地看视频慕课网APP