Menu

Hàm VLOOKUP trong Excel: công thức, ví dụ và cách sửa #N/A

=VLOOKUP(F2,A2:D6,3,FALSE) tìm F2 trong cột đầu tiên của A2:D6 và trả về giá trị ở cột thứ ba của cùng hàng. So khớp chính xác và gần đúng, sửa lỗi #N/A, tra cứu từ sheet khác, hai điều kiện.

Mọi bảng tính trên trang này đều trực tiếp: đổi một số hoặc công thức, bảng tính sẽ tự tính lại.

=VLOOKUP(F2,A2:D6,3,FALSE) tìm giá trị trong F2 ở cột đầu tiên của A2:D6 và trả về giá trị ở cột thứ ba của cùng hàng. FALSE ở cuối nghĩa là "chỉ so khớp chính xác". Chọn một sản phẩm khác trong F2 và giá sẽ thay đổi.

Giá của một sản phẩm
G2
ABCDEFG
1ProductCategoryPriceStockLook forPrice
2AppleFruit$1.2040Pear$1.50
3PearFruit$1.5025
4CarrotVegetable$0.8060
5BreadBakery$2.4015
6MilkDairy$1.1030
Bấm vào một ô để xem công thức. Đổi một số hoặc công thức, bảng tính sẽ tự tính lại.

Bấm vào G2 để thấy bảng A2:D6 được tô viền. Đổi 3 trong công thức thành 2 thì G2 trả về danh mục thay vì giá, vì Category là cột thứ hai của bảng. Phép so khớp bỏ qua chữ hoa chữ thường: pear vẫn tìm thấy Pear.

Cú pháp VLOOKUP

=VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])
Đối sốÝ nghĩaTrong ví dụ
lookup_valueGiá trị cần tìm.F2 (Pear)
table_arrayBảng để tìm kiếm. VLOOKUP chỉ tìm trong cột đầu tiên của bảng.A2:D6
col_index_numCột nào của bảng được trả về, đếm từ cột đầu tiên của bảng (1).3 (Price)
range_lookupFALSE hoặc 0 để so khớp chính xác. TRUE, 1 hoặc bỏ trống để so khớp gần đúng.FALSE

Số thứ tự cột được đếm từ đầu bảng, không phải từ cột A của trang tính. Với bảng bắt đầu ở cột C, col_index_num bằng 2 nghĩa là cột D. Một số lớn hơn độ rộng của bảng sẽ trả về #REF!, còn 0 trả về #VALUE!.

Trong Excel đặt ngôn ngữ dùng dấu phẩy thập phân, các đối số được ngăn cách bằng dấu chấm phẩy: =VLOOKUP(F2;A2:D6;3;FALSE).

Chọn cột trả về bằng MATCH

Số 3 viết cứng sẽ hỏng một cách âm thầm khi ai đó chèn một cột vào giữa bảng: công thức vẫn trả về cột thứ ba, giờ lại chứa thứ khác. Thay vào đó, hãy để MATCH tìm số thứ tự cột từ tiêu đề. Ở đây G1 là danh sách thả xuống: chọn Stock hoặc Category và G2 thay đổi theo.

Số thứ tự cột lấy từ tiêu đề
G2
ABCDEFG
1ProductCategoryPriceStockLook forPrice
2AppleFruit$1.2040Carrot0.8
3PearFruit$1.5025
4CarrotVegetable$0.8060
5BreadBakery$2.4015
6MilkDairy$1.1030
Bấm vào một ô để xem công thức. Đổi một số hoặc công thức, bảng tính sẽ tự tính lại.

MATCH(G1,A1:D1,0) trả về vị trí của "Price" trong hàng tiêu đề, là 3, và VLOOKUP dùng nó làm số thứ tự cột: 0,8 cho Carrot. Đây là tra cứu hai chiều: hàng được chọn theo sản phẩm, cột được chọn theo tiêu đề. Cùng ý tưởng này viết bằng INDEX thay cho VLOOKUP có ở trang INDEX và MATCH.

So khớp gần đúng: VLOOKUP với TRUE

Khi đối số cuối là TRUE, VLOOKUP không tìm giá trị bằng nhau. Hàm tìm giá trị lớn nhất nhỏ hơn hoặc bằng giá trị cần tìm. Đó chính là điều bạn cần cho các bậc: bậc thuế, xếp loại điểm, phí vận chuyển, mức hoa hồng. Cột đầu tiên phải được sắp xếp từ nhỏ đến lớn.

Tỷ lệ hoa hồng theo doanh số
F2
ABCDEF
1Sales fromRateRepSalesRate
200%Ana7500%
310003%Ben4,2003%
450005%Cara5,0005%
5100008%Dev12,5008%
Bấm vào một ô để xem công thức. Đổi một số hoặc công thức, bảng tính sẽ tự tính lại.

Con số 4.200 của Ben không có trong cột A. Giá trị lớn nhất không vượt quá nó là 1.000, nên Ben nhận 3%. Con số 5.000 của Cara khớp đúng hàng 5.000 và nhận 5%. Con số 12.500 của Dev vượt bậc cuối cùng và nhận tỷ lệ cuối, 8%. Một giá trị nhỏ hơn bậc đầu tiên (ở đây là doanh số âm) trả về #N/A, vì thế bảng bắt đầu từ 0.

Các dấu $ trong $A$2:$B$5 giữ bảng cố định khi F2 được điền xuống tới F5. Không có chúng, F3 sẽ tìm trong A3:B6 và bỏ qua bậc đầu tiên.

Bỏ trống đối số thứ tư cũng giống như TRUE. Với danh sách sản phẩm chưa sắp xếp, đó là một bug âm thầm: Excel tìm như thể danh sách đã được sắp xếp và có thể trả về giá của sai hàng, hoặc #N/A cho một giá trị có trong danh sách. Khi tra cứu tên, mã hay ID, hãy luôn kết thúc bằng FALSE.

Vì sao VLOOKUP trả về #N/A

#N/A nghĩa là "không tìm thấy". Trang tính dưới đây cho thấy ba nguyên nhân thường gặp, và cột G lặp lại từng phép tra cứu được bọc trong IFNA và TRIM.

Ba phép tra cứu trả về #N/A
F2
ABCDEFG
1ProductCategoryPriceStockLook forPriceFixed
2AppleFruit$1.2040Kiwi#N/ANot found
3PearFruit$1.5025Milk #N/A$1.10
4CarrotVegetable$0.8060Fruit#N/ANot found
5BreadBakery$2.4015
6MilkDairy$1.1030
#N/A Giá trị bạn tìm không có trong vùng tra cứu.
  1. Giá trị không có trong bảng. Kiwi không có trong A2:A6. Đó là trường hợp "không tìm thấy" thật sự, và IFNA(...,"Not found") biến nó thành văn bản dễ đọc. Đổi E2 thành Apple thì cả hai cột đều hiện giá.
  2. Khoảng trắng thừa. E3 chứa "Milk " có khoảng trắng ở cuối, nên nó không bằng Milk. TRIM(E3) xóa khoảng trắng đó và G3 tìm được giá. Nếu khoảng trắng nằm trong bảng, hãy làm sạch cột A bằng TRIM một lần thay vì làm trong mọi phép tra cứu.
  3. Giá trị nằm ở cột khác. Fruit có tồn tại, nhưng ở cột B. VLOOKUP chỉ tìm trong cột đầu tiên của bảng, nên E4 lỗi ở cả hai cột. Hãy cho bảng bắt đầu từ cột bạn tìm kiếm, hoặc dùng XLOOKUP, hàm nhận cột tìm kiếm và cột trả về riêng biệt.

Hãy dùng IFNA thay vì IFERROR để bọc phép tra cứu. IFNA chỉ bắt lỗi #N/A, nên lỗi #REF! do sai số thứ tự cột vẫn hiện ra thay vì bị che thành "Not found".

Thêm hai nguyên nhân nữa:

  • Số được lưu dạng văn bản. Nếu cột A chứa mã sản phẩm gõ dưới dạng văn bản (thường gặp sau khi nhập dữ liệu, có hình tam giác nhỏ màu xanh ở góc ô) và F2 chứa số 101, =VLOOKUP(F2,A2:B6,2,FALSE) trả về #N/A dù 101 có trong danh sách. Hãy chuyển đổi một bên: =VLOOKUP(F2&"",A2:B6,2,FALSE) tìm văn bản "101", còn =VLOOKUP(VALUE(F2),A2:B6,2,FALSE) tìm một số khi F2 là văn bản.
  • So khớp gần đúng trên dữ liệu chưa sắp xếp, như đã nói ở phần trên.

