
Eu tenho uma célula B2 em branco.
=ESTÁ EM BRANCO(B2)dá VERDADEIRO
Um teste lógico simples retorna FALSE
=SE(B2,VERDADEIRO,FALSO)dá FALSO
No entanto, quando usado diretamente em uma instrução AND, retorna TRUE
=E(B2,VERDADEIRO)dá VERDADEIRO
É claro que, quando usado indiretamente em uma instrução AND, ainda retorna FALSE
=E(SE(B2,VERDADEIRO,FALSO),VERDADEIRO)dá FALSO
Você poderia me explicar por que meu Excel se comporta dessa maneira?
Responder1
Extraído deaqui, procure a seção intituladaFunções lógicas do Excel - fatos e números:
No Excel, quando você estiver usando funções lógicas (AND, XOR, NOT, OR), se algum dos argumentos contiver valores de texto oucélulas vazias, tais valores são ignorados.
Responder2
DR- É um artefato de como o Excel armazena e troca conteúdo de células internamente. Uma célula vazia é uma VARIANT sem valor, que é convertida em FALSE devido à forma como as linguagens de programação tratam a veracidade de valores zero e diferentes de zero.
O comportamento de AND()
(e de todas as outras funções lógicas) é converter ambos os argumentos em booleanos e, em seguida, executar uma and
operação lógica neles. Você pode retirar as capas e dar uma olhada em como ele é definido no modelo de objeto do Excel usando o Navegador de objetos do Editor do Visual Basic:
Observe que ele retorna um Boolean
,nãoa Variant
. Isso significa que em algum momento durante o processo de avaliação da função,todos os argumentos devem ser convertidos para Boolean
s. O comportamento real observado indica que isso é feito no início do processamento - o Excel tenta ser amigável ao tentar converter todos os argumentos e usar o métodoconvertidovalores no cálculo se for bem-sucedido. Isso pode ser demonstrado passando os String
valores "True" e "False" para a função:
=AND("true","true") <---Results in TRUE
=AND("false","true") <---Results in FALSE
Etc.
Também pode ser demonstrado com argumentos numéricos - trata qualquer valor diferente de zero como verdadeiro e zero como falso:
=AND(42,-42) <---Results in TRUE
=AND(0,0) <---Results in FALSE
=AND(42,0) <---Results in FALSE
Etc.
Tem o mesmo comportamento em combinações:
=AND("false",0) <---Results in FALSE
Etc.
Agora você deve entender a imagem. Então, como isso se relaciona com o teste de uma célula em branco? A resposta está em como o Excel armazena o conteúdo de uma célula internamente. Novamente, o Modelo de Objetos do Excel é esclarecedor:
Observe que é um COMEstrutura VARIANTE. Esta estrutura contém basicamente 2 partes - um tipo, que informa ao código como interpretá-lo, e uma área de dados. Uma célula sem conteúdo no Excel terá um “valor” que é representado por um Variant
com o subtipo VT_EMPTY
. Novamente, isso pode ser confirmado com uma macro:
Sub DemoMacro()
'Displays "True" if cell A1 on the active sheet has no contents.
MsgBox Range("A1").Value2 = vbEmpty
End Sub
Então, o que acontece quando a AND
função converte isso em Boolean
? Boa pergunta! Acontece que é falso, semelhante a como as linguagens de programação normalmente tratam o zero:
Sub DemoMacro2()
MsgBox CBool(vbEmpty)
End Sub
Você pode ver o mesmo comportamento poromitindoargumentos inteiramente:
=AND(,)
...é a mesma coisa que...
=AND({vbEmpty},{vbEmpty})
...que é o mesmo que...
=AND(0,0)
...qual é:
=AND(FALSE,FALSE)
Responder3
Conforme meu comentário na resposta de @jcbermu, com uma pequena correção:
Caso existammas nem todosdos argumentos contêm
valores de textoemvalores de células ou células vazias, tais valores serão ignorados.Mas se TODOS os argumentos contiveremvalores de textoemvalores de células ou células vazias, a função retorna#VALUE!
Com a correção implicando:
Se um ou mais dos argumentos for texto de uma string literal, em oposição ao texto em uma referência de célula, o resultado será
#VALUE!
Ou seja, se a célula A1
tiver valor "abc", então =AND(A1,TRUE)
retorna TRUE
,mas =AND("abc",TRUE)
retorna #VALUE!
. Veja as linhas 9 a 13 na imagem abaixo.
Mas ficaestranho...
Sequalquerdos argumentos é um erro, então
AND
retornará oprimeiroerro.Exceto, se algum dos argumentos for um literal de string, o valor de retorno será#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!
Responder4
=ISBLANK(B2)
dá TRUE se B2 estiver vazio e não um espaço em branco
=AND(B2,TRUE)
deveria ser
=AND(B2="",TRUE)
você tem que escrever o valor (B2 vazio retorna True) e o 2º lógico é True e retornará True
=IF(B2,TRUE,FALSE)
deveria ser =IF(B2="",TRUE,FALSE)
dará True
=AND(IF(B2,TRUE,FALSE),TRUE)
deveria ser =AND(IF(B2="",TRUE,FALSE),TRUE)
dará True
Tente sempre escrever todo o teste e não pense que o Excel servirá.
Lembre-se sempre de que Logical Test
em suas fórmulas não teste para B2
Como usar a função SE
Excel E Função