web-dev-qa-db-fra.com

AndAlso/OrElse à VBA

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?

37
Luis

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
50
Alex K.

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.

11
neizan

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
3
William

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)
0
W. Nema

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.

0
Brian Cohan

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. 

0
carlossierra
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?

0
Dick Kusleika