49 votes

L'opérateur "Et" de VBA évalue-t-il le deuxième argument lorsque le premier est faux ?

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'une certaine sous-chaîne (bar, dans ce cas) avant le (.

Le cas qui me pose problème est celui où la cellule passée dans la fonction est vide, où thisCell.hasFormula est fausse, mais où l'instruction après le et est toujours évaluée. Cela me donne une erreur d'indice hors de portée au moment de l'exécution.

VBA continue-t-il réellement à évaluer le second argument de la fonction And, même si le premier est faux ?

0voto

Moreno Points 331

Je pense que c'est la meilleure pratique :

sub my conditions()
        If Condition1=constraint1 then
         if Condition2=constraint2 then
          if condition3=constraint3 then
           ...
            ....
        end if
         end if
          end if
    else
      end if
           ....
    end if
end sub

Ainsi, vous ne passerez par les conditions que si et seulement si la condition i est remplie.

-1voto

Harry S Points 381

Considérez le code machine qui doit être exécuté. Le plus rapide devrait être un mélange de code comme...

si sfsf alors aller à SkipAB

si fdf alors goto goneBad

si dffdefedwf then goto MustHave

SkipAB : si dsda > 4 alors MustHave

GoneBad : fonction de sortie

MustHave : ThisIS = true

ne permet d'économiser que quelques instants lorsque le programme doit le parcourir plusieurs milliers de fois ... par exemple, la recherche d'un fichier sur un grand disque dur ou quand un simple test booléen est utilisé pour sauter une fonction qui prend beaucoup de temps comme trouver toutes les feuilles et tous les noms dans une feuille de calcul fermée. [code]

     If Not wFF.UsingFileExtMatch Then GoTo SkipExt
                If Not wFF.OKFileEXTMatch Then GoTo BADFile

SkipExt : Si ce n'est pas wFF.UsingFileNameMatch alors aller à SkipFileMatch If Not wFF.OKFileNameMatch Then GoTo BADFile SkipFileMatch : If Not wFF.UsingDaysAgo Then GoTo SkipDaysAgo If Not wFF.OKDaysAgo Then GoTo BADFile SkipDaysAgo :

[/code]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X