VBA中的AndAlso / OrElse

我正在尝试通过执行以下操作在Excel宏中使用'And'进行惰性评估:


If Not myObject Is Nothing *And* myObject.test() Then

    'do something'

Else

    'do something else'

End If

我知道VB.NET中存在惰性评估AndAlso,OrElse但是在VBA中找不到类似的评估。如果VBA中不存在惰性评估,那么构造代码的最佳方法是什么,以便它将评估我期望的方式?


子衿沉夜
浏览 732回答 3
3回答

慕标5832272

唯一的短路(某种程度上)是在Case表达式求值内,因此以下令人费解的语句可以满足我的要求。Select Case True    Case (myObject Is Nothing), Not myObject.test()        MsgBox "no instance or test == false"    Case Else        MsgBox "got instance & test == true"    End SelectEnd Sub

RISEBY

这是一个古老的问题,但是这个问题仍然存在。我使用的一种解决方法: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 IfIf success Then    ' Do stuff...Else    ' Do other stuff...End If这基本上颠倒了原始问题的逻辑,但是您得到的结果相同。我认为这是一个比仅使用If语句的解决方案更干净的解决方案。使用Select语句的解决方案很聪明,但是如果您只想使用If语句来替代,我认为这是可以使用的解决方案。

潇湘沐

或者,您可以创建一个将对象作为参数并返回布尔值的函数。那就是我通常的目的。即if Proceed(objMyAwesomeObject) then       'do some really neat stuff hereelse       'do something else, ehend if...end subprivate function Proceed(objMyAwesomeObject as Object)     if not objMyAweseomeObject is nothing then            Proceed = true     elseif objMyAwesomeObject.SomeProperty = SomeValue then            Proceed = true     else            Proceed = false     endifend function
打开App,查看更多内容
随时随地看视频慕课网APP