Hàm AND cho kết quả TRUE cho ô trống BLANK - tại sao?


31

Tôi có ô B2 trống.

= ISBLANK (B2) cho TRUE

Một bài kiểm tra logic đơn giản về nó trả về SAI

= NẾU (B2, TRUE, FALSE) cho FALSE

Tuy nhiên, khi được sử dụng trực tiếp trong câu lệnh AND, nó trả về TRUE

= AND (B2, TRUE) cho TRUE

Tất nhiên, khi được sử dụng gián tiếp trong một thống kê AND, nó vẫn trả về SAI

= AND (NẾU (B2, TRUE, FALSE), TRUE) cung cấp FALSE

Bạn có thể giải thích cho tôi tại sao Excel của tôi hành xử theo cách đó?

Câu trả lời:


41

Trích xuất từ đây , tìm phần có tiêu đề Hàm logic Excel - dữ kiện và số liệu :

Trong Excel khi bạn đang sử dụng các hàm logic (AND, XOR, NOT, OR), nếu bất kỳ đối số nào chứa giá trị văn bản hoặc ô trống , các giá trị đó sẽ bị bỏ qua.


2
Thật tuyệt khi biết điều này!!
Học sinh của Gary

2
Có lẽ bạn có thể thêm quy tắc bao gồm các biểu thức IF(B2,TRUE,FALSE)? Ngoài ra, tôi hy vọng rằng các liên kết và bất đồng chính xác về mặt logic (nhưng hơi phản cảm) của các tập hợp trống sẽ được trả về, nghĩa là AND(B2)sẽ đúng trong khi OR(B2)sai, nhưng thử nghiệm cho thấy chúng trả về lỗi.
PJTraill

2
nếu có nhưng không phải TẤT CẢ các đối số chứa giá trị văn bản hoặc ô trống, các giá trị đó sẽ bị bỏ qua. Nhưng nếu TẤT CẢ đối số chứa giá trị văn bản hoặc ô trống, hàm sẽ trả về #VALUE!
ThunderFrame

Câu trả lời tốt. Nhận xét của @ ThunderFrame là tối quan trọng.
Raystafarian

Có thêm một lời cảnh báo. Có một sự khác biệt giữa văn bản được truyền dưới dạng tham chiếu ô, trái ngược với văn bản được truyền dưới dạng chuỗi ký tự. Xem câu trả lời của tôi để biết chi tiết.
ThunderFrame

6

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 andthao 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:

VÀ trong trình duyệt đối tượng

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 Booleans . 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 Stringgiá 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:

Giá trị ô trong Trình duyệt đối tượ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 Variantvớ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 ANDhà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)

1
Nhưng OP báo cáo rằng một đối số ô trống được coi là True, không (như bạn nói) Sai.
nekomatic

@nekomatic - Tôi đã bỏ lỡ phần đó. Chỉnh sửa sắp tới.
Comitern

Nếu A1 chứa: TRUEvà B1 chứa văn bản đứng trước dấu nháy đơn: 'FALSEthì =AND(A1,B1)trả về TRUE. mwa-ha-ha-ha.
ThunderFrame

Tuy nhiên, không phải là câu trả lời đúng trong trường hợp này, nhưng dù sao cũng là một lời giải thích chung về đánh giá chức năng. Hãy coi nhận xét này là +1.
nhạc chuông

@ThunderFrame: Quan điểm của bạn là gì? Nếu A1 chứa TRUEvà B1 chứa bất kỳ giá trị văn bản nào (bao gồm cả chuỗi trống) , thì =AND(A1,B1)trả về TRUE.
Scott

2

Theo nhận xét của tôi về câu trả lời của @ jcbermu, với một sự điều chỉnh nhỏ:

Nếu có nhưng không phải TẤT CẢ các đối số chứa giá trị văn bản trong giá trị ô hoặc ô trống, các giá trị đó sẽ bị bỏ qua. Nhưng nếu TẤT CẢ đối số chứa giá trị văn bản trong giá trị ô hoặc ô trống, hàm sẽ trả về#VALUE!

Với sự điều chỉnh ngụ ý:

Nếu một hoặc nhiều đối số là văn bản từ một chuỗi ký tự, trái ngược với văn bản trong tham chiếu ô, thì kết quả là #VALUE!

Nghĩa là, nếu ô A1có giá trị "abc", thì =AND(A1,TRUE)trả về TRUE, nhưng =AND("abc",TRUE) trả về #VALUE!. Xem hàng 9 đến 13 trong hình dưới đây.

nhập mô tả hình ảnh ở đây

Nhưng trở nên xa lạ ...

Nếu bất kỳ đối số nào là lỗi, thì ANDsẽ trả về lỗi đầu tiên . Ngoại trừ , nếu bất kỳ đối số nào là một chuỗi ký tự, thì giá trị trả về là#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)
cho TRUE nếu B2 trống không trống

=AND(B2,TRUE) Nếu
=AND(B2="",TRUE)bạn phải viết giá trị (B2 return return True) và logic thứ 2 là True và sẽ trả về True
=IF(B2,TRUE,FALSE)nên =IF(B2="",TRUE,FALSE)sẽ cho True
=AND(IF(B2,TRUE,FALSE),TRUE)nên =AND(IF(B2="",TRUE,FALSE),TRUE)sẽ cho True
Thử luôn để viết tất cả bài kiểm tra và đừng nghĩ Excel sẽ làm.
Luôn luôn nhớ Logical Test, trong các công thức của bạn không kiểm tra B2
Cách sử dụng hàm IF
Excel VÀ Hàm


8
Tôi nghĩ rằng bạn đã bỏ lỡ điểm OP. = ISBLANK (B2) chỉ để chứng minh rằng ô B2 trống. = AND (B2, TRUE) có nghĩa là để kiểm tra giá trị boolean của ô B2. Sau đó, cách duy nhất này đánh giá thành TRUE là nếu ô B2 ước tính thành TRUE. Điều này sau đó bị mâu thuẫn bởi thử nghiệm sau, = IF (B2, TRUE, FALSE) trả về SAI. Đây là một câu hỏi tuyệt vời vì tôi không biết Excel bỏ qua một số giá trị ô thay vì đánh giá chúng thành giá trị boolean (TRUE hoặc FALSE).
linhartr22

6
Tại sao điều này được nâng cao? AND(B2,TRUE)chắc chắn không nên AND(B2="",TRUE)trong bối cảnh của câu hỏi.
Dmitry Grigoryev
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.