TL; DR - это артефакт того, как Excel хранит и обменивается содержимым ячейки внутри. Пустая ячейка - это VARIANT без значения, который преобразуется в FALSE из-за того, как языки программирования обрабатывают достоверность нулевых и ненулевых значений.
Поведение AND()
(и всех других логических функций) заключается в преобразовании обоих аргументов в логические значения, and
затем в выполнении логической операции и операции над ними. Вы можете откинуть обложки и посмотреть, как это определено в объектной модели Excel, используя Object Browser редактора Visual Basic:
Обратите внимание, что он возвращает Boolean
, а не 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 будет иметь "значение", которое представлено 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
преобразует это в Boolean
? Хороший вопрос! Это ложно, подобно тому, как языки программирования обычно обрабатывают ноль:
Sub DemoMacro2()
MsgBox CBool(vbEmpty)
End Sub
Вы можете увидеть то же поведение, опуская аргументы полностью:
=AND(,)
... это то же самое, что и ...
=AND({vbEmpty},{vbEmpty})
... который так же, как ...
=AND(0,0)
...который:
=AND(FALSE,FALSE)