Chia sẻ
"REDUCE gấp mảng thành 1 giá trị, SCAN trả mảng tích lũy. Kết hợp LAMBDA để tạo logic lặp tùy chỉnh. Running total, compound interest, Fibonacci — mọi thứ đều khả thi."
REDUCE và SCAN là 2 hàm lặp (iterative) mạnh nhất trong Excel 365. REDUCE gấp mảng thành 1 giá trị đơn, SCAN tạo mảng kết quả tích lũy. Kết hợp với LAMBDA, chúng biến Excel thành ngôn ngữ lập trình hàm. Bài viết giải thích từ cơ bản đến ứng dụng nâng cao.
REDUCE & SCAN — Lặp Hàm (Functional Iteration)
Trong lập trình hàm, có 2 thao tác lặp cốt lõi:
Fold/Reduce: Gấp toàn bộ mảng thành 1 giá trị (vd: tổng, tích, ghép chuỗi).
Scan: Giống Reduce nhưng trả về TẤT CẢ kết quả trung gian (vd: tổng tích lũy).
SUM là reduce đơn giản nhất: SUM({1,2,3}) = 6. Nhưng REDUCE cho phép bạn tùy chỉnh thao tác lặp bằng LAMBDA — mở ra khả năng vô hạn.
Hàm REDUCE — Gấp Mảng Thành 1 Giá Trị
Cú pháp
=REDUCE(initial_value, array, function)
initial_value — Giá trị khởi đầu (accumulator)
array — Mảng cần lặp qua
function — LAMBDA(accumulator, value, ...)
accumulator = kết quả tích lũy
value = phần tử hiện tạiVí dụ 1: Tích các phần tử (Product)
// Tích của {2, 3, 4, 5}:
=REDUCE(1, {2,3,4,5}, LAMBDA(acc, val, acc * val))
// Bước 1: acc=1, val=2 → 1×2 = 2
// Bước 2: acc=2, val=3 → 2×3 = 6
// Bước 3: acc=6, val=4 → 6×4 = 24
// Bước 4: acc=24, val=5 → 24×5 = 120
// Kết quả: 120 (tương đương PRODUCT)Ví dụ 2: Ghép chuỗi với dấu phẩy
// Nối {"An", "Bình", "Chi"} → "An, Bình, Chi":
=REDUCE("", A2:A4, LAMBDA(acc, val,
IF(acc="", val, acc & ", " & val)
))
// Tương đương TEXTJOIN(", ", TRUE, A2:A4)
// Nhưng REDUCE cho phép logic phức tạp hơn TEXTJOINVí dụ 3: Đếm ký tự unique trong chuỗi
=LET(
text, "HELLO WORLD",
chars, MID(text, SEQUENCE(LEN(text)), 1),
unique_chars, UNIQUE(chars),
REDUCE(0, unique_chars, LAMBDA(acc, ch,
IF(ch<>" ", acc+1, acc)
))
)
// Đếm ký tự khác nhau (không kể space): 7Ví dụ 4: Factorial (giai thừa)
// 5! = 5×4×3×2×1:
=REDUCE(1, SEQUENCE(5), LAMBDA(acc, n, acc * n))
// Kết quả: 120
// Tương đương FACT(5) nhưng minh họa cách REDUCE hoạt độngHàm SCAN — Tích Lũy Với Kết Quả Trung Gian
Cú pháp
=SCAN(initial_value, array, function)
// Giống hệt REDUCE, nhưng trả về MẢNG kết quả trung gian
// Mảng output có cùng kích thước với array inputVí dụ 1: Tổng tích lũy (Running Total)
// {10, 20, 30, 40, 50}:
=SCAN(0, A2:A6, LAMBDA(acc, val, acc + val))
// Kết quả: {10, 30, 60, 100, 150}
// Bước 1: 0+10 = 10
// Bước 2: 10+20 = 30
// Bước 3: 30+30 = 60
// Bước 4: 60+40 = 100
// Bước 5: 100+50 = 150
// → Perfect cho cột "Số dư lũy kế" trong sổ sách kế toánVí dụ 2: Running Max/Min
// Running Max (giá trị lớn nhất tính đến thời điểm hiện tại):
=SCAN(0, B2:B100, LAMBDA(acc, val, MAX(acc, val)))
// → Mỗi ô = max từ đầu đến dòng đó
// Running Min:
=SCAN(9999999, B2:B100, LAMBDA(acc, val, MIN(acc, val)))
// initial_value = số rất lớn để MIN hoạt động đúngVí dụ 3: Đánh số nhóm liên tiếp
// Dữ liệu cột A: IT, IT, Sales, Sales, Sales, IT, IT
// Tạo Group ID mỗi khi giá trị thay đổi:
=SCAN(1, SEQUENCE(ROWS(A2:A8)-1), LAMBDA(acc, i,
IF(INDEX(A2:A8, i+1) <> INDEX(A2:A8, i), acc+1, acc)
))
// Kết quả: 1, 1, 2, 2, 2, 3, 3
// → Group 1: IT, Group 2: Sales, Group 3: ITỨng Dụng Thực Tế
Tính lãi kép compound interest
// Vốn 100tr, lãi suất mỗi tháng nằm trong B2:B13:
=SCAN(100000000, B2:B13, LAMBDA(acc, rate,
acc * (1 + rate)
))
// Kết quả: số dư cuối mỗi tháng (12 giá trị)
// Lãi suất thay đổi từng tháng → SCAN xử lý perfectFibonacci sequence
// Sinh 10 số Fibonacci:
=REDUCE(
{0, 1},
SEQUENCE(8),
LAMBDA(acc, _,
VSTACK(acc,
INDEX(acc, ROWS(acc)-1) + INDEX(acc, ROWS(acc))
)
)
)
// Kết quả: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34So Sánh Với Các Hàm Tổng Hợp
Thao tác | Hàm truyền thống | REDUCE/SCAN |
|---|---|---|
Tổng | SUM | REDUCE(0, arr, LAMBDA(a,v, a+v)) |
Tích | PRODUCT | REDUCE(1, arr, LAMBDA(a,v, a*v)) |
Nối chuỗi | TEXTJOIN | REDUCE("", arr, LAMBDA(...)) |
Tổng tích lũy | SUM + $ lock | SCAN(0, arr, LAMBDA(a,v, a+v)) |
Logic tùy chỉnh | ❌ Không thể | ✅ LAMBDA cho mọi logic |
Câu Hỏi Thường Gặp (FAQ)
REDUCE có giống SUM không?
REDUCE(0, arr, LAMBDA(a,v, a+v)) cho kết quả giống SUM. Nhưng REDUCE mạnh hơn vì LAMBDA cho phép BẤT KỲ logic nào — nhân, nối, lọc, đếm có điều kiện — thay vì chỉ cộng.
SCAN trả về array — phải dùng Dynamic Array?
Đúng. SCAN trả array nên cần Excel 365 (Dynamic Array engine). Kết quả tự spill vào các ô bên dưới. Trên Excel cũ, SCAN không khả dụng.
initial_value nên đặt bao nhiêu?
Tùy theo phép tính: cộng → 0, nhân → 1, nối chuỗi → "", max → -9999999, min → 9999999. Initial value là "identity element" — giá trị không ảnh hưởng phép tính đầu tiên.
Tổng Kết
REDUCE gấp mảng thành 1 giá trị, SCAN tạo mảng kết quả tích lũy. Cả 2 dùng LAMBDA để biến Excel thành ngôn ngữ lập trình hàm thực sự. Từ running total đến Fibonacci, từ compound interest đến string processing — REDUCE và SCAN mở ra khả năng mà trước đây chỉ VBA mới làm được.
Bình luận
Đăng nhập để tham gia bình luận
Đăng nhậpNhận bài viết mới nhất
Đăng ký để nhận thông báo khi có bài viết mới. Không spam, chỉ kiến thức chất lượng.
Bài viết liên quan
Khám phá thêm các bài viết cùng chủ đề
