Tôi Thay Thế 15 Công Thức Excel Bằng Một Hàm REDUCE Duy Nhất

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.

XEM THÊM:  Làm Chủ Hàm IFERROR Trong Excel: 5 Cách Kết Hợp Xử Lý Lỗi Hiệu Quả Nhất

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.

XEM THÊM:  Hàm BYCOL 2024: Cách Tính Tổng Theo Cột Nhanh Gấp 10 Lần

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.

XEM THÊM:  Hàm AND Excel: 5 Ví Dụ Thực Tế Giúp Bạn Xử Lý Dữ liệu Nhanh Gấp 3 Lần

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:

  1. Tuần 1: Tính tổng và tích đơn giản
  2. Tuần 2: Thêm điều kiện IF cơ bản
  3. Tuần 3: Kết hợp với ISEVEN, ISODD, MONTH
  4. 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.

Related Posts

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *