A função AND fornece resultado VERDADEIRO para células vazias em BRANCO - por quê?

A função AND fornece resultado VERDADEIRO para células vazias em BRANCO - por quê?

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 andoperaçã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:

E no navegador de objetos

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 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 o métodoconvertidovalores no cálculo se for bem-sucedido. Isso pode ser demonstrado passando os Stringvalores "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:

Valor da célula no navegador de objetos

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 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 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 texto emvalores de células ou células vazias, tais valores serão ignorados.Mas se TODOS os argumentos contiverem valores de texto emvalores 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 A1tiver valor "abc", então =AND(A1,TRUE)retorna TRUE,mas =AND("abc",TRUE)retorna #VALUE!. Veja as linhas 9 a 13 na imagem abaixo.

insira a descrição da imagem aqui

Mas ficaestranho...

Sequalquerdos argumentos é um erro, então ANDretornará 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 Testem suas fórmulas não teste para B2
Como usar a função SE
Excel E Função

informação relacionada