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 and
operaçã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:
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 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 os valores convertidos no cálculo, se for bem-sucedido. Isso pode ser demonstrado passando os String
valores "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:
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 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 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)