VLOOKUP trả về 0 thay vì ô trống

Khi ô mà VLOOKUP trỏ tới đang trống, Excel hiện 0 chứ không hiện ô trống. Khi đó số 0 trong cột Stock bị hiểu là "hết hàng" dù số tồn kho chưa từng được nhập. Hãy thêm &"" vào công thức, hoặc kiểm tra độ dài của kết quả:

=VLOOKUP(F2,A2:D6,4,FALSE)&""
=IF(LEN(VLOOKUP(F2,A2:D6,4,FALSE))=0,"",VLOOKUP(F2,A2:D6,4,FALSE))

Cách đầu ngắn hơn nhưng biến mọi số trả về thành văn bản, nên SUM phía sau sẽ bỏ qua chúng. Cách thứ hai giữ số ở dạng số.

VLOOKUP lấy dữ liệu từ sheet khác

Viết tên sheet và ! trước bảng. Khi dựng công thức trong Excel, bấm vào thẻ của sheet kia rồi chọn vùng: Excel tự viết Prices!A2:B6 cho bạn. Ở đây thẻ Orders tra cứu giá trên thẻ Prices.

Đơn hàng lấy giá từ sheet Prices
D2
ABCDE
1OrderProductQtyPriceTotal
21001Pear3$1.50$4.50
31002Milk2$1.10$2.20
41003Apple5$1.20$6.00
51004Bread1$2.40$2.40
Bấm vào một ô để xem công thức. Đổi một số hoặc công thức, bảng tính sẽ tự tính lại.

Mở thẻ Prices và đổi giá của Apple: tổng tiền của đơn hàng cập nhật theo. Có hai chi tiết:

  • Tên sheet có khoảng trắng cần đặt trong dấu nháy đơn: =VLOOKUP(B2,'Price list'!$A$2:$B$6,2,FALSE).
  • Bảng nằm ở workbook khác sẽ có thêm tên tệp trong ngoặc vuông, [Prices.xlsx]Prices!$A$2:$B$6. Khi tệp đó đóng, Excel hiện đường dẫn đầy đủ của nó trong công thức và phép tra cứu vẫn chạy dựa trên tệp đã lưu.

VLOOKUP với ký tự đại diện (khớp một phần)

Với FALSE, giá trị cần tìm có thể chứa ký tự đại diện (wildcard): * thay cho số ký tự bất kỳ và ? thay cho đúng một ký tự. "*"&E2&"*" tìm sản phẩm đầu tiên có tên chứa văn bản trong E2.

Tìm sản phẩm theo một phần tên
F2
ABCDEF
1ProductCategoryPriceContainsPrice
2Green teaDrinks$3.20coffee$2.90
3Iced coffeeDrinks$2.90
4Coffee beansPantry$8.50
5Black teaDrinks$2.70
6Orange juiceDrinks$3.40
Bấm vào một ô để xem công thức. Đổi một số hoặc công thức, bảng tính sẽ tự tính lại.

"coffee" khớp với cả Iced coffee và Coffee beans; VLOOKUP trả về kết quả đầu tiên tính từ trên xuống, 2,90.ĐổiE2thaˋnh‘bean‘đểnhận2,90. Đổi E2 thành `bean` để nhận 8,50, hoặc thành juice. Để tìm đúng dấu sao hay dấu hỏi, đặt dấu ngã trước nó: "~*".

VLOOKUP sang trái

VLOOKUP không thể trả về một cột nằm bên trái cột nó tìm kiếm: col_index_num chỉ đếm sang phải, và số âm là lỗi. Để tìm sản phẩm theo một mức giá, hãy tìm trong cột C và trả về cột A bằng XLOOKUP hoặc INDEX và MATCH:

=XLOOKUP(2.4, C2:C6, A2:A6)              Excel 2021 and Microsoft 365
=INDEX(A2:A6, MATCH(2.4, C2:C6, 0))      every version

Cả hai đều trả về Bread với dữ liệu ở trang tính đầu tiên. XLOOKUP có phần giải thích đầy đủ.

Luyện tập: phí vận chuyển theo cân nặng

Biểu phí vận chuyển
E2
ABCDE
1Weight from (kg)CostWeight (kg)Cost
20$4.507
32$6.00
45$9.50
510$14.00
620$22.00
Bấm vào một ô để xem công thức. Đổi một số hoặc công thức, bảng tính sẽ tự tính lại.

Đến lượt bạn: Mỗi mức phí áp dụng từ cân nặng của nó tới cân nặng kế tiếp trong danh sách. Trong E2, dùng VLOOKUP để trả về phí vận chuyển cho cân nặng kiện hàng trong D2.

VLOOKUP với hai điều kiện

VLOOKUP chỉ nhận một giá trị cần tìm. Để so khớp trên hai cột, hãy dựng một cột phụ nối hai cột lại, đặt nó làm cột đầu tiên của bảng, rồi tra cứu đúng chuỗi đã nối đó. Cột A bên dưới là =B2&"-"&C2 được điền xuống, nên nó chứa Coffee-Small, Coffee-Large và cứ thế tiếp tục.

Giá theo sản phẩm và kích cỡ
G2
ABCDEFG
1KeyProductSizePriceProductSizePrice
2Coffee-SmallCoffeeSmall$2.50TeaLarge
3Coffee-LargeCoffeeLarge$3.50
4Tea-SmallTeaSmall$2.00
5Tea-LargeTeaLarge$3.00
6Juice-SmallJuiceSmall$3.00
Bấm vào một ô để xem công thức. Đổi một số hoặc công thức, bảng tính sẽ tự tính lại.

Đến lượt bạn: Cột A nối sản phẩm và kích cỡ bằng dấu gạch nối. Trong G2, trả về giá cho sản phẩm trong E2 và kích cỡ trong F2.

Ký tự ngăn cách rất quan trọng: "Tea"&"Large" cho ra TeaLarge, không khớp với gì trong cột A. Trong Excel 2021 và Microsoft 365, bạn có thể bỏ cột phụ bằng =XLOOKUP(1,(B2:B6=E2)*(C2:C6=F2),D2:D6); trang tra cứu nhiều điều kiện trình bày cách đó cùng phiên bản INDEX/MATCH.

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

Cách dùng hàm VLOOKUP trong Excel?

Gõ =VLOOKUP( và đưa vào bốn đối số: giá trị cần tìm, bảng dữ liệu (cột đầu tiên của bảng phải chứa giá trị đó), số thứ tự cột cần trả về, và FALSE để so khớp chính xác. =VLOOKUP("Pear",A2:D6,3,FALSE) tìm Pear trong cột A và trả về giá trị ở cột C của hàng đó.

TRUE hoặc FALSE ở cuối hàm VLOOKUP có nghĩa là gì?

FALSE (hoặc 0) yêu cầu so khớp chính xác và trả về #N/A khi không có giá trị đó. TRUE (hoặc 1, hoặc bỏ trống đối số) yêu cầu so khớp gần đúng: giá trị lớn nhất nhỏ hơn hoặc bằng giá trị cần tìm, cách này chỉ đúng khi cột đầu tiên được sắp xếp tăng dần.

Vì sao hàm VLOOKUP trả về #N/A?

Không tìm thấy giá trị trong cột đầu tiên của bảng. Nguyên nhân thường gặp là gõ sai, có khoảng trắng thừa ("Milk " không phải "Milk"), số được lưu dạng văn bản ở một bên, hoặc giá trị nằm ở cột khác. Bọc công thức trong IFNA để hiện văn bản của riêng bạn: =IFNA(VLOOKUP(F2,A2:D6,3,FALSE),"Not found").

VLOOKUP có tra cứu sang trái được không?

Không. VLOOKUP chỉ trả về các cột nằm bên phải cột đầu tiên của bảng. Hãy dùng =XLOOKUP(F2,C2:C6,A2:A6) trong Excel 2021 hoặc Microsoft 365, hoặc =INDEX(A2:A6,MATCH(F2,C2:C6,0)) trong mọi phiên bản.

Làm sao dùng VLOOKUP lấy dữ liệu từ sheet khác?

Đặt tên sheet và dấu chấm than trước vùng dữ liệu: =VLOOKUP(B2,Prices!$A$2:$B$6,2,FALSE). Nếu tên sheet có khoảng trắng, đặt nó trong dấu nháy đơn: 'Price list'!$A$2:$B$6.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu