Hướng dẫn

XLOOKUP Trả Về Nhiều Kết Quả Trong Google Sheets [2026]

Tuân HoangTuân Hoang
17 tháng 8, 2026
Cập nhật: 22 tháng 8, 2026
8 phút đọc
Ảnh minh họa bài viết: XLOOKUP Trả Về Nhiều Kết Quả Trong Google Sheets [2026]

XLOOKUP vốn được thiết kế để trả về một kết quả duy nhất — khớp đầu tiên tìm thấy. Nhưng khi dữ liệu có nhiều dòng trùng giá trị tra cứu (ví dụ nhiều đơn hàng của cùng một khách, nhiều lần nhập kho của cùng một mã SKU), bạn cần lấy về TẤT CẢ kết quả khớp, không chỉ một. Bài này chỉ ra chính xác cách làm điều đó trong Google Sheets, kèm ví dụ thực tế và các lỗi thường gặp.

Tại sao XLOOKUP mặc định chỉ trả về 1 kết quả

Về bản chất, XLOOKUP quét từ trên xuống (hoặc theo tham số search_mode bạn chọn) và dừng lại ngay khi tìm thấy khớp đầu tiên. Cú pháp gốc:

=XLOOKUP(giá_trị_tra_cứu, mảng_tra_cứu, mảng_kết_quả, [nếu_không_tìm_thấy], [chế_độ_khớp], [chế_độ_tìm_kiếm])

Không có tham số nào trong 6 tham số này cho phép "trả về mọi dòng khớp" — đây là giới hạn thiết kế, không phải lỗi. Excel 365 sau này có thêm mẹo kết hợp với các hàm mảng động, và Google Sheets cũng có đường đi tương tự nhưng khác cú pháp.

Ví dụ bảng dữ liệu đơn giản:

Mã KHSản phẩmSố lượng
KH001Ghế văn phòng2
KH002Bàn làm việc1
KH001Đèn bàn3
KH001Thảm lót sàn1

Nếu bạn viết =XLOOKUP("KH001", A2:A5, B2:B5), kết quả chỉ trả về "Ghế văn phòng" — bỏ sót "Đèn bàn" và "Thảm lót sàn". Đây chính là vấn đề cần giải quyết.

Giải pháp 1: Kết hợp FILTER thay vì XLOOKUP thuần

Cách đơn giản và ổn định nhất trong Google Sheets là dùng hàm FILTER — nó vốn được thiết kế để trả về mảng nhiều dòng, đúng thứ XLOOKUP không làm được:

=FILTER(B2:C5, A2:A5="KH001")

Công thức này trả về toàn bộ cột Sản phẩm và Số lượng ứng với mọi dòng có Mã KH = "KH001", tự động tràn xuống các ô bên dưới (spill range) mà không cần kéo công thức.

Nếu muốn giá trị tra cứu lấy từ ô tham chiếu (linh hoạt hơn khi thay đổi), thay bằng:

=FILTER(B2:C5, A2:A5=E1)

với E1 là ô chứa mã khách hàng cần tìm. Khi không có kết quả nào khớp, FILTER sẽ báo lỗi #N/A, nên nên bọc thêm IFERROR:

=IFERROR(FILTER(B2:C5, A2:A5=E1), "Không tìm thấy")

So với các hàm tra cứu truyền thống, FILTER và XLOOKUP có vai trò khác nhau rõ rệt — nếu bạn còn phân vân nên dùng hàm nào cho từng tình huống, tham khảo thêm VLOOKUP vs INDEX/MATCH vs XLOOKUP: Chọn hàm nào trong Google Sheets.

Giải pháp 2: Gộp kết quả thành 1 chuỗi bằng TEXTJOIN + XLOOKUP giả lập

Trường hợp bạn không cần liệt kê nhiều dòng mà chỉ muốn gộp tất cả kết quả khớp vào MỘT ô (ví dụ: liệt kê tất cả sản phẩm của một khách hàng cách nhau bởi dấu phẩy), dùng TEXTJOIN kết hợp IF theo kiểu mảng:

=TEXTJOIN(", ", TRUE, IF(A2:A5=E1, B2:B5, ""))

Công thức này cần nhấn Ctrl+Shift+Enter ở phiên bản cũ, nhưng Google Sheets hiện tại tự hỗ trợ mảng động nên chỉ cần Enter bình thường. Kết quả với ví dụ trên: "Ghế văn phòng, Đèn bàn, Thảm lót sàn".

