TL; DR - เป็นสิ่งประดิษฐ์ที่ Excel จัดเก็บและแลกเปลี่ยนเนื้อหาของเซลล์ภายใน เซลล์ว่างเป็นตัวแปรที่ไม่มีค่าซึ่งแปลงเป็น FALSE เนื่องจากวิธีการเขียนโปรแกรมภาษาที่ปฏิบัติต่อความเป็นจริงของค่าศูนย์และค่าที่ไม่ใช่ศูนย์
พฤติกรรมของAND()
(และฟังก์ชันทางตรรกะอื่น ๆ ทั้งหมด) คือการแปลงอาร์กิวเมนต์ทั้งสองเป็นบูลีนจากนั้นดำเนินการทางตรรกะand
กับพวกเขา คุณสามารถถอดฝาครอบกลับมาและดูว่ามันถูกกำหนดในรูปแบบวัตถุ Excel โดยใช้ Object Browser ของ Visual Basic Editor:
โปรดทราบว่าจะส่งกลับ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
? คำถามที่ดี! มันเกิดขึ้นเป็นเท็จคล้ายกับภาษาการเขียนโปรแกรมโดยทั่วไปถือว่าศูนย์
Sub DemoMacro2()
MsgBox CBool(vbEmpty)
End Sub
คุณสามารถเห็นพฤติกรรมเดียวกันโดยการละเว้นข้อโต้แย้งทั้งหมด
=AND(,)
... เป็นสิ่งเดียวกับ ...
=AND({vbEmpty},{vbEmpty})
... ซึ่งเหมือนกับ ...
=AND(0,0)
...ซึ่งเป็น:
=AND(FALSE,FALSE)