AND 函數對於空的空白儲存格給出 TRUE 結果 - 為什麼?

AND 函數對於空的空白儲存格給出 TRUE 結果 - 為什麼?

我有空白 B2 細胞。

=ISBLANK(B2)給出 TRUE

對它進行簡單的邏輯測試會傳回 FALSE

=IF(B2,真,假)給出假

然而,當直接用在 AND 語句中時,它會傳回 TRUE

=與(B2,真)給出 TRUE

當然,間接用在AND語句中時,仍然會回傳FALSE

=AND(IF(B2,真,假),真)給出假

您能解釋一下為什麼我的 Excel 會這樣嗎?

答案1

摘自這裡,找出標題為Excel 邏輯函數 - 事實與數字:

在 Excel 中,當您使用邏輯函數(AND、XOR、NOT、OR)時,如果任何參數包含文字值或空白單元格,此類值將被忽略。

答案2

長話短說- 它是 Excel 如何在內部儲存和交換儲存格內容的產物。空白單元格是沒有值的 VARIANT,由於程式語言對待零值和非零值的真實性的方式,它會轉換為 FALSE。

AND()(以及所有其他邏輯函數)的行為是將兩個參數轉換為布林值,然後and對它們執行邏輯運算。您可以揭開蓋子,看看它是如何使用 Visual Basic 編輯器的物件瀏覽器在 Excel 物件模型中定義的:

AND 在物件瀏覽器中

請注意,它返回一個Boolean不是A 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變體結構。這個結構基本上包含兩個部分 - 一個類型,它告訴使用它的程式碼如何解釋它,以及一個資料區域。 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函數將其轉換為 a時會發生什麼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 為空而不是空格,則給出 TRUE

=AND(B2,TRUE) 應該是
=AND(B2="",TRUE)你必須寫入值(B2 空返回 True),第二個邏輯是 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
如何使用 IF 函數
Excel 與函數

相關內容