Le VBA opérateur “Et” évaluer le deuxième argument lors de la première est fausse?
Function Foo(thiscell As Range) As Boolean
Foo = thiscell.hasFormula And (InStr(1, UCase(Split(thiscell.formula, Chr(40))(0)), "bar") > 0)
End Function
Cette fonction existe pour tester la présence d'un certain sous-chaîne (bar, dans ce cas) avant le (.
Le cas, je vais avoir des ennuis avec, c'est quand la cellule est passé dans la fonction est vide, le thisCell.hasFormula est faux, mais le résultat après et est toujours en cours d'évaluation. Cela me donne un indice en dehors de la plage d'erreur lors de l'exécution.
Ne VBA effectivement continuer à évaluer le second argument de la Et, même si le premier était faux?
- Notez que VBA
And
opérateur n'a pas de court-circuit, car c'est un opérateur au niveau du bit et pas logique. Voir: stackoverflow.com/questions/8042744/... - pas vrai - il va retourner un Booléen si ses arguments Booléens, de sorte qu'il supporte à la fois au niveau du bit et logique de l'opération. (bien sûr, vous pourriez argumenter que la logique est un cas particulier au niveau du bit à l'aide de 1-bit entiers, mais le point est que Microsoft pourrait avoir été pris en charge en court-circuit si ils ont choisi)
- intéressant. Tout ce temps j'ai été en supposant que 'Et' était qu'un opérateur au niveau du bit, bien que la simulation des opérations logiques, parce que 'True = -1' et 'False = 0'. Mais vous avez raison " Et " est un opérateur logique si les deux expressions passé sont de type Boolean. C'est seulement au niveau du bit si l'un ou les deux opérandes sont des nombres. Mais je suppose que ça ne peut pas court-circuit, car les deux expressions doivent être évalués de toute façon, afin de s'assurer que l'un ou les deux ne sont pas des numéros et non des booléens. Donc, je pense que "bitwiseness" ne conduisent à aucun court-circuit ici.
- Une autre chose que VBA prend en charge est de taper fort. A l'aide de Variantes est facultatif. Si les arguments en faveur d'un opérateur logique sont connus pour être de type Boolean au moment de la compilation, alors oui, il pourrait encore le support de court-circuit. Même avec des entiers, le bon argument pourrait être ignorées si la gauche l'argument de
Or
est la "1s" (&HFFFFFFFF
, ou-1&
), et de même pour laAnd
si la gauche argument est de 0. - C'est tout vrai. Il pourrait être un peu déroutant à bien. Je ne suis pas au courant de court-circuiter les opérateurs sur les bits dans d'autres langues. Aussi, VBA était sans doute en essayant de maintenir une compatibilité ascendante avec les anciennes versions de BASE. Mieux que d'ajouter de nouveaux opérateurs, comme MME a finalement pour VB.NET. (La BASE de l'ascendance de VBA montre dans d'autres endroits, par exemple, un de mes favoris: stackoverflow.com/questions/1070863/hidden-features-of-vba/...)
Vous devez vous connecter pour publier un commentaire.
Ce que vous cherchez est appelé "évaluation de court-circuit".
VBA ne l'a pas.
Vous pouvez voir une approche qui est probablement adaptable à votre situation ici.
L'approche qui a été choisie, il y impliquer à la substitution d'un
Select Case
pour laIf
. Il est aussi un exemple d'utilisation imbriquéeIfs
.Comme DOK mentionné: Non, VBA n'a pas de court-circuit d'évaluation.
Techniquement, il est plus efficace d'utiliser 2
If-then
consolidés au lieu d'utiliser leAND
de l'opérateur, mais sauf si vous faites beaucoup de fois, vous ne seriez pas l'avis de l'épargne, donc aller pour tout ce qui est plus lisible. Et si vous voulez vraiment faire de la technique, VBA gère plusieursIf-then
états plus vite queSelect Case
que de bien.VBA est bizarre 🙂
La réponse est oui, VBA ne pas court-circuiter l'évaluation.
Ce n'est pas seulement une question de style; il fait une grande différence dans ce genre de situation:
...ce qui est incorrect. De façon plus appropriée:
Ou si vous avez une aversion pour imbriquée fi:
VBA ne avoir un court-circuit comme comportement.
Normalement
Null
se propage à travers les expressions, par exemple.3 + Null
estNull
, etTrue And Null
estNull
.Cependant:
Ça ressemble à un court-circuit comportement - ce qui se passe?
Null
ne se propagent pas quand l'autre argument à une conjonction (And
) estFalse
ou0
- le résultat est tout simplementFalse
ou0
. Il n'a pas d'importance si c'est la gauche ou la droite argument. La même chose s'applique si l'autre argument à une disjonction (Or
) estTrue
ou un entier différent de zéro (une valeur à virgule flottante sera arrondi à un nombre entier à l'aide de cette règle).Donc les effets secondaires et les erreurs ne peut pas être évitée dans les arguments de
And
etOr
, maisNull
de propagation peuvent être "court-circuité". Ce comportement semble être hérité de SQL.A And B
And
. Vous pourriez peut-être mieux expliquer ce que vous êtes confus au sujet?False
et la seconde renvoieTrue
, il n'y a pas de court-circuit ici. Puis VBA fait un peu bizarre de moulage et de façon incohérente, renvoieFalse
ouNull
Je pense que c'est la meilleure pratique:
Ainsi vous serez à passaing dans des conditions si et seulement si la condition i est acquitta.
and
mot-clé dans une instruction conditionnelle "court-circuité" si la première condition est fausse. Êtes-vous répondre à cette question?Considérer le code machine qui a à exécuter.
La manière la plus rapide devrait être le long des lignes d'un mélange de code comme...
si sfsf then goto SkipAB
si dff then goto goneBad
si dffdefedwf then goto MustHave
SkipAB:
si dsda > 4 MustHave
GoneBad:
fonction de sortie
MustHave:
ThisIS = true
' enregistre seulement un quelques instants lorsque le programme doit courir à travers elle
plusieurs milliers de fois ... par exemple, la recherche de fichier d'un disque de grande taille
ou quand un simple Booléen test est utilisée pour passer un beaucoup de temps de la fonction
comme trouver toutes les feuilles et les noms dans un lieu fermé feuille de calcul
[code]
SkipExt:
Si Pas ffm.UsingFileNameMatch Then GoTo SkipFileMatch
Si Pas ffm.OKFileNameMatch Then GoTo Fichierdéfectueux
SkipFileMatch:
Si Pas ffm.UsingDaysAgo Then GoTo SkipDaysAgo
Si Pas ffm.OKDaysAgo Then GoTo Fichierdéfectueux
SkipDaysAgo:
[/code]