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 + Null
是Null
,而True And Null
是Null
。 然而:
? False And Null
False
这看起来像短路的行为 – 发生了什么事? 当连接( And
)的另一个参数为False
或0
时, Null
不会传播 – 结果只是False
或0
。 这是无关紧要的。 如果分隔符( Or
)的另一个参数为True
或非零整数(浮点值将使用此规则四舍五入为整数),则也是如此。
所以在And
和Or
论据中,副作用和错误是无法避免的,但是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满员的情况下,您才能通过条件。