AndAlso/OrElse en VBA
Je vais essayer d'obtenir une évaluation différée " 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 évaluation différée existe dans VB.NET comme AndAlso
et OrElse
mais ne peut pas trouver quelque chose de semblable dans VBA. Si l'évaluation différée n'existe pas en VBA, quelle est la meilleure façon de structurer le code de sorte qu'il permettra d'évaluer la façon dont je m'attendre?
- VBA comme la plaine de VB6 ne pas avoir de court-circuit de l'évaluation
- Merci, j'ai résolu mon problème sans trouver de solution à cela, mais je suis toujours curieux de savoir quoi faire de cette situation. Je ne serais pas surpris si je suis absent quelque chose de vraiment évident, mais je ne peux pas trouver un bon moyen de le faire sans avoir à réécrire le code, c'est à dire le même code dans deux autre cas.
Vous devez vous connecter pour publier un commentaire.
Le seul court-circuit (une sorte de) est dans
Case
l'évaluation de l'expression, donc la suite déhanchée déclaration n'est, je pense, ce que vous demandez;C'est une vieille question, mais cette question est encore bien vivant. Une solution de contournement que j'ai utilisé:
En fait cela inverse la logique dans la question d'origine, mais vous obtenez le même résultat. Je pense que c'est une solution plus propre que les autres ici qui utilisent uniquement
If
consolidés. La solution à l'aide d'unSelect
déclaration est intelligent, mais si vous voulez une alternative à l'aide de seulementIf
déclarations, je pense que c'est le seul à utiliser.Ou vous pouvez créer une fonction qui prend votre objet en tant que paramètre et retourne un booléen pour les deux cas. C'est ce que j'ai l'habitude d'.
c'est à dire
Not objMyAwesomeObject Is Nothing
évalue àTrue
, puis la premièreElseIf
déclaration ne sera jamais exécuter. Toutefois, siNot objMyAwesomeObject Is Nothing
= False (objMyAwesomeObject Is Nothing
= True), alors la premièreElseIf
instruction est exécutée et déclenche une erreur parce que vous essayez d'accéder à une propriété surobjMyAwesomeObject
quiIs Nothing
.Depuis la syntaxe suivante œuvres
Ensuite, une doublure de syntaxe peut être utilisée pour de court-circuit de l'évaluation. Ci-dessous, la première
If
instruction s'assure quemyObject
est quelque chose. Sinon, il n'essaye même pas d'évaluer le secondIf
.Bien sûr, si vous voulez "faire quelque chose d'autre" si monobjet Est Rien, alors cela peut ne pas fonctionner.
If
s ici, un pourNot myObject Is Nothing
, et la seconde pourmyObject.test()
. Mais, comme la premièreIf
déclaration est dans le une doublure format, le contenu de la premièreIf
(qui est la deuxièmeIf
) ne peut pas s'étendre à plus d'une ligne.If
déclaration. Je l'ai expliqué dans mon commentaire précédent que one-linerIf
s ne peut pas s'étendre sur plusieurs lignes! 😀Je pense que c'est la façon dont vous avez à faire.
Modifier
Peut-être comme ce
N'est pas VBA grande?
Else 'do something else'
.something else
de se produire si myObject n'est pas Rien, maismyObject.test()
renvoie la valeur False.Améliorer cette réponse à une question sur le même problème de base, voici ce que j'ai choisi de faire:
Je pense que ce code est plus clair que les autres réponses qui ont été proposés, et vous (en général) n'ont pas besoin d'une variable différente pour chaque validation, qui est l'amélioration par rapport à l'original de la réponse à l'autre question. Par la façon dont, à chaque nouvelle condition, vous devez ajoute simplement une ligne de code.
Un truc autour de valeurs manquantes peut aider: