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.
Это также может быть продемонстрировано с помощью числовых аргументов - оно обрабатывает любое ненулевое значение как true, а ноль - как false:
=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)