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 and
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 a Variant
. Oznacza to, że w pewnym momencie procesu oceny funkcji wszystkie argumenty muszą zostać przekonwertowane na Boolean
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 funkcji String
wartoś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:
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 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 AND
funkcja 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)