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 and
opé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:
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 Boolean
s . 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 String
valeurs "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:
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 Variant
avec 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 AND
fonction 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)