Y también / OrElse en VBA

Estoy tratando de obtener una evaluación perezosa con ‘Y’ en mi macro de Excel haciendo lo siguiente:

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

Sé que existe una evaluación AndAlso en VB.NET como AndAlso y OrElse pero no puedo encontrar nada similar en VBA. Si no existe evaluación diferida en VBA, ¿cuál es la mejor manera de estructurar el código para que se evalúe de la manera que espero?

El único cortocircuito (de un tipo) está dentro de Case evaluación de la expresión de Case , por lo que la siguiente afirmación desgarbada hace lo que creo que estás preguntando;

 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 

Esta es una vieja pregunta, pero este problema todavía está vivo y bien. Una solución que he usado:

 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 

Esto básicamente invierte la lógica en la pregunta original, pero obtienes el mismo resultado. Creo que es una solución más limpia que las otras aquí que solo usan sentencias If . La solución que utiliza una instrucción Select es inteligente, pero si desea una alternativa que solo use sentencias If , creo que esta es la que debe usar.

O puede crear una función que tome su objeto como parámetro y devuelva booleano para cualquier caso. A eso es a lo que suelo acostumbrarme.

es decir

 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 Not myObject Is Nothing Then If myObject.test() Then 'do something' End If Else 'do something else' End If 

Creo que esa es la forma en que debes hacerlo.

Editar

Quizás así

 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 

¿No es genial VBA?

Dado que la siguiente syntax funciona

 If myObject.test() Then do something 

Tu podrías intentar

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

Por supuesto, si quiere ‘hacer otra cosa’ si myObject Is Nothing, entonces esto puede no funcionar.

Mejorando en esta respuesta a una pregunta diferente sobre el mismo problema básico, esto es lo que elegí hacer:

 dim conditionsValid as boolean conditionsValid = myObject Is Nothing if conditionsValid then conditionsValid = myObject.test() if conditionsValid then conditionsValid = myObject.anotherTest() if conditionsValid then 'do something' else 'do something else' end if 

Creo que este código es más claro que las otras respuestas que se han sugerido, y usted (generalmente) no necesita una variable diferente para cada validación, que es la mejora sobre la respuesta original a la otra pregunta. Por cierto, cada nueva condición que necesita agrega solo una línea más de código.