
Chia sẻ
"Khám phá sức mạnh của Dynamic Arrays trong Excel 365: hàm FILTER, SORT, SORTBY, UNIQUE, SEQUENCE và LAMBDA. Hướng dẫn chi tiết 15+ ví dụ thực tế, so sánh cách cũ vs mới, kèm kỹ thuật kết hợp nâng cao."
Nếu bạn vẫn đang dùng VLOOKUP kết hợp IF lồng nhau để lọc dữ liệu, hoặc phải tạo helper column rồi sắor dùng Advanced Filter rồi copy kết quả sang ô khác — thì đã đến lúc nâng cấp lên Dynamic Arrays.
Dynamic Arrays (Mảng Động) là một cuộc cách mạng trong Excel 365. Thay vì trả về 1 giá trị, một công thức duy nhất có thể trả về hàng chục, hàng trăm kết quả — tự động "tràn" (spill) xuống các ô bên dưới. Không cần Ctrl+Shift+Enter, không cần helper column.
Trong bài viết này, mình sẽ hướng dẫn chi tiết 6 hàm mảng động quan trọng nhất: FILTER, SORT, SORTBY, UNIQUE, SEQUENCE và LAMBDA — kèm 15+ ví dụ thực tế mà bạn có thể áp dụng ngay vào công việc.

