还有/或在VBA中
我试图通过执行以下操作在Excelmacros中获得“And”的懒惰评估:
If Not myObject Is Nothing *And* myObject.test() Then 'do something' Else 'do something else' End If
我知道在VB.NET中存在的懒惰评价为AndAlso
和OrElse
但在VBA中找不到类似的东西。 如果在VBA中不存在懒惰的评估,那么构build代码的最好方法是什么,以便评估我期望的方式?
唯一的短路(一类)在Case
expression式评估中,所以下面这些不明确的陈述就是我所想的。
Select Case True Case (myObject Is Nothing), Not myObject.test() MsgBox "no instance or test == false" Case Else MsgBox "got instance & test == true" End Select End Sub
这是一个古老的问题,但这个问题仍然存在。 我已经使用了一种解决方法:
Dim success As Boolean ' False by default. If myObj Is Nothing Then ' Object is nothing, success = False already, do nothing. ElseIf Not myObj.test() Then ' Test failed, success = False already, do nothing. Else: success = True ' Object is not nothing and test passed. End If If success Then ' Do stuff... Else ' Do other stuff... End If
这基本上颠倒了原来的问题的逻辑,但你得到了相同的结果。 我认为这是比其他人更清洁的解决scheme,只使用If
语句。 使用Select
语句的解决scheme很聪明,但是如果您想要一个只使用If
语句的替代scheme,我认为这是一个使用的方法。
或者你可以创build一个函数,将你的对象作为参数,并返回布尔值。 这就是我通常所说的。
即
if Proceed(objMyAwesomeObject) then 'do some really neat stuff here else 'do something else, eh end if ... end sub private function Proceed(objMyAwesomeObject as Object) if not objMyAweseomeObject is nothing then Proceed = true elseif objMyAwesomeObject.SomeProperty = SomeValue then Proceed = true else Proceed = false endif end function
由于下面的语法工作
If myObject.test() Then do something
你可以试试
If Not myObject Is Nothing Then If myObject.test() Then 'do something' Else 'do something else' End If
当然,如果你想'做别的事情'如果myObject是没有,那么这可能无法正常工作。
If Not myObject Is Nothing Then If myObject.test() Then 'do something' End If Else 'do something else' End If
我认为这是你必须这样做的方式。
编辑
也许这样
Dim bTestsFailed as Boolean bTestsFailed = False If Not myObject Is Nothing Then If myObject.test() Then 'do something' Else bTestsFailed = True End If Else bTestsFailed = True End If If bTestsFailed Then 'do something else End If
VBA不是很好吗?