Báo cáo tháng của tôi từng chứa 15 công thức khác nhau trải dài trên 8 sheets. Mỗi lần dữ liệu thay đổi, tôi phải kiểm tra từng công thức để đảm bảo logic vẫn đúng. Sau khi khám phá hàm REDUCE trong Excel 365, toàn bộ hệ thống này rút gọn thành một công thức duy nhất có thể tái sử dụng.

REDUCE làm gì mà thay thế được nhiều công thức
Hàm REDUCE biến một mảng dữ liệu thành một giá trị duy nhất thông qua phép tính tích lũy. Thay vì tạo nhiều công thức riêng lẻ cho từng điều kiện, REDUCE xử lý toàn bộ logic trong một lần chạy.
Cú pháp cơ bản:
=REDUCE(giá_trị_khởi_tạo, mảng_dữ_liệu, LAMBDA(tích_lũy, giá_trị_hiện_tại, phép_tính))
Ba thành phần chính:
- Giá trị khởi tạo: Điểm bắt đầu cho phép tính (thường là 0 hoặc 1)
- Mảng dữ liệu: Phạm vi cần xử lý
- LAMBDA: Hàm tùy chỉnh định nghĩa cách xử lý từng phần tử
Ví dụ cụ thể để tính tổng: =REDUCE(0, A1:A10, LAMBDA(tổng, số, tổng + số)). Công thức này bắt đầu từ 0, duyệt qua từng ô trong A1:A10 và cộng dần vào biến tổng.
Case thực tế: Tính tổng doanh thu theo điều kiện
File báo cáo cũ của tôi có 5 công thức SUMIF khác nhau để tính tổng theo các nhóm sản phẩm. Mỗi công thức kiểm tra một điều kiện riêng: điện tử, thời trang, thực phẩm, nội thất và các mặt hàng còn lại.
Cách cũ với SUMIF:
=SUMIF(B:B,"Điện tử",C:C)
=SUMIF(B:B,"Thời trang",C:C)
=SUMIF(B:B,"Thực phẩm",C:C)
Mỗi lần thêm nhóm sản phẩm mới phải tạo thêm công thức và cập nhật tất cả reference trong dashboard.
Cách mới với REDUCE:
=REDUCE(0, C2:C100, LAMBDA(tổng, doanh_thu,
IF(INDEX(B:B,ROW(doanh_thu))="Điện tử", tổng+doanh_thu, tổng)
))
Công thức này kiểm tra điều kiện trực tiếp trong LAMBDA. Khi cần thêm điều kiện, chỉ cần sửa phần IF thay vì tạo công thức mới.
Đếm số lượng có điều kiện thay vì COUNTIF
Trước đây tôi dùng 3 công thức COUNTIF để đếm đơn hàng theo trạng thái: đang xử lý, hoàn thành và bị hủy. Dashboard hiển thị ba ô riêng biệt cho mỗi metric.
COUNTIF truyền thống:
Đang xử lý: =COUNTIF(D:D,"Đang xử lý")
Hoàn thành: =COUNTIF(D:D,"Hoàn thành")
Bị hủy: =COUNTIF(D:D,"Bị hủy")
REDUCE với logic phức tạp:
=REDUCE(0, D2:D100, LAMBDA(đếm, trạng_thái,
IF(OR(trạng_thái="Hoàn thành", trạng_thái="Đang xử lý"), đếm+1, đếm)
))
Công thức này đếm cả hai trạng thái cùng lúc. Muốn đếm riêng từng loại, tạo một REDUCE duy nhất trả về mảng kết quả thay vì nhiều COUNTIF rời rạc.
Xử lý số chẵn và số lẻ trong một công thức
Báo cáo phân tích của tôi cần tách tổng số chẵn và số lẻ từ cột dữ liệu. Cách cũ dùng hai công thức SUMIF kết hợp với ISEVEN và ISODD.
Hai công thức riêng biệt:
Tổng số chẵn: =SUMPRODUCT((ISEVEN(A2:A50))*(A2:A50))
Tổng số lẻ: =SUMPRODUCT((ISODD(A2:A50))*(A2:A50))
REDUCE tính cả hai:
=REDUCE(0, A2:A50, LAMBDA(tổng, số,
IF(ISEVEN(số), tổng+số, tổng)
))
Để tính số lẻ, chỉ cần thay ISEVEN thành ISODD trong cùng pattern. Lợi thế thực sự là khi cần mở rộng logic: thêm điều kiện “chia hết cho 5” hay “lớn hơn 100” chỉ cần sửa phần IF.
Tạo công thức động thay vì hard-code
File Excel cũ của tôi có 7 công thức tính phần trăm hoàn thành cho 7 dự án khác nhau. Mỗi công thức reference đến các range khác nhau và công thức phải update thủ công khi thêm dự án mới.
Hard-coded formulas:
Dự án A: =COUNTIF(E2:E20,"Xong")/COUNTA(E2:E20)
Dự án B: =COUNTIF(F2:F20,"Xong")/COUNTA(F2:F20)
REDUCE với logic chung:
=REDUCE(0, E2:E20, LAMBDA(đếm, trạng_thái,
IF(trạng_thái="Xong", đếm+1, đếm)
)) / COUNTA(E2:E20)
Công thức này áp dụng cho bất kỳ dự án nào chỉ bằng cách thay đổi range. Copy sang cột khác không cần chỉnh sửa logic bên trong.
Kết hợp nhiều điều kiện phức tạp
Case khó nhất trong file cũ: tính tổng doanh thu cho sản phẩm điện tử có giá trị đơn hàng trên 5 triệu đồng và được giao trong quý 2. Trước đây cần 3 công thức trung gian và một công thức tổng hợp.
Chuỗi công thức cũ:
Bước 1: Lọc danh mục = "Điện tử"
Bước 2: Kiểm tra giá trị > 5000000
Bước 3: Kiểm tra tháng thuộc quý 2
Bước 4: SUM kết quả
REDUCE xử lý một lượt:
=REDUCE(0, C2:C100, LAMBDA(tổng, doanh_thu,
LET(
dòng, ROW(doanh_thu),
danh_mục, INDEX(B:B, dòng),
tháng, MONTH(INDEX(A:A, dòng)),
IF(AND(danh_mục="Điện tử", doanh_thu>5000000, tháng>=4, tháng<=6),
tổng+doanh_thu, tổng)
)
))
Sử dụng LET để định nghĩa biến giúp công thức dễ đọc hơn. Mỗi điều kiện được kiểm tra trong một IF statement duy nhất thay vì chain nhiều công thức.
Giá trị ban đầu quan trọng với phép nhân
Một lỗi tôi mắc phải: dùng 0 làm giá trị khởi tạo cho phép tính tích. Kết quả luôn ra 0 vì 0 nhân với bất kỳ số nào cũng bằng 0.
Sai:
=REDUCE(0, A1:A5, LAMBDA(tích, số, tích*số))
Công thức này luôn trả về 0 dù A1:A5 chứa giá trị gì.
Đúng:
=REDUCE(1, A1:A5, LAMBDA(tích, số, tích*số))
Với giá trị khởi tạo là 1, phép nhân hoạt động chính xác. Tương tự, khi tính tổng dùng 0, khi tính tích dùng 1, khi nối chuỗi dùng “”.
Performance với dataset lớn
File Q4 2024 của tôi có 50,000 dòng giao dịch. Khi dùng 15 công thức riêng lẻ, file mở trong 8 giây và recalculate mỗi lần nhập liệu mất 3 giây.
Trước khi dùng REDUCE:
- Thời gian mở file: 8 giây
- Thời gian tính toán: 3 giây mỗi lần
- Kích thước file: 12MB
Sau khi chuyển sang REDUCE:
- Thời gian mở file: 3 giây
- Thời gian tính toán: 1 giây
- Kích thước file: 9MB
REDUCE xử lý dữ liệu trong một lần duyệt thay vì 15 lần riêng biệt. Excel không phải maintain nhiều calculation chains, dẫn đến performance tốt hơn.
Khi nào không nên dùng REDUCE
REDUCE không phải lúc nào cũng là lựa chọn tốt nhất. Nếu chỉ cần tính tổng đơn giản, SUM nhanh hơn và dễ đọc hơn. COUNTIF straightforward hơn REDUCE khi chỉ đếm một điều kiện.
Dùng SUM thay vì REDUCE:
=SUM(A1:A100) // Rõ ràng, nhanh
=REDUCE(0, A1:A100, LAMBDA(a,b,a+b)) // Phức tạp không cần thiết
REDUCE tỏa sáng khi:
- Có nhiều điều kiện phức tạp
- Logic cần customize
- Kết hợp nhiều operations trong một công thức
- Cần maintain và mở rộng logic sau này
Requirements và compatibility
REDUCE chỉ available trong Excel 365 và Excel 2024. Các phiên bản cũ hơn như Excel 2019 hay 2016 không support hàm này. File chứa REDUCE sẽ báo lỗi khi mở trong Excel cũ.
Để check version Excel: File > Account > About Excel. Nếu thấy “Microsoft 365” hoặc “Excel 2024”, bạn có thể dùng REDUCE. Nếu thấy số version như “2019” hay “2016”, cần upgrade hoặc dùng công thức truyền thống.
LAMBDA function là prerequisite cho REDUCE. Không thể dùng REDUCE mà không hiểu cách LAMBDA hoạt động. Nên làm quen với LAMBDA trước khi dive deep vào REDUCE.
Bắt đầu với ví dụ đơn giản
Thay vì convert ngay 15 công thức phức tạp, tôi bắt đầu với case đơn giản: tính tổng các số trong một range. Sau khi hiểu cách REDUCE hoạt động, dần dần thêm điều kiện IF, kết hợp với INDEX và LET.
Roadmap học REDUCE:
- Tuần 1: Tính tổng và tích đơn giản
- Tuần 2: Thêm điều kiện IF cơ bản
- Tuần 3: Kết hợp với ISEVEN, ISODD, MONTH
- Tuần 4: Sử dụng LET cho công thức phức tạp
Excel 365 có hàm MAP và SCAN cùng family với REDUCE. MAP biến đổi mảng thành mảng mới, SCAN giống REDUCE nhưng trả về mảng các giá trị trung gian. Học cả ba hàm này mở ra khả năng xử lý dữ liệu Excel mạnh mẽ không cần VBA.
