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,todososargumentosprecisamserconvertidosemBoolean
s.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)