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?
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.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 wykonanieand
na 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:Zauważ, że zwraca a
Boolean
, a nie aVariant
. Oznacza to, że w pewnym momencie procesu oceny funkcji wszystkie argumenty muszą zostać przekonwertowane naBoolean
s . 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 funkcjiString
wartości „Prawda” i „Fałsz”:Można to również zademonstrować za pomocą argumentów numerycznych - traktuje każdą niezerową wartość jako true, a zero jako false:
Ma to samo zachowanie w kombinacjach:
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:
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
Variant
z podtypemVT_EMPTY
. Ponownie można to potwierdzić za pomocą makra:Co się dzieje, gdy
AND
funkcja przekształca to wBoolean
? Dobre pytanie! Zdarza się, że jest fałszywy, podobnie jak języki programowania zwykle traktują zero:Możesz zobaczyć to samo zachowanie, pomijając całkowicie argumenty:
... to to samo, co ...
... który jest taki sam jak ...
...który jest:
źródło
TRUE
:, a B1 zawiera tekst poprzedzony apostrofem:,'FALSE
wówczas=AND(A1,B1)
zwraca PRAWDA. mwa-ha-ha-ha.TRUE
, a B1 zawiera dowolną wartość tekstową (w tym pusty ciąg znaków) , wówczas=AND(A1,B1)
zwracaTRUE
.Zgodnie z moim komentarzem do odpowiedzi @ jcbermu, z małą poprawką:
Z korektą implikującą:
Oznacza to, że jeśli komórka
A1
ma wartość „abc”, wówczas=AND(A1,TRUE)
zwracaTRUE
, ale=AND("abc",TRUE)
zwraca#VALUE!
. Zobacz wiersze od 9 do 13 na obrazku poniżej.Ale robi się dziwniejszy ...
źródło
=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ć PrawdaSpró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ć B2Jak korzystać z funkcji JEŻELI
Excel ORAZ Funkcja
źródło
AND(B2,TRUE)
zdecydowanie nie powinno byćAND(B2="",TRUE)
w kontekście pytania.