La fonction AND donne un VRAI résultat pour une cellule vide, BLANK - pourquoi?

31

J'ai une cellule B2 vierge.

= ISBLANK (B2) donne VRAI

Un simple test logique dessus renvoie FAUX

= SI (B2, VRAI, FAUX) donne FAUX

Pourtant, lorsqu'il est directement utilisé dans une instruction AND, il renvoie VRAI

= ET (B2, VRAI) donne VRAI

Bien sûr, lorsqu'il est indirectement utilisé dans une instruction AND, il renvoie toujours FALSE

= ET (SI (B2, VRAI, FAUX), VRAI) donne FAUX

Pourriez-vous m'expliquer pourquoi mon Excel se comporte de cette façon?

pulsar3424
la source

Réponses:

41

Extrait d' ici , recherchez la section intitulée Fonctions logiques Excel - faits et chiffres :

Dans Excel lorsque vous utilisez des fonctions logiques (AND, XOR, NOT, OR), si l'un des arguments contient des valeurs de texte ou des cellules vides , ces valeurs sont ignorées.

jcbermu
la source
2
C'est super à savoir !!
L'élève de Gary
2
Peut-être pourriez-vous ajouter la règle couvrant l'expression IF(B2,TRUE,FALSE)? En outre, j'espérais que les conjonctions et les disjonctions logiquement correctes (mais un peu contre-intuitives) des ensembles vides résultants seraient retournées, c'est AND(B2)-à- dire qu'elles seraient vraies alors OR(B2)qu'elles étaient fausses, mais l'expérimentation montre qu'elles renvoient une erreur.
PJTraill
2
si certains des arguments, mais pas TOUS, contiennent des valeurs de texte ou des cellules vides, ces valeurs sont ignorées. Mais si TOUS les arguments contiennent des valeurs de texte ou des cellules vides, la fonction renvoie #VALUE!
ThunderFrame
Bonne réponse. Le commentaire de @ ThunderFrame est également primordial.
Raystafarian
Il y a une autre mise en garde. Il existe une différence entre le texte transmis en tant que référence de cellule et le texte transmis en tant que littéral de chaîne. Voir ma réponse pour plus de détails.
ThunderFrame
6

TL; DR - C'est un artefact de la façon dont Excel stocke et échange le contenu des cellules en interne. Une cellule vide est un VARIANT sans valeur, qui se transforme en FAUX en raison de la façon dont les langages de programmation traitent la véracité des valeurs nulles et non nulles.

Le comportement de AND()(et de toutes les autres fonctions logiques) consiste à convertir les deux arguments en booléens, puis à effectuer une andopération logique sur eux. Vous pouvez retirer les couvertures et voir comment il est défini dans le modèle d'objet Excel à l'aide de l'Explorateur d'objets de Visual Basic Editor:

ET dans l'Explorateur d'objets

Notez qu'il renvoie un Boolean, pas un Variant. Cela signifie qu'à un certain moment du processus d'évaluation de la fonction, tous les arguments doivent être convertis en Booleans . Le comportement réel observé indique que cela est fait au début du traitement - Excel essaie d'être convivial en tentant de convertir tous les arguments et en utilisant les valeurs converties dans le calcul s'il réussit. Cela peut être démontré en passant les Stringvaleurs "True" et "False" à la fonction:

=AND("true","true") <---Results in TRUE
=AND("false","true") <---Results in FALSE
Etc.

Cela peut également être démontré avec des arguments numériques - il traite toute valeur non nulle comme vraie et zéro comme fausse:

=AND(42,-42) <---Results in TRUE
=AND(0,0) <---Results in FALSE
=AND(42,0) <---Results in FALSE
Etc.

Il a le même comportement dans les combinaisons:

=AND("false",0) <---Results in FALSE
Etc.

Vous devriez maintenant avoir l'image. Alors, comment cela se rapporte-t-il au test d'une cellule vide? La réponse à cela réside dans la façon dont Excel stocke le contenu d'une cellule en interne. Encore une fois, le modèle d'objet Excel est éclairant:

Valeur de cellule dans l'Explorateur d'objets

Notez qu'il s'agit d'une structure COM VARIANT . Cette structure contient essentiellement 2 parties - un type, qui indique au code l'utilisant comment l'interpréter, et une zone de données. Une cellule sans contenu dans Excel aura une "valeur" qui est représentée par un Variantavec le sous-type VT_EMPTY. Encore une fois, cela peut être confirmé par une macro:

