Tại sao dùng "hàm OR" trong "hàm mảng" cho kết quả không đúng? (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

tronghv77

Thành viên mới
Tham gia
3/3/13
Bài viết
24
Được thích
4
Anh chị xem giúp em tại sao hàm này của em không đúng với ak?
Chân thành cảm ơn!
Mã:
{=SUM(IF(OR(C2:C11="Bào Ngư",C2:C11=" Nghêu"),G2:G11,""))}
 

File đính kèm

Em chỉ phân tích theo ý của em hiểu thôi ạ, nếu mà sai mong sự giúp đỡ của Anh Chị, công thức trên là một dạng công thức mảng, em sẽ phân tích công thức từ trong ra ngoài.

Đầu tiên là hàm OR : OR(C2:C11="Bào Ngư",C2:C11=" Nghêu") hàm này thì không có gì, chỉ lấy những giá tía trị có "Bào ngư", hoặc lấy " Nghêu".
Tiếp theo hàm IF : IF(OR(C2:C11="Bào Ngư",C2:C11=" Nghêu"),G2:G11,""), Nếu một trong hai vùng có C2:C11="Bào Ngư" hoặc C2:C11=" Nghêu" thì sẽ trả về giá trị tổng từ G2:G11, nếu không trả về trắng .Thì hiển nhiên tới đây kết quả sẽ là sum(G2:G11).
Còn sum thì là đơn giản tính tổng giá trị . Vậy kết quả cuối cùng cũng chính là giá trị mà hàm If trả về
.


Như vậy, kết quả sẽ trả về là không đúng, bởi nó sẽ tính tổng từ G2:G11.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Em chỉ phân tích theo ý của em hiểu thôi ạ, nếu mà sai mong sự giúp đỡ của Anh Chị, công thức trên là một dạng công thức mảng, em sẽ phân tích công thức từ trong ra ngoài.

Đầu tiên là hàm OR : OR(C2:C11="Bào Ngư",C2:C11=" Nghêu") hàm này thì không có gì, chỉ lấy những giá tía trị có "Bào ngư", hoặc lấy " Nghêu".
Tiếp theo hàm IF : IF(OR(C2:C11="Bào Ngư",C2:C11=" Nghêu"),G2:G11,""), Nếu một trong hai vùng có C2:C11="Bào Ngư" hoặc C2:C11=" Nghêu" thì sẽ trả về giá trị tổng từ G2:G11, nếu không trả về trắng .Thì hiển nhiên tới đây kết quả sẽ là sum(G2:G11).
Còn sum thì là đơn giản tính tổng giá trị . Vậy kết quả cuối cùng cũng chính là giá trị mà hàm If trả về
.

Như vậy, kết quả sẽ trả về là không đúng, bởi nó sẽ tính tổng từ G2:G11.

Cảm ơn bạn nguyencanh160890, mình thấy rất hợp lý rồi!

Và bạn có thể sửa nó thành đúng được không (tức là vẫn dùng OR ấy) :)?
 
Lần chỉnh sửa cuối:
Em nghĩ không phải chỗ hàm OR đâu ạ, mà chỗ G2:G11, nếu Anh thử công thức này
=SUM(IF(OR(C2:C11="Bào Ngư",C2:C11=" Nghêu"),SUMIF(C2:C11,"Bào Ngư",G2:G11)+SUMIF(C2:C11,"Nghêu",G2:G11),"") vào ô cách 3 đúng đó ạ!
 
C2:C11="Bào Ngư" trả về TRUE nếu có "Bào Ngư" trong vùng C2:C11
C2:C11="Nghêu" trả về TRUE nếu có "Nghêu" trong vùng C2:C11
OR hai cái đó lại, tức là nếu C2:C11 có 1 trong 2 loại hải sản này sẽ SUM toàn bộ vùng G2:G11.

Trong khi ý của bạn là chỉ cộng các dòng có 1 trong 2 loại, có nhiều cách:
Nếu dùng hàm mảng, kết thúc bằng Ctrl-Shift-Enter:
Mã:
=SUM(IF(C2:C11="Bào ngư",G2:G11,IF(C2:C11="Nghêu",G2:G11,0)))
Hoặc ngắn gọn hơn chỉ cần Enter:
Mã:
=SUMPRODUCT(((C2:C11="Bào ngư")+(C2:C11="Nghêu"))*G2:G11)
 
Em nghĩ không phải chỗ hàm OR đâu ạ, mà chỗ G2:G11, nếu Anh thử công thức này
=SUM(IF(OR(C2:C11="Bào Ngư",C2:C11=" Nghêu"),SUMIF(C2:C11,"Bào Ngư",G2:G11)+SUMIF(C2:C11,"Nghêu",G2:G11),"") vào ô cách 3 đúng đó ạ!

Cảm ơn bạn nhiều, bạn giỏi quá!
}}}}}
 