Cách này rất hữu ích khi làm báo cáo tổng hợp — ví dụ liệt kê tất cả mã đơn hàng của một khách trong một ô duy nhất để chèn vào email hoặc phiếu giao hàng, thay vì phải hiện 3-4 dòng riêng lẻ.

Giải pháp 3: Trả về kết quả thứ N bằng cách kết hợp XLOOKUP với COUNTIF

Đây là mẹo nâng cao khi bạn thực sự muốn giữ nguyên hàm XLOOKUP nhưng cần lấy kết quả khớp thứ 2, thứ 3... không chỉ khớp đầu tiên. Ý tưởng: tạo cột phụ đánh số thứ tự khớp, sau đó XLOOKUP theo giá trị ghép "mã + số thứ tự".

Bước 1 — thêm cột phụ D (số thứ tự khớp lũy kế):

D2: =COUNTIF(A$2:A2, A2)

Kéo công thức xuống hết bảng. Kết quả cột D sẽ là 1, 1, 2, 3 tương ứng với 4 dòng ví dụ ban đầu (KH001 xuất hiện lần 1, lần 2, lần 3).

Bước 2 — tạo khóa ghép ở cột E:

E2: =A2&"-"&D2

Bước 3 — dùng XLOOKUP để lấy kết quả khớp thứ N mong muốn, ví dụ lần khớp thứ 2 của KH001:

=XLOOKUP("KH001-2", E2:E5, B2:B5)

Kết quả trả về "Đèn bàn" — đúng là dòng khớp thứ 2. Cách này hơi cồng kềnh hơn FILTER, nhưng phù hợp khi bạn cần chèn từng kết quả vào các ô riêng biệt theo bố cục cố định (ví dụ template in phiếu có 3 dòng sản phẩm cố định cho mỗi khách).

Nếu bạn cần XLOOKUP xử lý đồng thời nhiều điều kiện lọc (ví dụ vừa lọc theo mã khách vừa theo tháng), nên tham khảo kỹ thuật ghép điều kiện tại Dùng XLOOKUP với nhiều điều kiện trong Google Sheets trước khi áp dụng vào bài toán nhiều kết quả này, vì hai kỹ thuật có thể kết hợp với nhau.

So sánh 3 giải pháp: khi nào dùng cái nào

Giải phápƯu điểmNhược điểmPhù hợp khi
FILTERĐơn giản, tự động tràn nhiều dòng, dễ đọcKhông giữ định dạng gốc nếu cột nguồn có công thức phức tạpCần liệt kê danh sách đầy đủ, số dòng kết quả không cố định
TEXTJOIN + IFGộp gọn vào 1 ô, tiện xuất báo cáo/emailKhó tách lại từng giá trị riêng sau nàyChỉ cần hiển thị tổng hợp, không cần xử lý tiếp từng dòng
XLOOKUP + COUNTIF (khóa ghép)Giữ được cú pháp XLOOKUP quen thuộc, lấy đúng kết quả thứ NCần cột phụ, cồng kềnh hơn khi bảng lớnTemplate cố định số dòng, cần điền vào vị trí ô xác định trước

Trong 3 cách, FILTER gần như luôn là lựa chọn mặc định tốt nhất cho bài toán "trả về nhiều kết quả" vì nó xử lý mảng động tự nhiên. XLOOKUP + COUNTIF chỉ nên dùng khi có ràng buộc về bố cục cố định.

Lỗi thường gặp khi xử lý nhiều kết quả khớp

Lỗi #REF! do vùng tràn (spill) bị chặn

FILTER trả về mảng nhiều ô, nếu các ô bên dưới công thức đã có dữ liệu sẵn (dù chỉ là 1 ô trống có định dạng), Google Sheets sẽ báo lỗi #REF! Array result was not expanded because it would overwrite data. Cách khắc phục: xóa sạch vùng bên dưới công thức trước khi nhập, hoặc đặt công thức ở cột/sheet riêng không có dữ liệu che khuất.

Nhầm lẫn giữa "khớp gần đúng" và "nhiều khớp chính xác"

Nhiều người nhầm tưởng tham số match_mode của XLOOKUP (như -1 cho khớp nhỏ hơn gần nhất, 1 cho khớp lớn hơn gần nhất) có thể dùng để lấy nhiều kết quả. Thực ra tham số này chỉ ảnh hưởng đến CÁCH XLOOKUP xác định một khớp duy nhất khi không có khớp chính xác, không liên quan gì đến việc trả về nhiều dòng.

Hiệu năng chậm khi bảng dữ liệu lớn

