У меня пустая ячейка 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
. Это означает, что в какой-то момент в процессе оценки функции,все аргументы должны быть преобразованы в 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ВАРИАНТНАЯ структура. Эта структура в основном состоит из 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