Cú pháp thể hiện khi dùng SUMPRODUCT

Chia sẻ bởi:hands
★★★★★
Quảng cáo

Có nhiều cú pháp thể hiện khi dùng SUMPRODUCT, nhưng xin bạn cứ nhớ thuộc lòng cú pháp tôi viết dưới đây
SUMPRODUCT((Vùng 1 = d/k1)*(Vùng 2 = d/k2)*(…….)*(Vùng tính tổng))
Nếu không có Vùng tính tổng thì công thức trên sẽ thành ĐẾM (thay vì SUM)
Cú pháp trên là hoàn hảo nhất so với bất cứ cú pháp nào vì nó tổng hợp được trên các mảng có kích thước khác nhau (mà các kiểu viết khác không thể làm được)

SUMPRODUCT cho phép hoạt động khi kích thước mảng không bằng nhau nhưng với điều kiện phải viết theo cú pháp:

=SUMPRPDUCT((Vùng điều 1)*(Vùng điều 2)*(Vùng điều 3)*(......)*(Vùng kết quả))

Vấn đề em thắc mắc là mặc dù đã sửa rồi KQ tháng 1 của Cty A lại ra bằng 0 nhỉ? Nếu đúng ra nó phải là 200.546.667, phiền các bác xem lại hộ em với

Cứ ý công thức ở trên mà làm thì sao kết quả =0 được cơ chứ —> Xem file đây

Cảm ơn thày em tìm ra nguyên nhân rùi, tại em không đóng mở ngoặc () thành phần MONTH($A$4:$A$36)=A42, xin thày giải thích giúp em từ công thức của thày SUMPRODUCT((MONTH($A$4:$A$36)=A42)*($B$4:$B$36=B42)*($C$4:$C$36)) nếu em bỏ đóng mở ngoặc thành phần thứ 3 đi thành SUMPRODUCT((MONTH($A$4:$A$36)=A42)*($B$4:$B$36=B42)*$C$4:$C$36) thì vẫn OK mà bỏ đóng mở ngoặc thành phần thứ nhất tức công thức thành SUMPRODUCT(MONTH($A$4:$A$36)=A42*($B$4:$B$36=B42)*($C$4:$C$36)) thì lại không được (kết quả bằng 0) ah?

Bạn nói sao chứ nếu bỏ dấu ngoặc nhất hay cuối gì thì nó cũng báo lỗi liền, làm gì ra kết quả
Nguyên tắc về cú pháp người ta ghi thế thì mình cứ theo thôi

Được mà thày nếu thày cứ thử bỏ đóng mở ngoặc của $C$4:$C$36 thì kết quả vẫn OK. Thực ra em muốn tìm hiểu bản chất của nó thôi, chứ cứ đóng mở ngoặc là đúng là "chắc ăn" hơn.

Vậy chắc máy bạn nó sao ấy chứ tôi thử rồi mới nói bạn à —> Nguyên tắc của công thức luôn luôn là: Tổng số dấu ( phải bằng với tổng số dấu ) —> Tức số dấu ngoặc mở luôn = số dấu ngoặc đóng
Vậy không lý gì trong công thức lại có 5 dấu ( mà chỉ có 4 dấu )
Không tin cứ kêu ai đó thử là biết liền

nếu bỏ đóng mở ngoặc thành phần thứ nhất tức công thức thành SUMPRODUCT(MONTH($A$4:$A$36)=A42*($B$4:$B$36=B42)*($C$4:$C$36)) thì lại không được (kết quả bằng 0) ah?

—–Mình thấy hàm sumproduct nếu bỏ dấu ngoặc ở đầu:

=SUMPRODUCT(MONTH($A$4:$A$36)=A42*($B$4:$B$36=B42)*($C$4:$C$36))

