AND-Funktion gibt TRUE-Ergebnis für leere, leere Zelle - warum?

31

Ich habe eine leere B2-Zelle.

= ISBLANK (B2) ergibt WAHR

Ein einfacher logischer Test gibt FALSE zurück

= WENN (B2, WAHR, FALSCH) ergibt FALSCH

Bei direkter Verwendung in einer AND-Anweisung wird jedoch TRUE zurückgegeben

= AND (B2, TRUE) ergibt TRUE

Wenn es indirekt in einer AND-Anweisung verwendet wird, gibt es natürlich 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?

pulsar3424
quelle

Antworten:

41

Suchen Sie hier nach dem Abschnitt mit dem Titel " Logische Excel-Funktionen - Daten und Fakten" :

Wenn Sie in Excel logische Funktionen (AND, XOR, NOT, OR) verwenden und eines der Argumente Textwerte oder leere Zellen enthält , werden diese Werte ignoriert.

jcbermu
quelle
2
Das ist toll zu wissen !!
Garys Schüler
2
Vielleicht könnten Sie die Regel für den Ausdruck hinzufügen IF(B2,TRUE,FALSE)? Ich hoffte auch, dass die logisch korrekten (aber ein wenig kontraintuitiven) Konjunktionen und Disjunktionen der resultierenden leeren Mengen zurückgegeben würden, dh AND(B2)wahr wären, solange OR(B2)falsch, aber Experimente zeigen, dass sie einen Fehler zurückgeben.
PJTraill
2
falls vorhanden , aber nicht alle der Argumente Textwerte oder leere Zellen enthält, werden diese Werte ignoriert. Wenn ALLE Argumente Textwerte oder leere Zellen enthalten, gibt die Funktion #WERT!
ThunderFrame
Gute Antwort. @ ThunderFrame's Kommentar ist ebenfalls von größter Bedeutung.
Raystafarian
Es gibt noch eine Einschränkung. Es gibt einen Unterschied zwischen Text, der als Zellreferenz übergeben wird, und Text, der als String-Literal übergeben wird. Siehe meine Antwort für Details.
ThunderFrame
6

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 andOperation 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:

UND im Objektbrowser

Beachten Sie, dass a Booleanund nicht a zurückgegeben wird Variant. Dies bedeutet, dass zu einem bestimmten Zeitpunkt während der Auswertung der Funktion alle Argumente in Booleans 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 StringWerte "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:

Zellwert im Objektbrowser

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 Variantmit 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 ANDFunktion 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)
Komintern
quelle
1
Das OP meldet jedoch, dass ein leeres Zellenargument als wahr und nicht (wie Sie sagen) als falsch behandelt wird.
Nekomatic
@nekomatic - Ich habe diesen Teil verpasst. Bearbeiten Sie kommen.
Comintern
Wenn A1 enthält: TRUEund B1 enthält Text mit vorangestelltem Apostroph :, 'FALSEdann wird =AND(A1,B1)TRUE zurückgegeben. mwa-ha-ha-ha.
ThunderFrame
In diesem Fall nicht die richtige Antwort, aber dennoch eine nette allgemeine Erklärung zur Funktionsbewertung. Behandle diesen Kommentar als +1.
mtone
@ThunderFrame: Was ist dein Punkt? Wenn A1 enthält TRUEund B1 einen beliebigen Textwert (einschließlich einer leeren Zeichenfolge) enthält , wird =AND(A1,B1)zurückgegeben TRUE.
Scott
2

Laut meinem Kommentar zu @ jcbermus Antwort mit einer kleinen Korrektur:

Wenn jeder , aber nicht alle der Argumente Text enthalten Werte in Zellwerte oder leere Zellen werden solche Werte ignoriert. Aber wenn alle Argumente enthalten Textwerte in Zellwerte oder leere Zellen, die Funktion zurückkehrt#VALUE!

Mit der Korrektur impliziert:

Wenn eines oder mehrere der Argumente Text aus einem String-Literal ist, im Gegensatz zu Text in einem Zellverweis, lautet das Ergebnis #VALUE!

Das heißt, wenn die Zelle A1den Wert "abc" hat, =AND(A1,TRUE)kehrt sie zurück TRUE, kehrt aber =AND("abc",TRUE) zurück #VALUE!. Siehe Zeilen 9 bis 13 im Bild unten.

Bildbeschreibung hier eingeben

Ist aber merkwürdiger geworden ...

Wenn jeder des Arguments ein Fehler ist, dann ANDkehrt den ersten Fehler. Außer , wenn eine 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!

ThunderFrame
quelle
0

=ISBLANK(B2)
Gibt WAHR, wenn B2 leer ist, kein Leerzeichen

=AND(B2,TRUE) sollten
=AND(B2="",TRUE)Sie den Wert (B2 leer return True) und die zweite logische wahr und wird wieder wahr schreiben
=IF(B2,TRUE,FALSE)sein sollte =IF(B2="",TRUE,FALSE)geben Wahr
=AND(IF(B2,TRUE,FALSE),TRUE)ist zu =AND(IF(B2="",TRUE,FALSE),TRUE)wahren geben wird
immer versuchen , alle Test und glaube nicht , dass Excel tun zu schreiben.
Denken Sie immer daran Logical Test, in Ihren Formeln nicht auf B2
zu testen, wie die IF-Funktion
Excel AND Function verwendet wird


quelle
8
Ich denke, Sie haben den OP-Punkt verpasst. Das = ISBLANK (B2) soll nur beweisen, dass die Zelle B2 leer ist. Das = AND (B2, TRUE) soll den Booleschen Wert der Zelle B2 testen. Dies wird dann nur dann als WAHR ausgewertet, wenn die Zelle B2 als WAHR ausgewertet wird. Dies wird dann durch den folgenden Test widersprochen: = WENN (B2, WAHR, FALSCH) FALSCH zurückgibt. Dies ist eine wunderbare Frage, da ich nicht wusste, dass Excel einige Zellenwerte ignoriert, anstatt sie in einen booleschen Wert (TRUE oder FALSE) zu konvertieren.
Linhartr22
6
Warum ist das verärgert? AND(B2,TRUE)sollte auf keinen fall AND(B2="",TRUE)im zusammenhang mit der frage stehen.
Dmitry Grigoryev