还有/或在VBA中

我试图通过执行以下操作在Excelmacros中获得“And”的懒惰评估:

If Not myObject Is Nothing *And* myObject.test() Then 'do something' Else 'do something else' End If 

我知道在VB.NET中存在的懒惰评价为AndAlsoOrElse但在VBA中找不到类似的东西。 如果在VBA中不存在懒惰的评估,那么构build代码的最好方法是什么,以便评估我期望的方式?

唯一的短路(一类)在Caseexpression式评估中,所以下面这些不明确的陈述就是我所想的。

 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不是很好吗?