– kết quả = 0 là do hàm ưu tiên tính các phần tử trong () trước xong đến tính tiếp đến dấu * cuối cùng mới tính đến dấu =. Như công thức trên hàm sẽ tính các thành phần:
– MONTH($A$4:$A$36) ra mảng các tháng (1)
A42*($B$4:$B$36=B42)*($C$4:$C$36) ra 1 mảng (2)
—> cuối cùng so 2 mảng (1) = (2) mảng này chắc chắn là false do vậy kết quả =0.

nếu bỏ đóng mở ngoặc thành phần thứ 3 đi thành SUMPRODUCT((MONTH($A$4:$A$36)=A42)*($B$4:$B$36=B42)*$C$4:$C$36) thì vẫn OK
-Nếu theo như quy luật ưu tiên tính toán trong hàm () tính trước, * tính sau thì.

+ Hàm tính: (MONTH($A$4:$A$36)=A42) ra 1 mảng.
+($B$4:$B$36=B42) ra 1 mảng
+$C$4:$C$36 hay ($C$4:$C$36) cũng ra 1 mảng như nhau.
– Các mảng này thỏa mãn thì cho kết quả thôi.
*, Nói chung các hàm đều tính toán trong ngoặc trước, xong rồi đến nhân chia cộng trừ…chứ không riêng gì sumproduct!

P/S: Dạ đấy là theo em nghĩ vậy. Nếu không đúng thì các thầy, cô sửa sai giúp!

Lập luận của nhóc linhngoc hoàn toàn chính xác ở chỗ Excel ưu tiên tính

– trong ngoặc trước ngoài ngoặc sau,
– ngoặc trong trước, ngoặc ngoài sau,
– nhân chia trước, cộng trừ sau,
– dấu bằng sau chót

Kết quả luôn luôn bằng 0 vì

=SUMPRODUCT(MONTH($A$4:$A$36)=A42*($B$4:$B$36=B42) *($C$4:$C$36))
Nhóm thứ nhất (màu xanh) là 1 mảng gồm các tháng của các ô A4:A36, là các số rải từ 1 đến 12

Nhóm thứ 2 (màu đỏ), là tích của 3 thành phần: 1 giá trị A42, 1 mảng True False, 1 mảng giá trị C4:C36, kết quả là 1 mảng các số

So sánh 2 mảng số đó với nhau bằng dấu =, thì ra 1 mảng mới, gồm toàn True, False

Và sum của True False, thì bằng 0.

Cái đó thì em thừa nhận, nhưng máy em công thức như sau =SUMPRODUCT(MONTH($A$4:$A$36)=A42*($B$4:$B$36=B42) *$C$4:$C$36)
vẫn ra đáp số đúng (thày ndu thử thì bị lỗi) vậy máy các bác như thế nào trong THợp này?

Ra kết quả zero chứ? Nhưng vẫn ra kết quả, không lỗi.
Chắc ndu nhầm là chỉ bỏ 1 dấu ( hoặc 1 dấu ). Thực sự là bỏ đi 1 cặp () lận. Chỉ ra kết quả sai thôi chứ không lỗi.

em thấy Sumproduct một số trường hợp dùng dấu, (=SUMPRODUCT(D4:CD4,D7:CD7)) nhưng một số trường hợp dấu , không được phải chuyển sang dấu nhân (*) tức công thức trên là SUMPRODUCT((D4:CD4)*(D7:CD7)). Vậy bản chất của nó thế nào ah?

Bản chất vẫn như nhau, chỉ là cách thể hiện của mỗi người.
Tuy nhiên, trong các kiểu thể hiện hàm SUMPRODUCT thì cách dùng dấu nhân là ưu việt nhất:
– Khỏi lo dấu phân cách khác nhau trên từng máy tính (có máy dùng dấu phẩy, có máy dùng dấu chấm phẩy)
– Có thể thực hiện tính toán trên các mảng không cùng kích thước <— Và đây chính là ưu điểm cần quan tâm của nó
Chính vì lẽ đó, bây giờ học SUMPRODUCT, tốt nhất bạn nên dùng dấu nhân, mấy dấu khác khỏi cần quan tâm đến làm gì
(Có người nói cách dùng dấu sẽ cho tốc độ nhanh hơn dùng dấu * , Tôi thì không tin gì mấy, nếu có thì chắc là chênh lệch cũng không đáng kể. Với dữ liệu lớn, SUMPRODUCT nhiều điều kiện thì 2 cách này cũng "lết bánh" như nhau mà thôi)