1. Dynamic Arrays Là Gì? — Spill Range Và Toán Tử #
Trước Excel 365, mỗi công thức chỉ trả về 1 giá trị cho 1 ô. Muốn lọc 10 dòng thỏa điều kiện? Bạn phải viết 10 công thức riêng biệt (hoặc dùng Advanced Filter).
Với Dynamic Arrays, một công thức duy nhất trả về toàn bộ kết quả. Excel tự động mở rộng vùng hiển thị — gọi là Spill Range. Nếu kết quả có 15 dòng, Excel sẽ chiếm 15 ô liên tiếp.
1.1 Toán tử # (Spill Reference)
Khi một công thức đã "spill" ra kết quả, bạn có thể tham chiếu toàn bộ vùng spill bằng toán tử #. Ví dụ, nếu công thức FILTER nằm ở ô D2 và spill ra 8 dòng, thì D2# sẽ tham chiếu toàn bộ 8 dòng đó.
// Công thức FILTER ở ô D2 trả về 8 kết quả
// D2# = tham chiếu toàn bộ spill range (D2:D9)
=COUNTA(D2#) // Đếm số kết quả: 8
=SUM(D2#) // Tổng toàn bộ spill range
=SORT(D2#) // Sắp xếp kết quả spill1.2 Lỗi #SPILL! — Nguyên nhân và cách xử lý
Lỗi #SPILL! xảy ra khi vùng spill bị chặn bởi dữ liệu hoặc merged cells. Để sửa:
Xóa dữ liệu trong các ô mà spill range cần chiếm
Unmerge cells trong vùng spill
Kiểm tra bằng cách click vào ô có công thức — Excel sẽ highlight vùng spill bằng viền xanh
2. Hàm FILTER — Lọc Dữ Liệu Không Cần Helper Column
Hàm FILTER thay thế hoàn toàn Advanced Filter, VLOOKUP lồng IF, và các cách lọc thủ công. Cú pháp:
=FILTER(array, include, [if_empty])
// array: vùng dữ liệu cần lọc
// include: điều kiện lọc (trả về TRUE/FALSE)
// if_empty: giá trị hiển thị khi không có kết quả (tùy chọn)2.1 Ví dụ 1: Lọc theo một điều kiện
Giả sử bạn có bảng bán hàng với các cột: Mã ĐH, Ngày, Nhân Viên, Sản Phẩm, Nhóm Hàng, Số Lượng, Thành Tiền, Khu Vực. Lọc tất cả đơn hàng thuộc nhóm "Điện tử":
=FILTER(A2:H21, E2:E21="Điện tử", "Không tìm thấy")Công thức này trả về toàn bộ các dòng có Nhóm Hàng = "Điện tử". Nếu không có kết quả, hiển thị "Không tìm thấy" thay vì lỗi #CALC!.
2.2 Ví dụ 2: Lọc theo nhiều điều kiện (AND)
Lọc đơn hàng ở Hà Nội VÀ thành tiền trên 50 triệu:
// Dùng dấu * để kết hợp điều kiện AND
=FILTER(A2:H21, (H2:H21="Hà Nội") * (G2:G21>50000000), "Không có đơn phù hợp")2.3 Ví dụ 3: Lọc theo nhiều điều kiện (OR)
Lọc đơn hàng ở Hà Nội HOẶC TP.HCM:
// Dùng dấu + để kết hợp điều kiện OR
=FILTER(A2:H21, (H2:H21="Hà Nội") + (H2:H21="TP.HCM"))2.4 Ví dụ 4: FILTER với ô tham chiếu động
Cho phép người dùng chọn khu vực từ dropdown (ô J1) để lọc:
// J1 = dropdown chọn khu vực
=FILTER(A2:H21, H2:H21=J1, "Không có dữ liệu cho "&J1)💡 Mẹo: Kết hợp FILTER với Data Validation (dropdown) để tạo báo cáo tương tác — người dùng chọn tiêu chí, kết quả tự động thay đổi.
3. Hàm SORT & SORTBY — Sắp Xếp Dữ Liệu Tự Động
Trước đây, muốn sắp xếp dữ liệu bạn phải dùng Sort & Filter trên ribbon — rất bất tiện vì thay đổi dữ liệu gốc. Hàm SORT và SORTBY trả về bản sắp xếp mới mà không ảnh hưởng dữ liệu nguồn.
3.1 Hàm SORT — Sắp xếp theo cột trong mảng
=SORT(array, [sort_index], [sort_order], [by_col])
// sort_index: cột thứ mấy trong array để sắp xếp (mặc định 1)
// sort_order: 1 = tăng dần (mặc định), -1 = giảm dần
// by_col: FALSE = sắp theo dòng, TRUE = sắp theo cộtVí dụ: Sắp xếp bảng bán hàng theo Thành Tiền giảm dần (cột thứ 7 trong vùng A2:H21):
=SORT(A2:H21, 7, -1)3.2 Hàm SORTBY — Sắp xếp theo cột ngoài mảng
SORTBY linh hoạt hơn SORT vì cho phép sắp xếp theo một cột bất kỳ, không nhất thiết phải nằm trong mảng kết quả.
=SORTBY(array, by_array1, [sort_order1], [by_array2], [sort_order2], ...)
// Ví dụ: Sắp xếp Tên + Sản phẩm theo Thành Tiền giảm dần
=SORTBY(C2:E21, G2:G21, -1)3.3 Sắp xếp nhiều cấp
SORTBY hỗ trợ sắp xếp theo nhiều cột — ví dụ theo Khu Vực tăng dần, rồi theo Thành Tiền giảm dần:
=SORTBY(A2:H21, H2:H21, 1, G2:G21, -1)So sánh cũ vs mới: Trước đây bạn phải: Data → Sort → chọn cột → OK, mỗi lần data thay đổi phải sort lại. Giờ chỉ 1 công thức, kết quả tự động cập nhật.
4. Hàm UNIQUE — Trích Xuất Giá Trị Không Trùng Lặp
Hàm UNIQUE thay thế hoàn toàn Remove Duplicates (vốn phá hủy dữ liệu gốc) và Advanced Filter → Unique records.
=UNIQUE(array, [by_col], [exactly_once])
// by_col: FALSE = so sánh theo dòng (mặc định), TRUE = so sánh theo cột
// exactly_once: FALSE = trả về distinct (mặc định), TRUE = chỉ trả về giá trị xuất hiện đúng 1 lần4.1 Danh sách không trùng
// Danh sách nhân viên duy nhất
=UNIQUE(C2:C21)
// Danh sách khu vực duy nhất
=UNIQUE(H2:H21)4.2 Giá trị xuất hiện đúng 1 lần
// Sản phẩm chỉ bán được đúng 1 lần (exactly_once = TRUE)
=UNIQUE(D2:D21, FALSE, TRUE)4.3 UNIQUE kết hợp SORT — Dropdown tự động
Tạo dropdown nhân viên sắp xếp theo tên, tự động cập nhật khi thêm dữ liệu mới:
// Bước 1: Tạo danh sách Name Range (CTRL+F3)
// Name: DS_NhanVien
// Refers to: =SORT(UNIQUE(Data!C2:C100))
// Bước 2: Data Validation → Source → =DS_NhanVien
// Kết quả: dropdown tự cập nhật, sắp xếp A-Z, không trùng💡 Ứng dụng thực tế: UNIQUE + SORT là combo hoàn hảo để tạo dropdown động cho dashboard và báo cáo quản trị.
5. Hàm SEQUENCE — Tạo Dãy Số Tự Động
SEQUENCE tạo dãy số liên tục — rất hữu ích cho STT tự động, bảng lịch, ma trận tính toán.
=SEQUENCE(rows, [columns], [start], [step])
// rows: số dòng
// columns: số cột (mặc định 1)
// start: giá trị bắt đầu (mặc định 1)
// step: bước nhảy (mặc định 1)5.1 STT tự động
// Tạo cột STT 1-100
=SEQUENCE(100)
// STT bắt đầu từ 1001
=SEQUENCE(50, 1, 1001)5.2 Ma trận phép nhân (Bảng cửu chương)
// Bảng cửu chương 1-9
=SEQUENCE(9, 1, 1) * SEQUENCE(1, 9, 1)
// Kết quả: ma trận 9x9 tự động tính5.3 Dãy ngày liên tục
// 30 ngày từ hôm nay
=SEQUENCE(30, 1, TODAY())
// 12 tháng đầu mỗi tháng trong năm 2026
=DATE(2026, SEQUENCE(12), 1)6. Hàm LAMBDA — Tạo Hàm Tùy Chỉnh Không Cần VBA
LAMBDA là bước đột phá lớn nhất — cho phép bạn tạo hàm riêng mà không cần viết VBA. Kết hợp với Name Manager, bạn có thể tạo hàm có tên gọi riêng, tái sử dụng trong toàn workbook.
=LAMBDA(parameter1, [parameter2], ..., calculation)
// parameter: tham số đầu vào
// calculation: công thức tính toán sử dụng các tham số6.1 Ví dụ: Hàm tính thuế VAT
// Bước 1: Định nghĩa LAMBDA
=LAMBDA(amount, rate, amount * rate / 100)
// Bước 2: Đặt tên qua Name Manager (CTRL+F3)
// Name: VAT
// Refers to: =LAMBDA(amount, rate, amount * rate / 100)
// Bước 3: Sử dụng như hàm bình thường!
=VAT(50000000, 10) // Kết quả: 5,000,000
=VAT(A2, 8) // Tính VAT 8% cho ô A26.2 Ví dụ: Hàm chuyển đổi tiền tệ
// Name: CONVERT_VND
// Refers to:
=LAMBDA(usd, rate,
IF(usd="", "",
TEXT(usd * rate, "#,##0") & " VNĐ"
)
)
// Sử dụng:
=CONVERT_VND(100, 25400) // "2,540,000 VNĐ"6.3 LAMBDA kết hợp MAP — Áp dụng hàm cho toàn bộ mảng
Hàm MAP (cũng mới trong Excel 365) cho phép áp dụng LAMBDA lên từng phần tử của mảng:
// Phân loại đơn hàng theo giá trị
=MAP(G2:G21, LAMBDA(v,
IF(v >= 100000000, "VIP",
IF(v >= 50000000, "Lớn",
IF(v >= 10000000, "Trung bình", "Nhỏ")
)
)
))7. Kết Hợp Nâng Cao — Combo Sức Mạnh
Sức mạnh thực sự của Dynamic Arrays nằm ở khả năng kết hợp các hàm với nhau. Dưới đây là các ví dụ nâng cao:
7.1 Top 5 đơn hàng lớn nhất theo khu vực
// J1 = dropdown chọn khu vực
// Lọc theo khu vực → Sắp xếp giảm dần → Lấy 5 dòng đầu
=LET(
data, A2:H21,
filtered, FILTER(data, INDEX(data,,8)=J1),
sorted, SORT(filtered, 7, -1),
top5, INDEX(sorted, SEQUENCE(MIN(5, ROWS(sorted))), SEQUENCE(1, COLUMNS(sorted))),
top5
)Giải thích hàm LET: LET cho phép đặt tên biến tạm — giúp công thức dễ đọc hơn, chạy nhanh hơn (tính mỗi biểu thức 1 lần).
7.2 Báo có tổng hợp nhanh
// Danh sách khu vực duy nhất + tổng doanh thu khu vực đó
=LET(
regions, SORT(UNIQUE(H2:H21)),
totals, MAP(regions, LAMBDA(r, SUMIFS(G2:G21, H2:H21, r))),
HSTACK(regions, totals)
)
// Kết quả:
// Hà Nội | 450,000,000
// TP.HCM | 380,000,000
// Đà Nẵng | 120,000,0007.3 FILTER lồng SORT — Báo cáo tương tác hoàn chỉnh
// Dropdown: Khu vực (J1), Nhóm hàng (J2), Sắp xếp theo (J3)
=LET(
data, A2:H21,
f1, IF(J1="Tất cả", TRUE, INDEX(data,,8)=J1),
f2, IF(J2="Tất cả", TRUE, INDEX(data,,5)=J2),
filtered, FILTER(data, f1 * f2, "Không có dữ liệu"),
SORT(filtered, MATCH(J3, A1:H1, 0), -1)
)8. So Sánh: Cách Cũ vs Dynamic Arrays
Để bạn thấy rõ sự khác biệt, dưới đây là so sánh theo từng tác vụ:
Lọc dữ liệu: Cũ = Advanced Filter + copy kết quả | Mới = FILTER() — 1 công thức, tự cập nhật
Sắp xếp: Cũ = Data → Sort, thay đổi data gốc | Mới = SORT() — không ảnh hưởng nguồn
Loại trùng: Cũ = Remove Duplicates, mất data gốc | Mới = UNIQUE() — data gốc nguyên vẹn
Tạo dãy số: Cũ = gõ 1, 2 rồi kéo Fill Handle | Mới = SEQUENCE() — 1 công thức cho ngàn giá trị
Hàm tùy chỉnh: Cũ = VBA/UDF phức tạp | Mới = LAMBDA + Name Manager — no code
Kết hợp nhiều bước: Cũ = nhiều helper columns | Mới = LET + HSTACK/VSTACK — 1 cell
⚡ Dynamic Arrays giúp giảm đến 80% số công thức trong một worksheet điển hình — từ hàng chục helper columns xuống còn vài ô duy nhất.
Câu Hỏi Thường Gặp (FAQ)
Dynamic Arrays có hoạt động trên Excel 2019 hoặc cũ hơn không?
Không. Dynamic Arrays chỉ hỗ trợ trên Excel 365 (Microsoft 365) và Excel 2021 trở lên. Nếu bạn dùng Excel 2019 hoặc cũ hơn, các hàm FILTER, SORT, UNIQUE sẽ không khả dụng. Hãy nâng cấp lên Microsoft 365 để sử dụng.
Spill range có tự động mở rộng khi thêm dữ liệu mới không?
Có, nếu bạn sử dụng Excel Table (Ctrl+T) hoặc Named Range động. Khi thêm dữ liệu mới nằm trong vùng tham chiếu, spill range sẽ tự động cập nhật. Đây là lý do nên luôn chuyển data thành Table trước khi dùng Dynamic Arrays.
Tôi có thể lồng nhiều hàm mảng động với nhau không?
Hoàn toàn được! Đây chính là sức mạnh lớn nhất. Ví dụ: SORT(FILTER(UNIQUE(...))) hoàn toàn hợp lệ. Sử dụng hàm LET để đặt tên biến tạm, giúp công thức dễ đọc và debug hơn.
LAMBDA có thay thế hoàn toàn VBA không?
Chưa hoàn toàn. LAMBDA rất mạnh cho các tính toán tùy chỉnh, nhưng VBA vẫn cần thiết cho: tự động hóa quy trình (macro), thao tác với file system, giao diện UserForm, và tương tác với ứng dụng ngoài. LAMBDA tốt nhất ở vai trò tạo hàm tính toán tùy chỉnh.
Làm sao biết workbook của tôi có hỗ trợ Dynamic Arrays?
Gõ =FILTER(A1:A5, A1:A5<>"") vào một ô bất kỳ. Nếu Excel hiểu hàm và trả về kết quả (hoặc lỗi #SPILL!), workbook của bạn hỗ trợ Dynamic Arrays. Nếu hiện #NAME?, nghĩa là phiên bản Excel chưa hỗ trợ.
Kết Luận
Dynamic Arrays đánh dấu bước tiến lớn nhất của Excel kể từ khi giới thiệu Pivot Table. Chỉ với 6 hàm — FILTER, SORT, SORTBY, UNIQUE, SEQUENCE, LAMBDA — bạn có thể thay thế hàng chục kỹ thuật phức tạp trước đây.
Hãy bắt đầu từ FILTER (dùng nhiều nhất trong thực tế), rồi kết hợp dần với SORT, UNIQUE. Khi đã quen, thử LAMBDA để tạo hàm riêng — bạn sẽ ngạc nhiên về sức mạnh không cần VBA.
Nếu thấy bài viết hữu ích, hãy chia sẻ cho đồng nghiệp nhé! Và đừng quên ghé Trà Đá Data để đọc thêm nhiều bài viết chất lượng khá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ủ đề
