visual operador andalso vb.net vba

vb.net - visual - operador andalso



Y tambiƩn/OrElse en VBA (5)

Dado que la siguiente sintaxis 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.

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?