我有空白 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 物件模型中定義的:
請注意,它返回一個Boolean
,不是A Variant
。這意味著在評估函數過程中的某個時刻,所有參數都必須轉換為Boolean
s。實際觀察到的行為表明這是在處理的早期完成的 - 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 與函數