Funkcja AND daje PRAWDA wynik dla pustej, pustej komórki - dlaczego?

31

Mam pustą komórkę B2.

= ISBLANK (B2) daje wartość PRAWDA

Prosty test logiczny na nim zwraca FALSE

= JEŻELI (B2, PRAWDA, FAŁSZ) daje FAŁSZ

Jednak gdy jest użyte bezpośrednio w instrukcji AND, zwraca PRAWDA

= ORAZ (B2, PRAWDA) daje PRAWDA

Oczywiście, gdy jest używane pośrednio w instrukcji AND, nadal zwraca FALSE

= ORAZ (JEŻELI (B2, PRAWDA, FAŁSZ), PRAWDA) daje FAŁSZ

Czy mógłbyś mi wyjaśnić, dlaczego mój Excel zachowuje się w ten sposób?

pulsar3424
źródło

Odpowiedzi:

41

Wyodrębniono stąd , poszukaj sekcji zatytułowanej Funkcje logiczne programu Excel - fakty i liczby :

W programie Excel, gdy używasz funkcji logicznych (AND, XOR, NOT, OR), jeśli którykolwiek z argumentów zawiera wartości tekstowe lub puste komórki , takie wartości są ignorowane.

jcbermu
źródło
2
To wspaniale wiedzieć !!
Student Gary'ego
2
Być może mógłbyś dodać regułę obejmującą wyrażenie IF(B2,TRUE,FALSE)? Miałem również nadzieję, że logicznie poprawne (ale trochę sprzeczne z intuicją) sprzężenia i rozłączenia wynikowych pustych zbiorów zostaną zwrócone, tj. AND(B2)Będą prawdziwe, gdy będą OR(B2)fałszywe, ale eksperymenty pokazują, że zwracają one błąd.
PJTraill
2
jeśli którykolwiek, ale nie WSZYSTKIE argumenty zawierają wartości tekstowe lub puste komórki, takie wartości są ignorowane. Ale jeśli WSZYSTKIE argumenty zawierają wartości tekstowe lub puste komórki, funkcja zwraca # WARTOŚĆ!
ThunderFrame
Dobra odpowiedź. @ Komentarz ThunderFrame jest również najważniejszy.
Raystafarian,
Jest jeszcze jedno zastrzeżenie. Istnieje różnica między tekstem przekazywanym jako odwołanie do komórki, a tekstem przekazywanym jako literał-ciąg. Zobacz moją odpowiedź, aby poznać szczegóły.
ThunderFrame
6

TL; DR - to artefakt tego, jak Excel wewnętrznie przechowuje i wymienia zawartość komórki. Pusta komórka to WARIANT bez wartości, który konwertuje na FAŁSZ ze względu na to, jak języki programowania traktują prawdziwość wartości zerowych i niezerowych.

Zachowanie AND() (i wszystkich innych funkcji logicznych) jest konwersja obu argumentów na logiczne, a następnie wykonanie andna nich logicznej operacji. Możesz odkleić okładki i spojrzeć na to, jak jest zdefiniowany w modelu obiektowym Excel za pomocą Przeglądarki obiektów edytora Visual Basic:

ORAZ w przeglądarce obiektów

Zauważ, że zwraca a Boolean, a nie a Variant. Oznacza to, że w pewnym momencie procesu oceny funkcji wszystkie argumenty muszą zostać przekonwertowane na Booleans . Rzeczywiste zaobserwowane zachowanie wskazuje, że odbywa się to na wczesnym etapie przetwarzania - Excel próbuje być przyjazny dla użytkownika, próbując przekonwertować wszystkie argumenty i użyć przekonwertowanych wartości w obliczeniach, jeśli się powiedzie. Można to wykazać, przekazując do funkcji Stringwartości „Prawda” i „Fałsz”:

=AND("true","true") <---Results in TRUE
=AND("false","true") <---Results in FALSE
Etc.

Można to również zademonstrować za pomocą argumentów numerycznych - traktuje każdą niezerową wartość jako true, a zero jako false:

=AND(42,-42) <---Results in TRUE
=AND(0,0) <---Results in FALSE
=AND(42,0) <---Results in FALSE
Etc.

Ma to samo zachowanie w kombinacjach:

=AND("false",0) <---Results in FALSE
Etc.

Do tej pory powinieneś dostać zdjęcie. Jak to się ma do testowania pustej komórki? Odpowiedź na to polega na tym, jak Excel wewnętrznie przechowuje zawartość komórki. Ponownie, model obiektowy Excel jest pouczający:

Wartość komórki w przeglądarce obiektów

Zauważ, że jest to struktura VARIANT COM . Ta struktura zasadniczo składa się z 2 części - typu, który mówi używającemu kodowi, jak go interpretować, oraz obszaru danych. Komórka bez zawartości w programie Excel będzie miała „wartość” reprezentowaną przez Variantz podtypem VT_EMPTY. Ponownie można to potwierdzić za pomocą makra:

