І функція дає ПРАВИЛЬНИЙ результат для порожньої клітини BLANK - чому?


31

У мене порожня клітинка В2.

= ISBLANK (B2) дає правду

Простий логічний тест на ньому повертає ЛІЖНЕ

= ЯКЩО (В2, ПРАВИЛЬНА, ЛАЖНА) дає ЛІЖНЕ

Однак, безпосередньо використовуючи у операторі AND, він повертає ІСТИНУ

= І (В2, ІСТИНА) дає ІСТИНУ

Звичайно, якщо опосередковано використовується у відрізку AND, він все одно повертає ЛІЖНЕ

= І (ЯКЩО (В2, ІСТИНА, ЛІЖНІСТЬ), ІСТИНА) дає ЛІЖНЕ

Чи можете ви пояснити мені, будь ласка, чому мій Excel так поводиться?

Відповіді:


41

Витягнути звідси , шукайте розділ під назвою логічні функції Excel - факти та цифри :

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


2
Це чудово знати !!
Студент Гері

2
Можливо, ви могли б додати правило, що охоплює вираз IF(B2,TRUE,FALSE)? Крім того, я сподівався, що логічно правильні (але трохи протиінтуїтивні) сполучники та диз'юнкції отриманих порожніх множин будуть повернені, тобто AND(B2)було б істинно, поки OR(B2)було помилковим, але експерименти показують, що вони повертають помилку.
PJTraill

2
якщо будь-який, але не ВСІ аргументи містить текстові значення або порожні комірки, такі значення ігноруються. Але якщо ВСІ аргументи містять текстові значення або порожні комірки, функція повертає # VALUE!
ThunderFrame

Гарна відповідь. @ Коментар ThunderFrame також є першорядним.
Raystafarian

Є ще один застереження. Існує різниця між текстом, переданим як посилання на комірку, на відміну від тексту, переданого як рядковий-буквальний. Детальну інформацію див. У моїй відповіді.
ThunderFrame

6

TL; DR - це артефакт того, як Excel зберігає та обмінюється вмістом комірок внутрішньо. Порожня клітинка - ВАРІАНТ без значення, який перетворюється на ЛІЖНЕ завдяки тому, як мови програмування ставляться до правдивості нульових та ненульових значень.

Поведінка AND()(та всіх інших логічних функцій) полягає в перетворенні обох аргументів у булеві, а потім виконанні andнад ними логічної операції. Ви можете зняти обкладинки і подивитися, як це визначено в об'єктній моделі Excel, використовуючи браузер об’єктів Visual Basic Editor:

І в браузері об’єктів

Зауважте, що він повертає a Boolean, а не a 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 VARIANT . Ця структура в основному містить 2 частини - тип, який повідомляє код, використовуючи його, як його інтерпретувати, та область даних. У комірці без вмісту в Excel буде "значення", яке представлено символом a 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функція перетворює це в a Boolean? Гарне питання! Це трапляється помилково, подібно до того, як мови програмування зазвичай ставляться до нуля:

Sub DemoMacro2()
    MsgBox CBool(vbEmpty)
End Sub

Таку ж поведінку можна побачити, повністю опустивши аргументи:

=AND(,)

... це те саме, що і ...

=AND({vbEmpty},{vbEmpty})

... що те саме, що ...

=AND(0,0)

...який є:

=AND(FALSE,FALSE)

1
Але ОП повідомляє, що аргумент порожньої комірки трактується як True, а не (як ви говорите) False.
некоматичний

@nekomatic - я пропустив цю частину. Правка надходить.
Комінтерн

Якщо A1 містить:, TRUEа B1 містить текст, якому передує апостроф:, 'FALSEто =AND(A1,B1)повертає ІСТИНА. мва-ха-ха-ха.
ThunderFrame

Не правильна відповідь у цьому випадку, але приємне загальне пояснення оцінки функції. Ставтесь до цього коментаря як до +1.
mtone

@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!


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 AND Function


8
Я думаю, ти пропустив пункт OP. = ISBLANK (B2) - це лише довести, що клітинка B2 порожня. Значення = AND (B2, ІСТИНА) призначене для перевірки булевого значення комірки B2. Тоді єдиний спосіб оцінювання до TRUE - це якщо клітина B2 оцінює TRUE. Потім це суперечить наступному тесту: = АБО (В2, ІСТИНА, ЛІЖНІСТЬ), що повертає ЛЖУ. Це дивовижне запитання, оскільки я не знав, що Excel ігнорує деякі значення комірок замість того, щоб оцінювати їх у логічне значення (TRUE або FALSE).
linhartr22

6
Чому це схвалено? AND(B2,TRUE)напевно не повинно бути AND(B2="",TRUE)в контексті питання.
Дмитро Григор’єв
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.