TL; DR : es un artefacto de cómo Excel almacena e intercambia el contenido de la celda internamente. Una celda vacía es una VARIANTE sin valor, que se convierte en FALSO debido a cómo los lenguajes de programación tratan la veracidad de los valores cero y no cero.
El comportamiento de AND()
(y todas las demás funciones lógicas) es convertir ambos argumentos en booleanos y luego realizar una and
operación lógica en ellos. Puede retirar las cubiertas y ver cómo se define en el modelo de objetos de Excel utilizando el Explorador de objetos del Editor de Visual Basic:
Tenga en cuenta que devuelve a Boolean
, no a Variant
. Esto significa que en algún momento durante el proceso de evaluación de la función, todos los argumentos tienen que convertirse a Boolean
s . El comportamiento real observado indica que esto se hace temprano en el procesamiento: Excel intenta ser fácil de usar al intentar convertir todos los argumentos y usar los valores convertidos en el cálculo si tiene éxito. Esto se puede demostrar pasando los String
valores "Verdadero" y "Falso" a la función:
=AND("true","true") <---Results in TRUE
=AND("false","true") <---Results in FALSE
Etc.
También se puede demostrar con argumentos numéricos: trata cualquier valor distinto de cero como verdadero y cero como falso:
=AND(42,-42) <---Results in TRUE
=AND(0,0) <---Results in FALSE
=AND(42,0) <---Results in FALSE
Etc.
Tiene el mismo comportamiento en combinaciones:
=AND("false",0) <---Results in FALSE
Etc.
A estas alturas ya deberías hacerte una idea. Entonces, ¿cómo se relaciona esto con la prueba de una celda en blanco? La respuesta a esto radica en cómo Excel almacena el contenido de una celda internamente. Nuevamente, el modelo de objetos de Excel es esclarecedor:
Tenga en cuenta que es una estructura COM VARIANT . Esta estructura básicamente contiene 2 partes: un tipo, que le dice al código que lo usa cómo interpretarlo, y un área de datos. Una celda sin contenido en Excel tendrá un "valor" representado por a Variant
con el subtipo VT_EMPTY
. De nuevo, esto se puede confirmar con una macro:
Sub DemoMacro()
'Displays "True" if cell A1 on the active sheet has no contents.
MsgBox Range("A1").Value2 = vbEmpty
End Sub
Entonces, ¿qué sucede cuando la AND
función convierte eso en a Boolean
? ¡Buena pregunta! Resulta que es falso, similar a cómo los lenguajes de programación suelen tratar cero:
Sub DemoMacro2()
MsgBox CBool(vbEmpty)
End Sub
Puede ver el mismo comportamiento omitiendo argumentos por completo:
=AND(,)
... es lo mismo que ...
=AND({vbEmpty},{vbEmpty})
... que es lo mismo que ...
=AND(0,0)
...cual es:
=AND(FALSE,FALSE)