TL; DR - Es ist ein Artefakt dafür, wie Excel Zelleninhalte intern speichert und austauscht. Eine leere Zelle ist eine VARIANT ohne Wert, die aufgrund des Umgangs von Programmiersprachen mit der Richtigkeit von Null- und Nicht-Null-Werten in FALSE konvertiert wird.
Das Verhalten AND()
(und aller anderen logischen Funktionen) besteht darin, beide Argumente in Boolesche Werte umzuwandeln und dann eine logische and
Operation für sie auszuführen . Sie können die Abdeckungen abziehen und mit dem Objektbrowser des Visual Basic-Editors überprüfen, wie sie im Excel-Objektmodell definiert sind:
Beachten Sie, dass a Boolean
und nicht a zurückgegeben wird Variant
. Dies bedeutet, dass zu einem bestimmten Zeitpunkt während der Auswertung der Funktion alle Argumente in Boolean
s konvertiert werden müssen . Das tatsächlich beobachtete Verhalten weist darauf hin, dass dies zu Beginn der Verarbeitung erfolgt. Excel versucht, benutzerfreundlich zu sein, indem es versucht, alle Argumente zu konvertieren und die konvertierten Werte in der Berechnung zu verwenden, wenn dies erfolgreich ist. Dies kann demonstriert werden, indem die String
Werte "True" und "False" an die Funktion übergeben werden:
=AND("true","true") <---Results in TRUE
=AND("false","true") <---Results in FALSE
Etc.
Es kann auch mit numerischen Argumenten demonstriert werden - es behandelt jeden Wert ungleich Null als wahr und Null als falsch:
=AND(42,-42) <---Results in TRUE
=AND(0,0) <---Results in FALSE
=AND(42,0) <---Results in FALSE
Etc.
Es hat das gleiche Verhalten in Kombinationen:
=AND("false",0) <---Results in FALSE
Etc.
Inzwischen sollten Sie das Bild bekommen. Wie hängt das mit dem Testen einer leeren Zelle zusammen? Die Antwort darauf liegt darin, wie Excel den Inhalt einer Zelle intern speichert. Auch hier ist das Excel-Objektmodell aufschlussreich:
Beachten Sie, dass es sich um eine COM- VARIANT-Struktur handelt . Diese Struktur besteht im Wesentlichen aus zwei Teilen: einem Typ, der dem Code mitteilt, wie er zu interpretieren ist, und einem Datenbereich. Eine Zelle ohne Inhalt in Excel hat einen "Wert", der durch ein Variant
mit dem Untertyp dargestellt wird VT_EMPTY
. Dies kann wiederum mit einem Makro bestätigt werden:
Sub DemoMacro()
'Displays "True" if cell A1 on the active sheet has no contents.
MsgBox Range("A1").Value2 = vbEmpty
End Sub
Was passiert also, wenn die AND
Funktion das in ein konvertiert Boolean
? Gute Frage! Es ist zufällig falsch, ähnlich wie Programmiersprachen normalerweise Null behandeln:
Sub DemoMacro2()
MsgBox CBool(vbEmpty)
End Sub
Sie können dasselbe Verhalten feststellen, indem Sie die Argumente vollständig weglassen :
=AND(,)
... ist das Gleiche wie ...
=AND({vbEmpty},{vbEmpty})
... das ist das gleiche wie ...
=AND(0,0)
...welches ist:
=AND(FALSE,FALSE)