J'essaie d'obtenir une évaluation paresseuse avec "Et" dans ma macro Excel en procédant comme suit:
If Not myObject Is Nothing *And* myObject.test() Then
'do something'
Else
'do something else'
End If
Je sais que l'évaluation paresseuse existe dans VB.NET sous la forme AndAlso
et OrElse
, mais je ne trouve rien de semblable dans VBA. Si l'évaluation paresseuse n'existe pas dans VBA, quel est le meilleur moyen de structurer le code pour qu'il évalue comme je le souhaite?
Le seul court-circuit (d'une sorte) est dans l'évaluation de Case
, donc la déclaration non gaie suivante fait ce que je pense que vous demandez;
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
C'est une vieille question, mais cette question est toujours d'actualité. Une solution que j'ai utilisée:
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
Cela inverse la logique de la question initiale, mais vous obtenez le même résultat. Je pense que c'est une solution plus propre que les autres ici qui utilisent uniquement des déclarations If
. La solution utilisant une instruction Select
est astucieuse, mais si vous voulez une alternative utilisant uniquement des instructions If
, je pense que c’est celle-là à utiliser.
Vous pouvez également créer une fonction qui prend votre objet en tant que paramètre et renvoie un booléen dans les deux cas. C'est ce que j'ai l'habitude de faire.
c'est à dire.
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
Une astuce autour des valeurs manquantes peut aider:
Dim passed, wrongMaxPercent, wrongPercent, rightMinPercent, rightPercent
wrongPercent = 33
rightPercent = 55
'rightMinPercent = 56
wrongMaxPercent = 40
passed = (Len(wrongMaxPercent) = 0 Or wrongPercent < wrongMaxPercent) And _
(Len(rightMinPercent) = 0 Or rightPercent >= rightMinPercent)
Puisque la syntaxe suivante fonctionne
If myObject.test() Then do something
Tu pourrais essayer
If Not myObject Is Nothing Then If myObject.test() Then
'do something'
Else
'do something else'
End If
Bien sûr, si vous voulez "faire autre chose" si myObject n'est rien, cela risque de ne pas fonctionner.
Améliorant sur cette réponse à une question différente sur le même problème de base, voici ce que j'ai choisi de faire:
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
Je pense que ce code est plus clair que les autres réponses suggérées, et vous n'avez généralement pas besoin d'une variable différente pour chaque validation, ce qui représente une amélioration par rapport à la réponse d'origine à l'autre question. En passant, chaque nouvelle condition dont vous avez besoin n’ajoute qu’une ligne de code supplémentaire.
If Not myObject Is Nothing Then
If myObject.test() Then
'do something'
End If
Else
'do something else'
End If
Je pense que c'est comme ça que vous devez le faire.
Modifier
Peut-être comme ça
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
La VBA n'est-elle pas géniale?