TL; DR - це артефакт того, як Excel зберігає та обмінюється вмістом комірок внутрішньо. Порожня клітинка - ВАРІАНТ без значення, який перетворюється на ЛІЖНЕ завдяки тому, як мови програмування ставляться до правдивості нульових та ненульових значень.
Поведінка AND()
(та всіх інших логічних функцій) полягає в перетворенні обох аргументів у булеві, а потім виконанні and
над ними логічної операції. Ви можете зняти обкладинки і подивитися, як це визначено в об'єктній моделі Excel, використовуючи браузер об’єктів Visual Basic Editor:
Зауважте, що він повертає a Boolean
, а не a Variant
. Це означає, що в якийсь момент під час оцінювання функції всі аргументи повинні бути перетворені в Boolean
s . Фактична спостережувана поведінка вказує на те, що це робиться на початку обробки - Excel намагається бути зручним для користувачів, намагаючись перетворити всі аргументи та використовуючи перетворені значення в обчисленні, якщо це вдасться. Це можна продемонструвати, передавши String
значення "True" та "False" у функцію:
=AND("true","true") <---Results in TRUE
=AND("false","true") <---Results in FALSE
Etc.
Це також можна продемонструвати числовими аргументами - воно розглядає будь-яке ненульове значення як істинне, а нульове - як хибне:
=AND(42,-42) <---Results in TRUE
=AND(0,0) <---Results in FALSE
=AND(42,0) <---Results in FALSE
Etc.
Він має таку ж поведінку в комбінаціях:
=AND("false",0) <---Results in FALSE
Etc.
На даний момент ви повинні отримати знімок. То як це стосується тестування порожньої комірки? Відповідь на це полягає у тому, як Excel внутрішньо зберігає вміст комірки. Знову ж, об’єктна модель Excel прояснює:
Зауважте, що це структура COM VARIANT . Ця структура в основному містить 2 частини - тип, який повідомляє код, використовуючи його, як його інтерпретувати, та область даних. У комірці без вмісту в Excel буде "значення", яке представлено символом a Variant
з підтипом VT_EMPTY
. Знову ж таки, це можна підтвердити за допомогою макросу:
Sub DemoMacro()
'Displays "True" if cell A1 on the active sheet has no contents.
MsgBox Range("A1").Value2 = vbEmpty
End Sub
Отже, що відбувається, коли AND
функція перетворює це в a Boolean
? Гарне питання! Це трапляється помилково, подібно до того, як мови програмування зазвичай ставляться до нуля:
Sub DemoMacro2()
MsgBox CBool(vbEmpty)
End Sub
Таку ж поведінку можна побачити, повністю опустивши аргументи:
=AND(,)
... це те саме, що і ...
=AND({vbEmpty},{vbEmpty})
... що те саме, що ...
=AND(0,0)
...який є:
=AND(FALSE,FALSE)