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 

这个函数用于在(。)之前testing是否存在某个子string(在这种情况下为bar)。

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

是否VBA实际上继续评估第二个参数和,即使当第一个是错误的?

你正在寻找的是所谓的“ 短路评估 ”。

VBA没有它。

你可以看到一个可能适合你的情况的方法。

在那里select的方法涉及用If代替Select Case 。 还有一个使用嵌套Ifs的例子。

正如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 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 

VBA确实有一个类似短路的行为。 通常Null传播通过expression式,例如。 3 + NullNull ,而True And NullNull 。 然而:

? False And Null
False

这看起来像短路的行为 – 发生了什么事? 当连接( And )的另一个参数为False0时, Null不会传播 – 结果只是False0 。 这是无关紧要的。 如果分隔符( Or )的另一个参数为True或非零整数(浮点值将使用此规则四舍五入为整数),则也是如此。

所以在AndOr论据中,副作用和错误是无法避免的,但是Null传播可以被“短路”。 这种行为似乎是从SQLinheritance的。

考虑必须运行的机器代码。 最快的应该是像一个混合的代码行…

如果sfsf然后转到SkipAB

如果fdf然后goto走了

如果dffdefedwf然后转到MustHave

SkipAB:如果dsda> 4则MustHave

GoneBad:退出function

MustHave:ThisIS = true

“只有当程序必须运行数千次时才会节省一些时间…例如,search大型驱动器的文件,或者使用简单的布尔testing来跳过耗时的function,比如查找所有表单和名称封闭的工作表[代码]

  If Not wFF.UsingFileExtMatch Then GoTo SkipExt If Not wFF.OKFileEXTMatch Then GoTo BADFile 

SkipExt:如果不是wFF.UsingFileNameMatch然后GoTo SkipFileMatch如果不是wFF.OKFileNameMatch然后转到BADFile SkipFileMatch:如果不是wFF.UsingDaysAgo然后转到SkipDaysAgo如果不是wFF.OKDaysAgo然后转到BADFile SkipDaysAgo:

[/码]

我认为这是最好的做法:

 sub my conditions() If Condition1=constraint1 then if Condition2=constraint2 then if condition3=constraint3 then ... .... end if end if end if else end if .... end if end sub 

因此,只有在条件i满员的情况下,您才能通过条件。