Khóa học Power PI – Ứng dung trong Nhân sự
Khóa học SprinGO phù hợp

Khóa học Power PI – Ứng dung trong Nhân sự

TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...

Xem khóa học
★★★★★ 5 ★ 1 👤 2 ▥ 0
Quảng cáo

Bạn nên đọc

2 Responses

  1. hands says:

    Trong các ứng dụng về công thức mãng mình được biết thì dạng công thức mãng dạng sum nhiều điều kiện là mình tâm đắc nhất vì cú pháp đơn giản, khi kết hợp với những hàm khác thì nó rất linh hoạt , giải quyết rất nhiều tình huống trước đây mình xử lý bằng hàm thông thường rất vất vã, hình như nó tính hơi lâu nhưng kết quả rất ưng ý
    Ví dụ
    1/ sum nhiều if – thay thế một macro rút trích rồi tính tổng
    vd:tính tiền thu được do bán mặt hàng là "sơn" thời gian từ 01/06/07 ( tungay) đến 30/06/07( denngay)
    {sum(if(ngay=>tungay,1,0)*if(ngay<=denngay,1,0)*if(mat_hang="son",1,0)*tien)}
    2/ Sumproduct nhiều if
    vd:tính tổng diện tích các thửa ruộng ấp A, xã B, Huyện C
    {sum(if(ap="a",1,0)*if(xa="b",1,0)*if(huyen="c",1,0)*dai*rong)}
    3/ count nhiều if
    vd: đếm số sv điểm trên trung bình là nam,lớp B, khoa C, Trường D
    {sum(if(diem>=5,1,0)*if(gioitinh="nam",1,0)*if(lop="b",1,0)*if(khoa="c",1,0)*if(truong="d",1,0)}
    4/max nhiều if
    vd:tự động nhảy số hóa đơn thứ mấy xuất cho đơn vị A, chứ không phải là STT hóa đơn, stt hóa đơn =max(stt_hd)
    {max(if(dv="a",1,0)*shd_dv)}
    5/ Vlookup_if
    vd: tìm trong vùng dữ liệu cột 1 mã máy bằng AAA, cột ngày di chuyển=gần nhất, xem nơi đến là nơi nào ( tìm giá trị cột noi_den )
    – kết hợp hàm findtwoconditions trên giaiphapexcel và hàm max_if trên

    Bạn ơi, có thể cho mình xin file exel ví dụ minh họa cho cá công thức trên được ko.
    mình làm thử rồi mà ko ra kết quả.
    Thanks bạn ^^

    Bạn tìm hiểu thử nha
    Chúc mọi người cuối tuần vui vẻ

  2. hands says:

    Bác cho em hỏi — có nghĩa gì ạ? em rất hay thấy mà ko hiểu

    Dựa vào toán học:

    • -(-a) = –a = a
    • Vd:
    • =-TEXT(125,"0")=-125
    • =–TEXT(125,"0")=125

    Vận dụng điều này để "ép" a đang là dạng "chuỗi số" (Vd: chuỗi '12345) về thành số tính toán (12,345).
    Có nhiều cách đưa "chuỗi số" về dạng số, gồm:

    • VALUE( "chuỗi số" a )
    • "chuỗi số" a nhân hay chia 1 (*1 ; /1), hoặc cộng hay trừ (+0 ; -0)
    • "chuỗi số" a cộng/trừ/nhân/chia/căn/lũy thừa với một "chuỗi số" khác.
    • Vd: =TEXT(10,"0")^TEXT(3,"0")=1000

    Thân

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm