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

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

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

=ПУСТО(B2)дает ИСТИНА

Простая логическая проверка возвращает ЛОЖЬ.

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

Однако при непосредственном использовании в операторе AND возвращается значение TRUE.

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

Конечно, при косвенном использовании в операторе AND он все равно возвращает ЛОЖЬ.

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

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

решение1

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

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

решение2

TL;DR- Это артефакт того, как Excel хранит и обменивается содержимым ячеек внутри. Пустая ячейка - это ВАРИАНТ без значения, который преобразуется в ЛОЖЬ из-за того, как языки программирования обрабатывают истинность нулевых и ненулевых значений.

Поведение 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.

Это также можно продемонстрировать с помощью числовых аргументов — любое ненулевое значение рассматривается как истинное, а ноль — как ложное:

=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ВАРИАНТНАЯ структура. Эта структура в основном состоит из 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? Хороший вопрос! Это оказывается False, подобно тому, как языки программирования обычно обрабатывают ноль:

Sub DemoMacro2()
    MsgBox CBool(vbEmpty)
End Sub

Вы можете увидеть то же самое поведение,опускаяаргументы полностью:

=AND(,)

...то же самое, что...

=AND({vbEmpty},{vbEmpty})

...что то же самое, что...

=AND(0,0)

...который:

=AND(FALSE,FALSE)

решение3

Согласно моему комментарию к ответу @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!

решение4

=ISBLANK(B2)
возвращает ИСТИНА, если 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)даст True
Старайтесь всегда писать все тесты и не думайте, что Excel это сделает.
Помните всегда, что Logical Test, в ваших формулах не проверяйте B2
Как использовать функцию ЕСЛИ
Функция И в Excel

Связанный контент