TL; DR : è un artefatto di come Excel archivia e scambia i contenuti delle celle internamente. Una cella vuota è un VARIANTE senza valore, che si converte in FALSO a causa del modo in cui i linguaggi di programmazione trattano la verità di valori zero e diversi da zero.
Il comportamento di AND()
(e di tutte le altre funzioni logiche) è di convertire entrambi gli argomenti in booleani, quindi eseguire un'operazione logica and
su di essi. È possibile staccare le copertine e dare un'occhiata a come viene definito nel modello a oggetti di Excel utilizzando il browser degli oggetti dell'editor di Visual Basic:
Si noti che restituisce a Boolean
, non a Variant
. Ciò significa che ad un certo punto durante il processo di valutazione della funzione, tutti gli argomenti devono essere convertiti in Boolean
s . Il comportamento effettivamente osservato indica che ciò viene fatto all'inizio dell'elaborazione: Excel tenta di essere intuitivo tentando di convertire tutti gli argomenti e, se ha esito positivo, di utilizzare i valori convertiti nel calcolo. Questo può essere dimostrato passando i String
valori "True" e "False" alla funzione:
=AND("true","true") <---Results in TRUE
=AND("false","true") <---Results in FALSE
Etc.
Può anche essere dimostrato con argomenti numerici: considera qualsiasi valore diverso da zero come vero e zero come falso:
=AND(42,-42) <---Results in TRUE
=AND(0,0) <---Results in FALSE
=AND(42,0) <---Results in FALSE
Etc.
Ha lo stesso comportamento in combinazioni:
=AND("false",0) <---Results in FALSE
Etc.
Ormai dovresti avere l'immagine. Quindi, come si collega al test di una cella vuota? La risposta a questo sta nel modo in cui Excel archivia internamente il contenuto di una cella. Ancora una volta, il modello a oggetti di Excel è illuminante:
Si noti che è una struttura COM VARIANT . Questa struttura contiene sostanzialmente 2 parti: un tipo, che indica al codice che lo utilizza come interpretarlo, e un'area dati. Una cella senza contenuto in Excel avrà un "valore" rappresentato da un Variant
con il sottotipo VT_EMPTY
. Ancora una volta, questo può essere confermato con una macro:
Sub DemoMacro()
'Displays "True" if cell A1 on the active sheet has no contents.
MsgBox Range("A1").Value2 = vbEmpty
End Sub
Quindi cosa succede quando la AND
funzione lo converte in a Boolean
? Buona domanda! Capita di essere falso, simile a come i linguaggi di programmazione in genere trattano zero:
Sub DemoMacro2()
MsgBox CBool(vbEmpty)
End Sub
Puoi vedere lo stesso comportamento omettendo completamente gli argomenti:
=AND(,)
... è la stessa cosa di ...
=AND({vbEmpty},{vbEmpty})
... che è lo stesso di ...
=AND(0,0)
...che è:
=AND(FALSE,FALSE)