31

У меня есть пустая ячейка B2.

=ISBLANK(B2) gives TRUE

Простой логический тест возвращает FALSE

=IF(B2,TRUE,FALSE) gives FALSE

Тем не менее, при непосредственном использовании в операторе AND он возвращает TRUE

=AND(B2,TRUE) gives TRUE

Конечно, при косвенном использовании в выражении AND он все равно возвращает FALSE

=AND(IF(B2,TRUE,FALSE),TRUE) gives FALSE

Не могли бы вы объяснить, почему мой Excel так себя ведет?

4 ответа4

41

Извлеченный отсюда, ищите раздел под названием логические функции Excel - факты и цифры:

В Excel, когда вы используете логические функции (AND, XOR, NOT, OR), если какой-либо из аргументов содержит текстовые значения или пустые ячейки, такие значения игнорируются.

6

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)
2

Согласно моему комментарию к ответу @ jcbermu, с небольшим исправлением:

Если какие-либо, но не ВСЕ аргументы содержат текстовые значения в значениях ячеек или пустых ячейках, такие значения игнорируются. Но если ВСЕ аргументы содержат текстовые значения в значениях ячеек или пустых ячейках, функция возвращает # #VALUE!

С учетом коррекции:

Если одним или несколькими аргументами является текст из строкового литерала, в отличие от текста в ссылке на ячейку, то результатом будет #VALUE!

То есть, если ячейка A1 имеет значение "abc", то =AND(A1,TRUE) возвращает TRUE , а =AND("abc",TRUE) возвращает #VALUE! , Смотрите строки с 9 по 13 на изображении ниже.

Но становится страннее ...

Если какой-либо из аргументов является ошибкой, тогда AND вернет первую ошибку. За исключением того, что любой из аргументов является строковым литералом, возвращаемое значение равно #VALUE!

=AND(TRUE,TRUE,"abc") = # #VALUE!

=AND(1/0,foo(),TRUE) = #DIV/0!

=AND(foo(),1/0,TRUE) 1/0 , TRUE)= #NAME?

= AND(1/0 =AND(1/0,foo(),"abc",TRUE) = # #VALUE!

=AND(foo(),1/0,"abc",TRUE) = # #VALUE!

0

=ISBLANK(B2)
дает TRUE, если B2 пустое, а не пустое место

=AND(B2,TRUE) должно быть
=AND(B2="",TRUE) вы должны записать значение (B2 пустое возвращение True), а 2-е логическое - True и вернет True
=IF(B2,TRUE,FALSE) должно быть =IF(B2="",TRUE,FALSE) даст True
=AND(IF(B2,TRUE,FALSE),TRUE) должно быть =AND(IF(B2="",TRUE,FALSE),TRUE) даст Истина
Старайтесь всегда писать все тесты и не думайте, что Excel подойдет.
Всегда помните, Logical Test , в ваших формулах не тест для B2
Как использовать функцию IF
Excel И Функция

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .