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

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

Tengo la celda B2 en blanco.

=ESBLANCO(B2)da VERDADERO

Una prueba lógica simple devuelve FALSO

=SI(B2,VERDADERO,FALSO)da FALSO

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

=Y(B2,VERDADERO)da VERDADERO

Por supuesto, cuando se usa indirectamente en una declaración AND, todavía devuelve FALSO

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

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

Respuesta1

Extraído deaquí, busca la sección tituladaFunciones lógicas de Excel: hechos y cifras:

En Excel, cuando utiliza funciones lógicas (Y, XOR, NO, O), si alguno de los argumentos contiene valores de texto oceldas vacias, dichos valores se ignoran.

Respuesta2

TL;DR- Es un artefacto de cómo Excel almacena e intercambia internamente el contenido de las celdas. 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 distintos de cero.

El comportamiento de AND()(y de todas las demás funciones lógicas) es convertir ambos argumentos en booleanos y luego realizar una andoperación lógica con ellos. Puede abrir 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 Explorador de objetos

Tenga en cuenta que devuelve un Boolean,noa Variant. Esto significa que en algún momento durante el proceso de evaluación de la función,todos los argumentos deben convertirse a Booleans. El comportamiento real observado indica que esto se hace en las primeras etapas del procesamiento: Excel intenta ser fácil de usar al intentar convertir todos los argumentos y utilizar elconvertidovalores 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 probar una celda en blanco? La respuesta a esto radica en cómo Excel almacena internamente el contenido de una celda. Nuevamente, el modelo de objetos de Excel es esclarecedor:

Valor de celda en el Explorador de objetos

Tenga en cuenta que es un COMEstructura VARIANTE. Esta estructura contiene básicamente 2 partes: un tipo, que le indica al código que lo utiliza cómo interpretarlo, y un área de datos. Una celda sin contenido en Excel tendrá un "valor" representado por un Variantsubtipo VT_EMPTY. Nuevamente, 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 ser Falso, similar a cómo los lenguajes de programación suelen tratar el cero:

Sub DemoMacro2()
    MsgBox CBool(vbEmpty)
End Sub

Puedes ver el mismo comportamiento alomitiendoargumentos por completo:

=AND(,)

...es lo mismo que...

=AND({vbEmpty},{vbEmpty})

...que es lo mismo que...

=AND(0,0)

...cual es:

=AND(FALSE,FALSE)

Respuesta3

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

Si algunapero no todosde los argumentos contienen valores de texto envalores de celda o celdas vacías, dichos valores se ignoran.Pero si TODOS los argumentos contienen valores de texto envalores 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, a diferencia del texto de una referencia de celda, entonces el resultado es#VALUE!

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

ingrese la descripción de la imagen aquí

pero se poneextraño...

Sicualquierde los argumentos es un error, entonces ANDdevolverá elprimeroerror.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!

Respuesta4

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

=AND(B2,TRUE) debería ser que
=AND(B2="",TRUE)tenga que escribir el valor (B2 vacío devuelve Verdadero) y el segundo lógico es Verdadero y devolverá Verdadero
=IF(B2,TRUE,FALSE)debería ser =IF(B2="",TRUE,FALSE)dará Verdadero
=AND(IF(B2,TRUE,FALSE),TRUE)debería ser =AND(IF(B2="",TRUE,FALSE),TRUE)dará Verdadero
Intente siempre escribir todas las pruebas y no crea que Excel lo hará.
Recuerde siempre Logical Test, en sus fórmulas no pruebe para B2
Cómo utilizar la función SI
Excel y función

información relacionada