Với bảng vài nghìn dòng trở lên, công thức TEXTJOIN + IF dạng mảng có thể làm chậm sheet đáng kể vì phải quét lại toàn bộ mảng mỗi lần tính. Nếu gặp tình trạng này, cân nhắc chuyển sang QUERY với cú pháp SQL-like, thường nhanh hơn với dữ liệu lớn — kỹ thuật này được đề cập chi tiết trong Google Sheets nâng cao: XLOOKUP, ARRAYFORMULA, QUERY và 10 thủ thuật bí ẩn.

Ứng dụng thực tế: theo dõi nhiều lần giao việc của một nhân viên

Một tình huống hay gặp ở các đội nhóm quản lý dự án bằng Google Sheets: một nhân viên có thể được giao nhiều đầu việc trong cùng một dự án, và bạn cần liệt kê tất cả các việc đó khi lọc theo tên. Áp dụng FILTER:

=FILTER(TênViệc2:TênViệc100, TênNV2:TênNV100="Nguyễn Văn A")

Công thức này lập tức hiện toàn bộ danh sách công việc của "Nguyễn Văn A", cập nhật tự động khi bảng gốc thay đổi — không cần kéo hay refresh thủ công. Nếu bạn đang xây dựng bảng theo dõi tiến độ dự án hoàn chỉnh (không chỉ riêng phần lọc dữ liệu), có thể tham khảo cấu trúc mẫu tại Tạo lịch quản lý dự án trên Google Sheets: Template + Hướng dẫn để có bố cục sẵn sàng áp dụng ngay các công thức FILTER/XLOOKUP nói trên.

Với các bảng quản lý phức tạp hơn — nhiều điều kiện lọc, nhiều sheet nguồn — việc dựng công thức thủ công dễ sai sót khi bảng mở rộng. Đây cũng là lý do nhiều đội chọn dùng sẵn các mẫu Sheet dựng công thức chuẩn từ SheetStore thay vì tự làm lại từ đầu, tiết kiệm thời gian debug công thức mảng phức tạp.

Câu hỏi thường gặp

Tại sao XLOOKUP chỉ trả về 1 kết quả dù có nhiều dòng trùng khớp?

XLOOKUP được thiết kế để tra cứu một giá trị và trả về kết quả khớp đầu tiên tìm thấy, tương tự VLOOKUP. Đây là hạn chế thiết kế của hàm, không phải lỗi. Muốn lấy toàn bộ các dòng trùng khớp, bạn cần kết hợp với hàm FILTER hoặc QUERY thay vì dùng XLOOKUP đơn lẻ.

Làm sao để lấy tất cả kết quả trùng khớp trong Google Sheets?

Dùng công thức FILTER(cột_kết_quả, cột_điều_kiện=giá_trị_cần_tìm) để trả về mảng gồm toàn bộ dòng khớp cùng lúc, tự động tràn (spill) xuống các ô bên dưới. Đây là cách phổ biến nhất thay thế XLOOKUP khi cần nhiều kết quả.

QUERY và FILTER khác nhau thế nào khi lấy nhiều kết quả?

FILTER phù hợp lọc theo 1-2 điều kiện đơn giản, cú pháp ngắn gọn. QUERY mạnh hơn khi cần sắp xếp, gộp nhiều cột, dùng cú pháp giống SQL (SELECT, WHERE, ORDER BY), phù hợp dữ liệu phức tạp hoặc báo cáo động.

Có thể dùng Apps Script để thay XLOOKUP lấy nhiều kết quả không?

Có, nhưng thường không cần thiết vì FILTER và QUERY đã đủ mạnh cho hầu hết trường hợp và tự động cập nhật khi dữ liệu thay đổi. Chỉ nên dùng Apps Script khi cần logic tra cứu phức tạp vượt ngoài khả năng công thức.

Bạn muốn áp dụng ngay mà không phải tự xây từ đầu?

Khám phá các mẫu Google Sheets và phần mềm quản lý dựng sẵn cho doanh nghiệp Việt tại SheetStore Marketplace.

Chia sẻ bài viết:

Tuân Hoang

Tuân Hoang

Đội ngũ SheetStore

Google SheetsGoogle Apps ScriptCRMAutomationPhần mềm quản lý doanh nghiệp

Google Workspace Certified, 5+ years experience

Bạn thấy bài viết hữu ích?

Đăng ký nhận thông báo khi có bài viết mới.

Nhận thông báo khi có bài viết mới. Không spam, hứa luôn! 😊

Bình luận (0)

Vui lòng đăng nhập để tham gia thảo luận