Sub DemoMacro()
    'Displays "True" if cell A1 on the active sheet has no contents.
    MsgBox Range("A1").Value2 = vbEmpty
End Sub

Alors, que se passe-t-il lorsque la ANDfonction convertit cela en un Boolean? Bonne question! Cela se trouve être faux, semblable à la façon dont les langages de programmation traitent généralement zéro:

Sub DemoMacro2()
    MsgBox CBool(vbEmpty)
End Sub

Vous pouvez voir le même comportement en omettant complètement les arguments:

=AND(,)

... c'est la même chose que ...

=AND({vbEmpty},{vbEmpty})

... qui est le même que ...

=AND(0,0)

...lequel est:

=AND(FALSE,FALSE)
Comintern
la source
1
Mais l'OP signale qu'un argument de cellule vide est traité comme Vrai, pas (comme vous le dites) Faux.
nekomatic
@nekomatic - J'ai raté cette partie. Modifier à venir.
Comintern
Si A1 contient: TRUEet B1 contient du texte précédé d'une apostrophe:, 'FALSEalors =AND(A1,B1)renvoie VRAI. mwa-ha-ha-ha.
ThunderFrame
Pas la bonne réponse dans ce cas, mais une belle explication générale de l'évaluation des fonctions néanmoins. Traitez ce commentaire comme un +1.
mtone
@ThunderFrame: Quel est votre point? Si A1 contient TRUEet B1 contient n'importe quelle valeur de texte (y compris une chaîne vide) , =AND(A1,B1)retourne TRUE.
Scott
2

Selon mon commentaire sur la réponse de @ jcbermu, avec une petite correction:

Si certains mais pas TOUS les arguments contiennent des valeurs de texte dans des valeurs de cellule ou des cellules vides, ces valeurs sont ignorées. Mais si TOUS les arguments contiennent des valeurs de texte dans des valeurs de cellule ou des cellules vides, la fonction renvoie#VALUE!

Avec la correction impliquant:

Si un ou plusieurs des arguments sont du texte à partir d'un littéral de chaîne, par opposition au texte dans une référence de cellule, le résultat est #VALUE!

Autrement dit, si la cellule A1a la valeur "abc", puis =AND(A1,TRUE)retourne TRUE, mais =AND("abc",TRUE) revient #VALUE!. Voir les lignes 9 à 13 dans l'image ci-dessous.

entrez la description de l'image ici

Mais ça devient plus étrange ...

Si l' un des arguments est une erreur, alors ANDretournera la première erreur. Sauf que si l'un des arguments est un littéral de chaîne, la valeur de retour est#VALUE!

=AND(TRUE,TRUE,"abc") = #VALUE!

=AND(1/0,foo(),TRUE) = #DIV/0!

=AND(foo(),1/0,TRUE) = #NAME?

=AND(1/0,foo(),"abc",TRUE) = #VALUE!

=AND(foo(),1/0,"abc",TRUE) = #VALUE!

ThunderFrame
la source
0

=ISBLANK(B2)
donne VRAI si B2 est vide, pas d'espace vide

=AND(B2,TRUE) devrait être
=AND(B2="",TRUE)vous devez écrire la valeur (B2 vide retourne True) et la deuxième logique est True et retournera True
=IF(B2,TRUE,FALSE)devrait être =IF(B2="",TRUE,FALSE)donnera True
=AND(IF(B2,TRUE,FALSE),TRUE)devrait être =AND(IF(B2="",TRUE,FALSE),TRUE)donnera True
Essayez toujours d'écrire tout le test et ne pensez pas qu'Excel fera l'affaire.
Rappelez-vous toujours que Logical Test, dans vos formules, ne testez pas B2
Comment utiliser la fonction IF
Excel AND Function


la source
8
Je pense que vous avez manqué le point OP. Le = ISBLANK (B2) est juste pour prouver que la cellule B2 est vide. Le = ET (B2, VRAI) est destiné à tester la valeur booléenne de la cellule B2. Ensuite, la seule façon d'évaluer cela à TRUE est si la cellule B2 est évaluée à TRUE. Ceci est ensuite contredit par le test suivant, = IF (B2, TRUE, FALSE) retournant FALSE. C'est une question géniale car je ne savais pas qu'Excel ignore certaines valeurs de cellule au lieu de les évaluer en valeur booléenne (VRAI ou FAUX).
linhartr22
6
Pourquoi est-ce voté? AND(B2,TRUE)ne devrait certainement pas être AND(B2="",TRUE)dans le contexte de la question.
Dmitry Grigoryev