Ich habe eine leere B2-Zelle.
=ISTLEER(B2)ergibt WAHR
Ein einfacher logischer Test gibt FALSE zurück
=WENN(B2,WAHR,FALSCH)ergibt FALSCH
Wenn es jedoch direkt in einer AND-Anweisung verwendet wird, gibt es TRUE zurück.
=UND(B2,WAHR)ergibt WAHR
Natürlich gibt es bei indirekter Verwendung in einer AND-Anweisung immer noch FALSE zurück.
=UND(WENN(B2,WAHR,FALSCH),WAHR)ergibt FALSCH
Können Sie mir bitte erklären, warum sich mein Excel so verhält?
Antwort1
Extrahiert ausHier, suchen Sie nach dem Abschnitt mit dem TitelLogische Funktionen in Excel – Zahlen und Fakten:
Wenn Sie in Excel logische Funktionen (AND, XOR, NOT, OR) verwenden und eines der Argumente Textwerte enthält oderleere Zellen, solche Werte werden ignoriert.
Antwort2
Kurz zusammengefasst- Es ist ein Artefakt der internen Speicherung und des Austauschs von Zellinhalten in Excel. Eine leere Zelle ist eine VARIANTE ohne Wert, die aufgrund der Art und Weise, wie Programmiersprachen die Richtigkeit von Null- und Nicht-Null-Werten behandeln, in FALSE umgewandelt wird.
Das Verhalten von AND()
(und allen anderen logischen Funktionen) besteht darin, beide Argumente in Boolesche Werte umzuwandeln und dann eine logische and
Operation mit ihnen durchzuführen. Sie können die Abdeckungen entfernen und sich ansehen, wie es im Excel-Objektmodell definiert ist, indem Sie den Objektbrowser des Visual Basic-Editors verwenden:
Beachten Sie, dass ein zurückgegeben wird Boolean
.nichta Variant
. Dies bedeutet, dass irgendwann während der Auswertung der Funktionalle Argumente müssen in Boolean
s umgewandelt werden. Das tatsächlich beobachtete Verhalten deutet darauf hin, dass dies früh in der Verarbeitung geschieht - Excel versucht, benutzerfreundlich zu sein, indem es versucht, alle Argumente zu konvertieren und dieumgewandeltWerte in der Berechnung, wenn sie erfolgreich ist. Dies kann demonstriert werden, indem man String
der Funktion die Werte „True“ und „False“ übergibt:
=AND("true","true") <---Results in TRUE
=AND("false","true") <---Results in FALSE
Etc.
Dies kann auch mit numerischen Argumenten demonstriert werden – jeder Wert ungleich Null wird als wahr und Null als falsch behandelt:
=AND(42,-42) <---Results in TRUE
=AND(0,0) <---Results in FALSE
=AND(42,0) <---Results in FALSE
Etc.
Dasselbe Verhalten zeigt sich auch in Kombinationen:
=AND("false",0) <---Results in FALSE
Etc.
Jetzt sollten Sie sich ein Bild machen können. Was hat das nun mit dem Testen einer leeren Zelle zu tun? 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 ein COM handeltVARIANT-Struktur. Diese Struktur besteht im Wesentlichen aus zwei Teilen - einem Typ, der dem Code, der sie verwendet, mitteilt, wie er sie interpretieren soll, und einem Datenbereich. Eine Zelle ohne Inhalt in Excel hat einen „Wert“, der durch ein Variant
mit dem Untertyp dargestellt wird VT_EMPTY
. Auch dies kann 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 umwandelt Boolean
? Gute Frage! Es ist zufällig False, ähnlich wie Programmiersprachen normalerweise Nullen behandeln:
Sub DemoMacro2()
MsgBox CBool(vbEmpty)
End Sub
Dasselbe Verhalten können Sie beobachten beiWeglassenArgumente vollständig:
=AND(,)
...ist dasselbe wie...
=AND({vbEmpty},{vbEmpty})
...was dasselbe ist wie...
=AND(0,0)
...welches ist:
=AND(FALSE,FALSE)
Antwort3
Gemäß meinem Kommentar zu @jcbermus Antwort, mit einer kleinen Korrektur:
Wenn überhauptaber nicht allesder Argumente enthalten
TextwerteInZellenwerte oder leere Zellen, solche Werte werden ignoriert.Aber wenn ALLE Argumente TextwerteenthaltenInZellenwerte oder leere Zellen, die Funktion gibt#VALUE!
Mit der Korrektur impliziert:
Wenn eines oder mehrere der Argumente Text aus einem String-Literal und nicht Text aus einem Zellbezug sind, dann lautet das Ergebnis
#VALUE!
Das heißt, wenn die Zelle A1
den Wert „abc“ hat, =AND(A1,TRUE)
wird zurückgegeben TRUE
,Aber =AND("abc",TRUE)
gibt zurück #VALUE!
. Siehe Zeilen 9 bis 13 im Bild unten.
Aber es wirdFremder...
Wennbeliebigder Argumente ist ein Fehler, dann
AND
wird dieErsteFehler.Außer, wenn eines der Argumente ein String-Literal ist, dann ist der Rückgabewert#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!
Antwort4
=ISBLANK(B2)
gibt TRUE, wenn B2 leer ist und kein Leerzeichen
=AND(B2,TRUE)
Sie müssen
=AND(B2="",TRUE)
den Wert (B2 leer gibt True zurück) schreiben und der 2. logische Wert ist True und gibt True zurück.
=IF(B2,TRUE,FALSE)
Sollte True geben. Sollte =IF(B2="",TRUE,FALSE)
True geben.
=AND(IF(B2,TRUE,FALSE),TRUE)
Sollte =AND(IF(B2="",TRUE,FALSE),TRUE)
True geben.
Versuchen Sie immer, alle Tests zu schreiben und denken Sie nicht, dass Excel das tun wird.
Denken Sie immer daran Logical Test
, in Ihren Formeln nicht auf B2 zu testen .
So verwenden Sie die WENN-Funktion
Excel UND-Funktion