2017-02-23 3 views
1

Vous avez un problème bizarre dans une instruction IF avec plusieurs conditions. La dernière version de travail ressemble à:VB6 déclaration IF multiple problème bizarre

If VAR1 = "SCRT" And InStr("|TEC|FIN|", "|" & VAR2 & "|")) And VAR3 = 1 Then 

Et maintenant, je mets en œuvre une autre condition à la déclaration:

If VAR1 = "SCRT" And InStr("|TEC|FIN|", "|" & VAR2 & "|")) And (VAR3 = 1 or VAR3 = 15) Then 

Avec ces valeurs: VAR1: "" (vide) VAR2: "FIN" VAR3: 1

Le code fonctionnera correctement dans le débogage. Le bizarre est la compilation et l'exécution sur l'environnement de production, la condition a passé même avec la première condition pas ok.

Déjà connecté les valeurs pour vérifier. L'environnement de production a les mêmes fichiers (bibliothèques).

La seule chose qui a changé en dehors de la condition est l'option explicite au début de ce module.

Merci!

+0

'Sur erreur Resume Next' et' VAR1' est nul? – wqw

+2

Instr retourne la position de la correspondance (1 ou 5 ou 0) L'opérateur And est bit à bit dans VB6 Une valeur TRUE est -1, donc tous les bits Vous devriez vérifier que le résultat de Instr est> 0. Cela retournera soit 0 soit -1 et votre expression sera plus correcte –

+0

J'ai vu ceci, mais dans ce cas, vb6 convertit implicitement une valeur> 0 en True –

Répondre

2

Sans vouloir vous offenser, c'est trop difficile à analyser, et sans raison valable. Lorsque vous traitez avec And conditions, vous êtes beaucoup mieux en utilisant If imbriqués s, en plaçant les conditions les plus probables et les premiers tests les plus chers dernière lorsque cela est possible. Cela est beaucoup plus claire, et presque certainement plus rapide:

If VAR1 = "SCRT" Then 
If InStr("|TEC|FIN|", "|" & VAR2 & "|")) > 0 Then 
    If (VAR3 = 1) or (VAR3 = 15) Then 

Cela permet à un court-circuit, qui est par ailleurs disponible dans VB6. Le code ne s'exécute pas simplement parce qu'il est sur une ligne. Deux changements: test If Instr > 0 plutôt que seulement If Instr. Oui, VB évaluera un test réussi à True/False, mais il n'évaluera jamais le Not de cette expression à False, qui vous mordra un jour. Crois le. (-:

Deuxième changement: je parens pour forcer l'ordre de priorité pour les conditions Or Il y a des règles, mais vous pourriez obtenir quelque chose comme If VAR3 = (1 Or VAR3) = 15 quand vous y attendez le moins être explicites et il n'y a pas de surprises

...
+0

La vérification> 0 est aussi une meilleure programmation 'défensive'. Comme il est plus explicite, un futur programmeur est moins susceptible de faire un changement qui le brise. – DaveInCaz

+0

Je simplifiais, mais ce n'est qu'une des nombreuses conditions dans une liste de règles. La vraie fonction a beaucoup d'autres et si je mets une condition à l'intérieur d'une autre, le code sera désordonné ... Premier changement: J'ai déjà mis le> 0 ... = D Deuxième changement: ne comprenait pas la condition 'Si VAR3 = (1 ou VAR3) = 15'. Pourquoi avez-vous mis les parens comme ça? Merci! –

+0

@FernandoMoreno - C'était juste un exemple du genre de problème que vous pourriez rencontrer si votre compréhension des règles de priorité ne sont pas les mêmes que celles du compilateur. Regardez dans le bloc de code pour ma recommandation réelle. Soyez explicite: ajoutez des parens pour forcer l'évaluation quand il pourrait y avoir confusion - ça ne fait jamais de mal, –