Функция AND дает ИСТИННЫЙ результат для пустой, ПУСТОЙ ячейки - почему?

31

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

= ISBLANK (B2) дает ИСТИНА

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

= ЕСЛИ (В2, ИСТИНА, ЛОЖЬ) дает ЛОЖЬ

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

= И (В2, ИСТИНА) дает ИСТИНА

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

= И (ЕСЛИ (В2, ИСТИНА, ЛОЖЬ), ИСТИНА) дает ЛОЖЬ

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

pulsar3424
источник

Ответы:

41

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

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

jcbermu
источник
2
Это здорово знать !!
Студент Гэри
2
Возможно, вы могли бы добавить правило, охватывающее выражение IF(B2,TRUE,FALSE)? Кроме того, я надеялся, что будут возвращены логически правильные (но немного нелогичные) конъюнкции и дизъюнкции получающихся пустых множеств, т. AND(B2)Е. Будут истинными, в то время как OR(B2)ложными, но эксперименты показывают, что они возвращают ошибку.
PJTraill
2
если какой-либо из аргументов, кроме ВСЕХ, содержит текстовые значения или пустые ячейки, такие значения игнорируются. Но если ВСЕ аргументы содержат текстовые значения или пустые ячейки, функция возвращает #VALUE!
ThunderFrame
Хороший ответ. Комментарий @ ThunderFrame также имеет первостепенное значение.
Raystafarian
Есть еще одна оговорка. Существует разница между текстом, переданным как ссылка на ячейку, в отличие от текста, переданного как строковый литерал. Смотрите мой ответ для деталей.
ThunderFrame
6

TL; DR - это артефакт того, как Excel хранит и обменивается содержимым ячейки внутри. Пустая ячейка - это VARIANT без значения, который конвертируется в FALSE из-за того, как языки программирования обрабатывают достоверность нулевых и ненулевых значений.

Поведение AND()(и всех других логических функций) заключается в преобразовании обоих аргументов в логические значения, а затем в них выполняется логическая andоперация. Вы можете откинуть обложки и посмотреть, как это определено в объектной модели Excel, используя Object Browser редактора Visual Basic:

И в браузере объектов

Обратите внимание , что она возвращает Boolean, неVariant . Это означает, что в какой-то момент в процессе оценки функции все аргументы должны быть преобразованы в Booleans . Фактическое наблюдаемое поведение указывает на то, что это делается на ранней стадии обработки - 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)
Коминтерн
источник
1
Но OP сообщает, что аргумент пустой ячейки обрабатывается как True, а не (как вы говорите) False.
некоматично
@nekomatic - я пропустил эту часть. Редактировать приход.
Коминтерн
Если A1 содержит:, TRUEа B1 содержит текст, которому предшествует апостроф:, 'FALSEтогда =AND(A1,B1)возвращается TRUE. МДЖ-ха-ха-ха.
ThunderFrame
Не правильный ответ в этом случае, но, тем не менее, хорошее общее объяснение оценки функции. Считайте этот комментарий +1.
Монт
@ThunderFrame: Что ты думаешь? Если A1 содержит TRUE, а B1 содержит любое текстовое значение (включая пустую строку) , тогда =AND(A1,B1)возвращается TRUE.
Скотт
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) знак равно #NAME?

=AND(1/0,foo(),"abc",TRUE) знак равно #VALUE!

=AND(foo(),1/0,"abc",TRUE) знак равно #VALUE!

ThunderFrame
источник
0

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

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


источник
8
Я думаю, что вы пропустили точку ОП. = ISBLANK (B2) просто для того, чтобы доказать, что ячейка B2 пуста. = AND (B2, TRUE) предназначен для проверки логического значения ячейки B2. Тогда единственный способ, которым это оценивается как ИСТИНА, - если ячейка В2 оценивается как ИСТИНА Это затем противоречит следующему тесту = IF (B2, TRUE, FALSE), возвращающему FALSE. Это удивительный вопрос, так как я не знал, что Excel игнорирует некоторые значения ячеек вместо их преобразования в логическое значение (ИСТИНА или ЛОЖЬ).
linhartr22
6
Почему за это проголосовали? AND(B2,TRUE)определенно не должно быть AND(B2="",TRUE)в контексте вопроса.
Дмитрий Григорьев