Lần chỉnh sửa cuối:
=SUM(IF(OR(C2:C11="Bào Ngư",C2:C11=" Nghêu"),SUMIF(C2:C11,"Bào Ngư",G2:G11)+SUMIF(C2:C11,"Nghêu",G2:G11),"")

:D t vừa hiểu được công thức này, mặc dù đã dùng OR() nhưng nội dung vẫn chưa có gì thực sự mới (trùng với cách 1). Dù sao cũng cảm ơn bạn nhiều, vì đã cố gắng giúp đỡ!
 
:D t vừa hiểu được công thức này, mặc dù đã dùng OR() nhưng nội dung vẫn chưa có gì thực sự mới (trùng với cách 1). Dù sao cũng cảm ơn bạn nhiều, vì đã cố gắng giúp đỡ!

Thực ra lỗi này là chỗ giá trị trả về mà...em phân tích rồi ấy thôi. Em nghĩ đơn giản thôi, dùng công thức của Bác Bebo SUM(IF(C2:C11="Bào ngư",G2:G11,IF(C2:C11="Nghêu",G2:G11,0))) ngắn gọn và dễ hiểu.
 
:D t vừa hiểu được công thức này,

=SUM(IF(OR(C2:C11="Bào Ngư",C2:C11=" Nghêu"),SUMIF(C2:C11,"Bào Ngư",G2:G11)+SUMIF(C2:C11,"Nghêu",G2:G11),"")

mặc dù đã dùng OR() nhưng nội dung vẫn chưa có gì thực sự mới (trùng với cách 1). Dù sao cũng cảm ơn bạn nhiều, vì đã cố gắng giúp đỡ!

Công thức lạ quá chỉ cần thế này là đủ

=SUMIF(C2:C11,"Bào Ngư",G2:G11)+SUMIF(C2:C11,"Nghêu",G2:G11)

sao phải loằng ngoằng chi nhỉ, chắc là học nhiều quá rùi đây
 
Công thức lạ quá chỉ cần thế này là đủ

=SUMIF(C2:C11,"Bào Ngư",G2:G11)+SUMIF(C2:C11,"Nghêu",G2:G11)

sao phải loằng ngoằng chi nhỉ, chắc là học nhiều quá rùi đây



Không đâu Anh, cách của Anh là cách 1 của Anh tronghv77 rồi hì hì, Anh í làm cách 3 Anh ạ!
p/s
Món quà của ANh tặng cho Chị em hôm 8-3 em vẫn chưa khám phá hết bí ẩn , khi em thay đổi format nó chỉ toàn số thôi ạ!em kém quá. Nhưng cảm ơn Anh.
 

Không đâu Anh, cách của Anh là cách 1 của Anh tronghv77 rồi hì hì, Anh í làm cách 3 Anh ạ!
p/s
Món quà của ANh tặng cho Chị em hôm 8-3 em vẫn chưa khám phá hết bí ẩn , khi em thay đổi format nó chỉ toàn số thôi ạ!em kém quá. Nhưng cảm ơn Anh.

ở cái này
=SUMIF(C2:C11,"Bào Ngư",G2:G11)+SUMIF(C2:C11,"Nghêu",G2:G11)

khác xa với công thức mảng sai này vì cái này luôn cộng tất cả khi 1 cell có Bào Ngư hoặc Nghêu - chỉ đúng khi =0 không có cái nào
{=SUM(IF(OR(C2:C11="Bào Ngư",C2:C11=" Nghêu"),G2:G11,""))}

có cần OR gì đầu

P/S: món quà đó chỉ cần gõ Y vào ô vàng là tạo cách chạy động tạo số 8-3 thế thôi mà, còn khám phá thì xem các công thức trong đó là bit ngay, chúc thành công

P/S2 uhm, có thể tôi nhầm là a ta làm rui, vì không down file kèm về
 
Lần chỉnh sửa cuối:
Lần chỉnh sửa cuối:
Em nghĩ kết thúc bài tập này ở đây thôi ạ! Cách gọn nhất cũng là cách là anh tronghv77 đã làm rồi. Em xin hết!/-*+//-*+/
 
C2:C11="Bào Ngư" trả về TRUE nếu có "Bào Ngư" trong vùng C2:C11
C2:C11="Nghêu" trả về TRUE nếu có "Nghêu" trong vùng C2:C11
OR hai cái đó lại, tức là nếu C2:C11 có 1 trong 2 loại hải sản này sẽ SUM toàn bộ vùng G2:G11.
bebo giải thích sai:

C2:C11="Bào Ngư" trả về 1 mảng true, false: Chỗ nào Bào Ngư thì true, ngược lại thì False

Tương tự:
C2:C11="Nghêu" trả về 1 mảng true, false: Chỗ nào Nghêu thì true, ngược lại thì False

Tuy nhiên hàm Or không dùng được cho mảng, vì kết quả hàm Or là 1 giá trị đơn, không phải là mảng. Nên ra kết quả sai.

Or-Mang.jpg
 
Lần chỉnh sửa cuối:
Cảm ơn bạn!



T đang liệt kê ra một số cách có thể dùng cho bài toán này để tiện so sánh :D



Cách của bạn là cách 1 (trong file excel đính kèm) :D

Vậy thì bạn lưu ý, hàm OR không làm theo nguyên tắc công thức mảng đâu,

Nó sẽ phá mảng và tính toán OR hết cho từng phần tử trong mảng

Cứ thử ví dụ sau sẽ hiểu
Gõ 3 sô 1 2 0 lần lượt vào 3 cells: A1 A2 A3

rồi tại 1 cell kết quả gõ công thức sau
=IF(OR(A1:A3=0,A1:A3=99),A1:A3,-999)

Bôi đen công thức rồi bấm F9 xem kết quả thế nào bạn tự suy luận nhé,
-------------
Sau đó gõ số liệu mới
1 2 5
thử tiếp xem sao

rui sẽ hiểu
 
bebo giải thích sai:

C2:C11="Bào Ngư" trả về 1 mảng true, false: Chỗ nào Bào Ngư thì true, ngược lại thì False
Em đồng ý đúng là C2:C11="BN" trả về 1 mảng.
Nhưng ý em là khi lồng vào OR(C2:C11="BN",...) thì C2:C11="BN" trả về giá trị đơn.
 
Vậy thì bạn lưu ý, hàm OR không làm theo nguyên tắc công thức mảng đâu,

Nó sẽ phá mảng và tính toán OR hết cho từng phần tử trong mảng

Cứ thử ví dụ sau sẽ hiểu
Gõ 3 sô 1 2 0 lần lượt vào 3 cells: A1 A2 A3

rồi tại 1 cell kết quả gõ công thức sau
=IF(OR(A1:A3=0,A1:A3=99),A1:A3,-999)

Bôi đen công thức rồi bấm F9 xem kết quả thế nào bạn tự suy luận nhé,
-------------
Sau đó gõ số liệu mới
1 2 5
thử tiếp xem sao

rui sẽ hiểu


Cảm ơn bạn!

Có lẽ t đã hiểu thêm được "đôi chút" về mảng rồi :D

bấm F9 xem kết quả thế nào

Cách này rất hay! hihi

 
Cảm ơn thầy ptm0412
(em mới vào diễn đàn nên chưa biết nhiều về thầy và các anh chị, nếu có gì sai sót trong cách xưng hô, mong anh chị và thầy lượng thứ!)

Em đã đọc phần phân tích trên của thầy, có lẽ e đã hiểu ra được một số thứ quan trọng rồi ạ :), cảm ơn thầy nhiều ạ!
 
Lần chỉnh sửa cuối:
Em đồng ý đúng là C2:C11="BN" trả về 1 mảng.
Nhưng ý em là khi lồng vào OR(C2:C11="BN",...) thì C2:C11="BN" trả về giá trị đơn.

Câu phát biểu đúng là: Hàm Or luôn trả về giá trị đơn, dù cho C2:C11="BN" trả về giá trị mảng.

Xem hình trong bài trên thì biết.
 
Bài này có nhiều cách làm: Có thể dùng SUMIF, SUMPRODUCT... nhưng nếu cố tình muốn dùng công thức mảng thì cũng không thể dùng OR hay AND
Với dạng bài toán tính tổng hoặc đếm nhiều điều kiện, OR sẽ được thay bằng dấu cộngAND được thay bằng dấu nhân
Vậy nên, nếu muốn dùng công thức mảng thì phải thế này:
Mã:
=SUM(IF((C2:C11="Bào Ngư")[COLOR=#ff0000]+[/COLOR](C2:C11="Nghêu"),G2:G11,""))
không có vụ OR, AND gì ở đây cả
Công thức trên, nếu biến đổi chút cũng có thể viết thành:
Mã:
=SUM(((C2:C11="Bào Ngư")[COLOR=#ff0000]+[/COLOR](C2:C11="Nghêu"))*(G2:G11))
Rồi thay SUM thành SUMPRODUCT thì:
Mã:
=SUMPRODUCT(((C2:C11="Bào Ngư")[COLOR=#ff0000]+[/COLOR](C2:C11="Nghêu"))*(G2:G11))
Công thức cuối cùng được cái chỉ cần Enter (khỏi phải bấm tổ hợp phím Ctrl + Shift + Enter)
-------------------------
Tóm lại, chỉ cần nhớ dòng màu đỏ ở trên
 
[URL="http://www.giaiphapexcel.com/forum/member.php?61139-ndu96081631"]ndu96081631 : Bạn này nói đã đủ tất cả ý rồi đấy. Đúng là khi rớ vào hàm mảng thì OR và AND nó ko còn được xài nữa mà lúc dó được thay bằng dấu + và dấu nhân. Tuy nhiên mình xin bổ sung 1 điểm nho nhỏ là điều này chỉ đúng với việc tạo ra mảng true, false ko trùng nhau (Tức ko có true+true) hay nói một cách dễ hiểu hơn là các bạn chỉ nên áp dụng cho trường hợp cột điều kiện là cột đơn, trường hợp điều kiện nằm ở 2 cột khác nhau thì hãy cẩn thận với phép nhân vì có thể xảy ra true+true=2.[/URL]
 

Bài viết mới nhất

Back
Top Bottom