当第一个参数为false时,VBA"And"运算符是否会计算第二个参数?

Jam*_*mes 48 excel vba operators

Function Foo(thiscell As Range) As Boolean
  Foo = thiscell.hasFormula And (InStr(1, UCase(Split(thiscell.formula, Chr(40))(0)), "bar") > 0)
End Function
Run Code Online (Sandbox Code Playgroud)

此函数用于在(.)之前测试某个子字符串(在本例中为bar)的存在.

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

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

DOK*_*DOK 58

您正在寻找的是" 短路评估 ".

VBA没有它.

您可以在这里看到可能适合您的情况的方法.

这是有选择的办法涉及一个替代Select CaseIf.还有一个使用嵌套的例子Ifs.

  • 当我和VBA合作时,我开始觉得我正试图用蜡笔画蒙娜丽莎. (71认同)

aev*_*nko 11

正如DOK所说:不,VBA没有短路评估.

使用2个If-then语句而不是使用AND运算符在技​​术上更有效,但除非你多次这样做,否则你不会注意到节省,所以选择更具可读性的东西.如果你想获得真正的技术,VBA处理多个If-then语句的速度也快Select Case.

VBA很古怪:)