La función AND da un resultado VERDADERO para una celda vacía, EN BLANCO, ¿por qué?

31

Tengo una celda B2 en blanco.

= ISBLANK (B2) da VERDADERO

Una simple prueba lógica en él devuelve FALSO

= SI (B2, VERDADERO, FALSO) da FALSO

Sin embargo, cuando se usa directamente en una instrucción AND, devuelve VERDADERO

= Y (B2, VERDADERO) da VERDADERO

Por supuesto, cuando se usa indirectamente en una declaración AND, aún devuelve FALSE

= Y (SI (B2, VERDADERO, FALSO), VERDADERO) da FALSO

¿Podría explicarme por qué mi Excel se comporta de esa manera?

pulsar3424
fuente

Respuestas:

41

Extraído de aquí , busque la sección titulada Funciones lógicas de Excel: hechos y cifras :

En Excel cuando usa funciones lógicas (AND, XOR, NOT, OR), si alguno de los argumentos contiene valores de texto o celdas vacías , dichos valores se ignoran.

jcbermu
fuente
2
¡Esto es genial saberlo!
Estudiante de Gary
2
¿Quizás podrías agregar la regla que cubre la expresión IF(B2,TRUE,FALSE)? Además, esperaba que se devolvieran las conjunciones y disyunciones lógicamente correctas (pero un poco contra-intuitivas) de los conjuntos vacíos resultantes, es decir, AND(B2)serían verdaderas mientras que fueran OR(B2)falsas, pero la experimentación muestra que devuelven un error.
PJTraill
2
si alguno pero no TODOS los argumentos contienen valores de texto o celdas vacías, dichos valores se ignoran. Pero si TODOS los argumentos contienen valores de texto o celdas vacías, la función devuelve # ¡VALOR!
ThunderFrame
Buena respuesta. El comentario de @ ThunderFrame también es primordial.
Raystafarian
Hay una advertencia más. Hay una diferencia entre el texto pasado como referencia de celda, en oposición al texto pasado como un literal de cadena. Vea mi respuesta para más detalles.
ThunderFrame
6

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 andoperació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:

Y en el buscador de objetos

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 Booleans . 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 Stringvalores "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:

Valor de celda en el buscador de objetos

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 Variantcon 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 ANDfunció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)
Comintern
fuente
1
Pero el OP informa que un argumento de celda vacía se trata como Verdadero, no (como usted dice) Falso.
nekomatic
@nekomatic: me perdí esa parte. Editar viene.
Comintern
Si A1 contiene: TRUEy B1 contiene texto precedido por un apóstrofe:, 'FALSEentonces =AND(A1,B1)devuelve VERDADERO. mwa-ha-ha-ha.
ThunderFrame
No es la respuesta correcta en este caso, pero una buena explicación general de la evaluación de funciones, no obstante. Trata este comentario como un +1.
mtone
@ ThunderFrame: ¿Cuál es tu punto? Si A1 contiene TRUE, y B1 contiene cualquier valor de texto (incluyendo una cadena vacía) , entonces =AND(A1,B1)regresa TRUE.
Scott, el
2

Según mi comentario sobre la respuesta de @ jcbermu, con una pequeña corrección:

Si alguno pero no TODOS los argumentos contienen valores de texto en valores de celda o celdas vacías, dichos valores se ignoran. Pero si TODOS los argumentos contienen valores de texto en valores de celda o celdas vacías, la función devuelve#VALUE!

Con la corrección implicando:

Si uno o más de los argumentos es texto de un literal de cadena, en oposición al texto en una referencia de celda, entonces el resultado es #VALUE!

Es decir, si la celda A1tiene el valor "abc", entonces =AND(A1,TRUE)regresa TRUE, pero =AND("abc",TRUE) regresa #VALUE!. Vea las filas 9 a 13 en la imagen a continuación.

ingrese la descripción de la imagen aquí

Pero se vuelve más extraño ...

Si alguno de los argumentos es un error, ANDdevolverá el primer error. Excepto , si alguno de los argumentos es un literal de cadena, entonces el valor de retorno es#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
fuente
0

=ISBLANK(B2)
da VERDADERO si B2 está vacío, no espacio en blanco

=AND(B2,TRUE) debe ser
=AND(B2="",TRUE)que debe escribir el valor (B2 vacío devuelve Verdadero) y el segundo lógico es Verdadero y devolverá Verdadero
=IF(B2,TRUE,FALSE)debe =IF(B2="",TRUE,FALSE)dar Verdadero
=AND(IF(B2,TRUE,FALSE),TRUE)debe =AND(IF(B2="",TRUE,FALSE),TRUE)dar Verdadero
Intente siempre escribir toda la prueba y no piense que Excel lo hará.
Recuerde siempre el Logical Test, en sus fórmulas no prueba para B2
Cómo usar la función IF
Excel AND Function


fuente
8
Creo que te perdiste el punto de OP. El = ISBLANK (B2) es solo para probar que la celda B2 está en blanco. El = Y (B2, VERDADERO) está destinado a probar el valor booleano de la celda B2. Entonces, la única forma en que esto se evalúa como VERDADERO es si la celda B2 se evalúa como VERDADERO. Esto se contradice con la siguiente prueba, = IF (B2, TRUE, FALSE) que devuelve FALSE. Esta es una pregunta increíble ya que no sabía que Excel ignora algunos valores de celda en lugar de evaluarlos en un valor booleano (VERDADERO o FALSO).
linhartr22
66
¿Por qué se vota esto? AND(B2,TRUE)definitivamente no debería estar AND(B2="",TRUE)en el contexto de la pregunta.
Dmitry Grigoryev