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 la And 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/...)
InformationsquelleAutor James | 2011-08-10