为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

浮云间 2019-11-20 10:47:35
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的第二个参数,即使第一个参数为假?
查看完整描述

3 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

正如DOK提到的:不,VBA没有短路评估。


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


VBA古怪:)


查看完整回答
反对 回复 2019-11-20
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

答案是肯定的,VBA不会短路评估。


这不仅仅是风格问题;在这样的情况下会有很大的不同:


If i <= UBound(Arr, 1) And j <= UBound(Arr, 2) And Arr(i, 1) <= UBound(Arr2, 1) Then

    Arr2(Arr(i, 1), j) = Arr(i, j)

End If

...这是不正确的。更合适的是:


If i <= UBound(Arr, 1) And j <= UBound(Arr, 2) Then

    If Arr(i, 1) <= UBound(Arr2, 1) Then

        Arr2(Arr(i, 1), j) = Arr(i, j)

    End If

End If

或者,如果您不喜欢嵌套的ifs:


If i > UBound(Arr, 1) Or j > UBound(Arr, 2) Then

    ' Do Nothing

ElseIf Arr(i, 1) > UBound(Arr2, 1) Then

    ' Do Nothing

Else

    Arr2(Arr(i, 1), j) = Arr(i, j)

End If


查看完整回答
反对 回复 2019-11-20
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

您正在寻找的被称为“ 短路评估 ”。


VBA没有它。


您可以在此处看到可能适合您情况的方法。


这是选择参与有一个替代的方法Select Case为If。还有一个使用nested的示例Ifs。


查看完整回答
反对 回复 2019-11-20
  • 3 回答
  • 0 关注
  • 565 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信