A função AND fornece um resultado VERDADEIRO para a célula EM BRANCO vazia - por quê?

31

Eu tenho uma célula B2 em branco.

= ISBLANK (B2) fornece VERDADEIRO

Um teste lógico simples retorna FALSE

= SE (B2, VERDADEIRO, FALSO) indica FALSO

No entanto, quando usado diretamente em uma instrução AND, ele retorna TRUE

= AND (B2, TRUE) fornece TRUE

Obviamente, quando usado indiretamente em uma declaração AND, ele ainda retorna FALSE

= AND (SE (B2; VERDADEIRO; FALSO); VERDADEIRO) indica FALSO

Você poderia me explicar por que meu Excel se comporta dessa maneira?

pulsar3424
fonte

Respostas:

41

Extraído daqui , procure a seção intitulada Funções lógicas do Excel - fatos e números :

No Excel, quando você estiver usando funções lógicas (AND, XOR, NOT ou OR), se algum dos argumentos contiver valores de texto ou células vazias , esses valores serão ignorados.

jcbermu
fonte
2
Isso é ótimo saber !!
Gary Student
2
Talvez você possa adicionar a regra que cobre a expressão IF(B2,TRUE,FALSE)? Além disso, eu esperava que as conjunções e disjunções logicamente corretas (mas um pouco contra-intuitivas) dos conjuntos vazios resultantes fossem retornadas, ou seja AND(B2), fossem verdadeiras enquanto OR(B2)fossem falsas, mas a experimentação mostra que elas retornam um erro.
PJTraill
2
se algum, mas não TODOS, os argumentos contiverem valores de texto ou células vazias, esses valores serão ignorados. Mas se TODOS os argumentos contiverem valores de texto ou células vazias, a função retornará #VALUE!
ThunderFrame
Boa resposta. O comentário do @ ThunderFrame também é fundamental.
Raystafarian
Há mais uma ressalva. Há uma diferença entre o texto passado como uma referência de célula, em oposição ao texto passado como uma string literal. Veja minha resposta para detalhes.
ThunderFrame 03/09
6

TL; DR - É um artefato de como o Excel armazena e troca o conteúdo da célula internamente. Uma célula vazia é uma VARIANTE sem valor, que se converte em FALSE devido a como as linguagens de programação tratam a veracidade dos valores zero e não zero.

O comportamento de AND()(e de todas as outras funções lógicas) é converter os dois argumentos em booleanos e executar uma andoperação lógica neles. Você pode retirar as capas e ver como elas são definidas no modelo de objeto do Excel usando o Navegador de objetos do Editor do Visual Basic:

E no Pesquisador de Objetos

Observe que ele retorna a Boolean, não a Variant. Isso significa que, em algum momento do processo de avaliação da função, todos os argumentos devem ser convertidos em Booleans . 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 os valores convertidos no cálculo, se for bem-sucedido. Isso pode ser demonstrado passando os Stringvalores "Verdadeiro" e "Falso" 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.

Até agora você deve ter uma ideia. Então, como isso se relaciona ao teste de uma célula em branco? A resposta para isso está em como o Excel armazena o conteúdo de uma célula internamente. Novamente, o Modelo de Objetos do Excel é esclarecedor:

Valor da célula no Pesquisador de Objetos

Observe que é uma estrutura COM VARIANT . Essa estrutura basicamente contém 2 partes - um tipo, que informa ao código que o usa como interpretá-lo e uma área de dados. Uma célula sem conteúdo no Excel terá um "valor" representado por a Variantcom 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 ANDfunção converte isso em a Boolean? Boa pergunta! Por acaso, é False, semelhante a como as linguagens de programação normalmente tratam zero:

Sub DemoMacro2()
    MsgBox CBool(vbEmpty)
End Sub

Você pode ver o mesmo comportamento omitindo argumentos completamente:

=AND(,)

... é a mesma coisa que ...

=AND({vbEmpty},{vbEmpty})

... que é o mesmo que ...

=AND(0,0)

...qual é:

=AND(FALSE,FALSE)
Comintern
fonte
11
Mas o OP informa que um argumento de célula vazia é tratado como Verdadeiro, não (como você diz) Falso.
1/16 nekomatic
@nekomatic - eu perdi essa parte. Edite em breve.
Comintern
Se A1 contém: TRUEe B1 contém texto precedida por um apóstrofo: 'FALSE, em seguida, =AND(A1,B1)retorna TRUE. mwa-ha-ha-ha.
ThunderFrame
Não é a resposta correta neste caso, mas uma boa explicação geral da avaliação da função. Trate este comentário como um +1.
mtone 3/09/16
@ThunderFrame: Qual é o seu ponto? Se A1 contiver TRUEe B1 contiver qualquer valor de texto (incluindo uma sequência vazia) , =AND(A1,B1)retornará TRUE.
Scott
2

Conforme meu comentário na resposta de @ jcbermu, com uma pequena correção:

Se algum, mas não TODOS, os argumentos contiverem valores de texto em valores de células ou células vazias, esses valores serão ignorados. Mas se TODOS os argumentos contiverem valores de texto em valores de células ou células vazias, a função retornará#VALUE!

Com a correção implicando:

Se um ou mais argumentos forem texto de uma cadeia de caracteres literal, em oposição ao texto em uma referência de célula, o resultado será #VALUE!

Ou seja, se a célula A1tiver o valor "abc", =AND(A1,TRUE)retornará TRUE, mas =AND("abc",TRUE) retornará #VALUE!. Veja as linhas 9 a 13 na imagem abaixo.

insira a descrição da imagem aqui

Mas fica mais estranho ...

Se algum dos argumentos for um erro, ANDretornará o primeiro erro. Exceto , se algum dos argumentos for um literal de cadeia, 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!

ThunderFrame
fonte
0

=ISBLANK(B2)
dá VERDADEIRO se B2 estiver vazio, não espaço em branco

=AND(B2,TRUE) deve ser
=AND(B2="",TRUE)você tem que escrever o valor (B2 retorno vazio True) ea 2ª lógica é verdadeira e irá retornar True
=IF(B2,TRUE,FALSE)deve ser =IF(B2="",TRUE,FALSE)trarão verdadeiro
=AND(IF(B2,TRUE,FALSE),TRUE)deve ser =AND(IF(B2="",TRUE,FALSE),TRUE)trarão verdadeiro
Tente sempre escrever todo o teste e não acho Excel fará.
Lembre-se sempre de que Logical Test, em suas fórmulas, não teste para B2
Como usar a função SE
Excel AND Function


fonte
8
Eu acho que você perdeu o ponto de OP. O = ISBLANK (B2) serve apenas para provar que a célula B2 está em branco. O = AND (B2, TRUE) destina-se a testar o valor booleano da célula B2. A única maneira de avaliar como TRUE é se a célula B2 é avaliada como TRUE. Isso é contradito pelo seguinte teste, = SE (B2, TRUE, FALSE) retornando FALSE. Essa é uma pergunta impressionante, pois eu não sabia que o Excel ignora alguns valores de célula em vez de avaliá-los em um valor booleano (TRUE ou FALSE).
Linhartr22 31/08/16
6
Por que isso é votado? AND(B2,TRUE)definitivamente não deveria estar AND(B2="",TRUE)no contexto da questão.
Dmitry Grigoryev