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 and
operació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:
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 Boolean
s. 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 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 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:
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 Variant
subtipo 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 AND
funció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 textoenvalores de celda o celdas vacías, dichos valores se ignoran.Pero si TODOS los argumentos contienenvalores de textoenvalores 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 A1
tiene 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.
pero se poneextraño...
Sicualquierde los argumentos es un error, entonces
AND
devolverá 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