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?