Sub DemoMacro()
    'Displays "True" if cell A1 on the active sheet has no contents.
    MsgBox Range("A1").Value2 = vbEmpty
End Sub

Co się dzieje, gdy ANDfunkcja przekształca to w Boolean? Dobre pytanie! Zdarza się, że jest fałszywy, podobnie jak języki programowania zwykle traktują zero:

Sub DemoMacro2()
    MsgBox CBool(vbEmpty)
End Sub

Możesz zobaczyć to samo zachowanie, pomijając całkowicie argumenty:

=AND(,)

... to to samo, co ...

=AND({vbEmpty},{vbEmpty})

... który jest taki sam jak ...

=AND(0,0)

...który jest:

=AND(FALSE,FALSE)
Komintern
źródło
1
Ale OP informuje, że argument pustej komórki jest traktowany jako prawda, a nie (jak mówisz) fałsz.
nekomatic
@nekomatic - tęskniłem za tą częścią. Edytuj nadchodzi.
Comintern
Jeśli A1 zawiera TRUE:, a B1 zawiera tekst poprzedzony apostrofem:, 'FALSEwówczas =AND(A1,B1)zwraca PRAWDA. mwa-ha-ha-ha.
ThunderFrame
W tym przypadku nie jest to poprawna odpowiedź, ale mimo to ładne ogólne wyjaśnienie oceny funkcji. Traktuj ten komentarz jako +1.
mtone
@ThunderFrame: O co ci chodzi? Jeśli A1 zawiera TRUE, a B1 zawiera dowolną wartość tekstową (w tym pusty ciąg znaków) , wówczas =AND(A1,B1)zwraca TRUE.
Scott
2

Zgodnie z moim komentarzem do odpowiedzi @ jcbermu, z małą poprawką:

Jeżeli którykolwiek ale nie wszystkie argumenty zawierać tekst wartości w wartości komórek lub puste komórki, wartości te są ignorowane. Ale jeśli wszystkie argumenty zawierać tekst wartości w wartości komórek lub pustych komórek powraca funkcyjnych#VALUE!

Z korektą implikującą:

Jeśli jeden lub więcej argumentów jest tekstem z literału-ciągu, w przeciwieństwie do tekstu w odwołaniu do komórki, wynikiem jest #VALUE!

Oznacza to, że jeśli komórka A1ma wartość „abc”, wówczas =AND(A1,TRUE)zwraca TRUE, ale =AND("abc",TRUE) zwraca #VALUE!. Zobacz wiersze od 9 do 13 na obrazku poniżej.

wprowadź opis zdjęcia tutaj

Ale robi się dziwniejszy ...

Jeśli którykolwiek z argumentów jest błędem, ANDzwróci pierwszy błąd. Z wyjątkiem , że którykolwiek z argumentów jest literałem łańcuchowym, wówczas zwracana jest wartość#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
źródło
0

=ISBLANK(B2)
podaje PRAWDA, jeśli B2 jest pusty, a nie puste miejsce

=AND(B2,TRUE) należy
=AND(B2="",TRUE)wpisać wartość (B2 puste zwrócenie True), a druga logika to Prawda i zwróci Prawda
=IF(B2,TRUE,FALSE)powinna być =IF(B2="",TRUE,FALSE)Prawda
=AND(IF(B2,TRUE,FALSE),TRUE)powinna być Prawda powinna =AND(IF(B2="",TRUE,FALSE),TRUE)dać Prawda
Spróbuj zawsze napisać cały test i nie sądzę, że Excel to zrobi.
Pamiętaj zawsze Logical Test, aby w twoich formułach nie testować B2
Jak korzystać z funkcji JEŻELI
Excel ORAZ Funkcja


źródło
8
Myślę, że przegapiłeś punkt PO. = ISBLANK (B2) ma tylko udowodnić, że komórka B2 jest pusta. = ORAZ (B2, PRAWDA) ma na celu przetestowanie wartości logicznej komórki B2. Jedynym sposobem, aby to ocenić na PRAWDA, jest to, że komórka B2 ma wartość PRAWDA. Jest to następnie sprzeczne z następującym testem, = JEŻELI (B2, PRAWDA, FAŁSZ) zwraca FAŁSZ. To niesamowite pytanie, ponieważ nie wiedziałem, że Excel ignoruje niektóre wartości komórek zamiast przekształcać je w wartości boolowskie (PRAWDA lub FAŁSZ).
linhartr22
6
Dlaczego jest to oceniane? AND(B2,TRUE)zdecydowanie nie powinno być AND(B2="",TRUE)w kontekście pytania.
Dmitry Grigoryev