TL; DR - Đây là một phần của cách Excel lưu trữ và trao đổi nội dung ô trong nội bộ. Một ô trống là một VariANT không có giá trị, chuyển đổi thành FALSE do cách ngôn ngữ lập trình xử lý tính trung thực của các giá trị 0 và khác không.
Hành vi của AND()
(và tất cả các hàm logic khác) là chuyển đổi cả hai đối số thành Booleans, sau đó thực hiện and
thao tác logic trên chúng. Bạn có thể bóc lại các trang bìa và xem cách nó được xác định trong mô hình đối tượng Excel bằng Trình duyệt đối tượng của Trình soạn thảo Visual Basic:
Lưu ý rằng nó trả về a Boolean
, không phải a Variant
. Điều này có nghĩa là tại một số điểm trong quá trình đánh giá hàm, tất cả các đối số phải được chuyển đổi thành Boolean
s . Hành vi được quan sát thực tế chỉ ra rằng điều này được thực hiện sớm trong quá trình xử lý - Excel cố gắng thân thiện với người dùng bằng cách cố gắng chuyển đổi tất cả các đối số và sử dụng các giá trị được chuyển đổi trong phép tính nếu thành công. Điều này có thể được chứng minh bằng cách chuyển các String
giá trị "Đúng" và "Sai" cho hàm:
=AND("true","true") <---Results in TRUE
=AND("false","true") <---Results in FALSE
Etc.
Nó cũng có thể được chứng minh bằng các đối số số - nó coi bất kỳ giá trị khác không nào là đúng và bằng 0 là sai:
=AND(42,-42) <---Results in TRUE
=AND(0,0) <---Results in FALSE
=AND(42,0) <---Results in FALSE
Etc.
Nó có hành vi tương tự trong các kết hợp:
=AND("false",0) <---Results in FALSE
Etc.
Bây giờ bạn sẽ có được hình ảnh. Vì vậy, làm thế nào điều này liên quan đến việc kiểm tra một ô trống? Câu trả lời cho điều này nằm ở cách Excel lưu trữ nội dung của một ô bên trong. Một lần nữa, Mô hình đối tượng Excel đang khai sáng:
Lưu ý rằng đó là cấu trúc COM VariANT . Cấu trúc này về cơ bản chứa 2 phần - một loại, cho biết mã sử dụng nó làm thế nào để diễn giải nó và một vùng dữ liệu. Một ô không có nội dung trong Excel sẽ có "giá trị" được biểu thị bằng a Variant
với loại phụ VT_EMPTY
. Một lần nữa, điều này có thể được xác nhận với một macro:
Sub DemoMacro()
'Displays "True" if cell A1 on the active sheet has no contents.
MsgBox Range("A1").Value2 = vbEmpty
End Sub
Vậy điều gì xảy ra khi AND
hàm chuyển đổi thành a Boolean
? Câu hỏi hay! Nó xảy ra là Sai, tương tự như cách các ngôn ngữ lập trình thường xử lý zero:
Sub DemoMacro2()
MsgBox CBool(vbEmpty)
End Sub
Bạn có thể thấy hành vi tương tự bằng cách bỏ qua các đối số hoàn toàn:
=AND(,)
... cũng giống như ...
=AND({vbEmpty},{vbEmpty})
... giống như ...
=AND(0,0)
... đó là:
=AND(FALSE,FALSE)