AND function dá resultado VERDADEIRO para célula BLANK vazia - por quê?

31

Eu tenho uma célula B2 em branco.

=ISBLANK(B2) gives TRUE

Um teste lógico simples retorna FALSE

=IF(B2,TRUE,FALSE) gives FALSE

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

=AND(B2,TRUE) gives TRUE

Naturalmente, quando usado indiretamente em uma instrução AND, ele ainda retorna FALSE

=AND(IF(B2,TRUE,FALSE),TRUE) gives FALSE

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

    
por pulsar3424 31.08.2016 / 13:35

4 respostas

41

Extraído de aqui , 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, OR), se algum dos argumentos contiver valores de texto ou células vazias , esses valores serão ignorados.

    
por 31.08.2016 / 13:58
6

TL; 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 para FALSE devido a como as linguagens de programação tratam a veracidade de valores zero e diferentes de zero.

O comportamento de AND() (e todas as outras funções lógicas) é converter ambos os argumentos em Booleanos e, em seguida, executar uma operação lógica and neles. Você pode retirar as capas e dar uma olhada em como ela é definida no modelo de objetos do Excel usando o Pesquisador de objetos do Editor do Visual Basic:

ObservequeeleretornaumBoolean,nãoaVariant.Issosignificaque,emalgummomentoduranteoprocessodeavaliaçãodafunção,todososargumentosprecisamserconvertidosemBooleans.Ocomportamentorealobservadoindicaqueissoéfeitonoiníciodoprocessamento-oExceltentaseramigável,tentandoconvertertodososargumentoseusandoosvaloresconvertidosnocálculo,seforbem-sucedido.IssopodeserdemonstradopassandoosvaloresString"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.

Até agora você deve tirar a foto. Então, como isso se relaciona com o teste de uma célula em branco? A resposta para isso está em como o Excel armazena internamente o conteúdo de uma célula. Novamente, o modelo de objeto do Excel é esclarecedor:

Observequeéuma estrutura VARIANT a>. Esta estrutura contém basicamente 2 partes - um tipo, que diz ao código usando como interpretá-lo, e uma área de dados. Uma célula sem conteúdo no Excel terá um "valor" 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 função AND converte isso em Boolean ? Boa pergunta! Acontece que é Falso, semelhante a como as linguagens de programação tratam o zero:

Sub DemoMacro2()
    MsgBox CBool(vbEmpty)
End Sub

Você pode ver o mesmo comportamento omitindo completamente os argumentos :

=AND(,)

... é a mesma coisa que ...

=AND({vbEmpty},{vbEmpty})

... o que é o mesmo que ...

=AND(0,0)

... que é:

=AND(FALSE,FALSE)
    
por 01.09.2016 / 16:50
2

De acordo com o meu comentário sobre a resposta do @jcbermu, com uma pequena correção:

If any but not ALL of the arguments contain text values in cell values or empty cells, such values are ignored. But if ALL arguments contain text values in cell values or empty cells, the function returns #VALUE!

Com a correção sugerindo:

If one or more of the arguments is text from a string-literal, as opposed to text in a cell reference, then the result is #VALUE!

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

Maséestranho...

Ifanyoftheargumentsisanerror,thenANDwillreturnthefirsterror.Except,ifanyoftheargumentsisastring-literal,thenthereturnvalueis#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!

    
por 03.09.2016 / 03:44
0

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

=AND(B2,TRUE) deve ser =AND(B2="",TRUE) você tem que escrever o valor (B2 return vazio True) e o segundo lógico é True e irá retornar True =IF(B2,TRUE,FALSE) deve ser =IF(B2="",TRUE,FALSE) dará True
=AND(IF(B2,TRUE,FALSE),TRUE) deve ser =AND(IF(B2="",TRUE,FALSE),TRUE) dará True
Tente sempre escrever todo o teste e não pense que o Excel funcionará.
Lembre-se sempre do Logical Test , nas suas fórmulas não teste para B2
Como usar a função IF
Excel E Função

    
por 31.08.2016 / 14:20