Thắc mắc: Hạn chế của hàm Vlookup khi tham chiếu dữ liệu trùng (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

xuongrongdat

Có bao giờ bạn tự hỏi "Tôi là ai?"
Tham gia
30/6/08
Bài viết
1,703
Được thích
1,581
Donate (Momo)
Donate
Nghề nghiệp
Vô tư cùng bạn bè đi khắp nơi.
Mọi người cho mình hỏi trường hợp sau, tại ô E3 nếu mình vẫn muốn dùng Vlookup thì làm sao để cho nó ra đúng kết quả được ạ?
Với ngoài Vlookup và Sumif ra thì còn cách nào khác gọn bằng hoặc gọn hơn không?
1603942318851.png

Mặc dù chỉ là minh họa nhưng đây là trường hợp thực tế. Nguyễn Văn A là người lập Bảng lương cho toàn công ty nên bị vướng tình huống trên.
Xin cảm ơn.
 

File đính kèm

Mình mới kể chuyện thôi, chưa thấy đề bài là gì á. :)
 
Mình mới kể chuyện thôi, chưa thấy đề bài là gì á. :)
Úy có đề bài, có câu hỏi đàng hoàng mà ta:
tại ô E3 nếu mình vẫn muốn dùng Vlookup thì làm sao để cho nó ra đúng kết quả được ạ? Kết quả đúng là 1.000.000 á
Với ngoài Vlookup và Sumif ra thì còn cách nào khác gọn bằng hoặc gọn hơn không?

Đề bài xong hết rồi bác ơi.
 
Úy có đề bài, có câu hỏi đàng hoàng mà ta:
tại ô E3 nếu mình vẫn muốn dùng Vlookup thì làm sao để cho nó ra đúng kết quả được ạ? Kết quả đúng là 1.000.000 á
Với ngoài Vlookup và Sumif ra thì còn cách nào khác gọn bằng hoặc gọn hơn không?

Đề bài xong hết rồi bác ơi.
Mình quên hết mấy hàm đó đi. Mình nêu bài toán:
Cho bảng dữ liệu ban đầu là gì, ở đâu?
Yêu cầu cần tính gì, làm gì? Kết quả để ở đâu.
 
Mọi người cho mình hỏi trường hợp sau, tại ô E3 nếu mình vẫn muốn dùng Vlookup thì làm sao để cho nó ra đúng kết quả được ạ?
Với ngoài Vlookup và Sumif ra thì còn cách nào khác gọn bằng hoặc gọn hơn không?
View attachment 248249

Mặc dù chỉ là minh họa nhưng đây là trường hợp thực tế. Nguyễn Văn A là người lập Bảng lương cho toàn công ty nên bị vướng tình huống trên.
Xin cảm ơn.
Dùng INDEX+MATCH => Kết quả là NGUYỄN VĂN A có tiền "Đầu tiên".

Dùng LOOKUP Kết quả là NGUYỄN VĂN A có tiền "Cuối cùng".
 
Mình quên hết mấy hàm đó đi. Mình nêu bài toán:
Cho bảng dữ liệu ban đầu là gì, ở đâu?
Yêu cầu cần tính gì, làm gì? Kết quả để ở đâu.
Con hỏi thiệt. Chỉ cần giải quyết bài #1 là được rồi bác. Chứ công việc thực tế con phải tường thuật dài lắm. Mà chung quy lại vấn đề nó chỉ có nhiêu đây hà.
 
Con hỏi thiệt. Chỉ cần giải quyết bài #1 là được rồi bác. Chứ công việc thực tế con phải tường thuật dài lắm. Mà chung quy lại vấn đề nó chỉ có nhiêu đây hà.
Không phải dài dòng, hay dài vô tận. Vấn đề là mình chưa trình bày được vấn đề. Thấy vướng vướng là lộn tung hết lên rồi.

Chỉ cần viết vầy là được:
Cho bảng dữ liệu ở cột A:B.
Tìm giá trị ở cột B theo tên ở cột A ứng với dòng có dữ liệu (nếu có nhiều hơn 1 dòng có dữ liệu thì lấy giá trị đầu/ cuối gì đó).

Chỉ đơn giản thế thôi. Mình lại đi nói hàm vlookup có nhược điểm. Hàm vlookup() chẳng có nhược điểm nào cả. Nhược điểm là người vận dụng hàm thôi.
 
Sắp xếp theo tên và số tiền (giảm dần) trước rồi mới vlookup
 
Tình huống thực tế mình gặp đây:
1603944504201.png

Cái ông tô vàng ổng lập nhiều biểu bên trên và bên dưới nữa, của các phòng ban, đơn vị khác trong công ty. Bị trùng cột B.
Xong cái mình qua sheet khác làm danh sách chuyển khoản tiền lương cho toàn công ty nên dò ngược sang sheet tính lương này. Dùng vlookup sẽ bị trùng tên cái ông tô vàng nên bị hiện thành 0, thay vì phải dò ra số tiền lương của ổng.

Thôi mình xài Sumif vậy. Tại muốn dùng Vlookup, hi. Cảm ơn mọi người nhiều.
 
Lần chỉnh sửa cuối:
Cái ông tô vàng ổng lập nhiều biểu bên dưới nữa, của các phòng ban, đơn vị khác trong công ty. Bị trùng cột B.
Đặt mã luôn và ngay đi thôi. Trên 01 người là đặt mã. Bởi ông tổng giám đốc và ông giám đốc đã trùng họ và tên rồi.
 
Đọc bài 1 tưởng dò tìm chính xác chữ hoa chữ thường @#$
 
Tình huống thực tế mình gặp đây:
View attachment 248255

Cái ông tô vàng ổng lập nhiều biểu bên trên và bên dưới nữa, của các phòng ban, đơn vị khác trong công ty. Bị trùng cột B.
Xong cái mình qua sheet khác làm danh sách chuyển khoản tiền lương cho toàn công ty nên dò ngược sang sheet tính lương này. Dùng vlookup sẽ bị trùng tên cái ông tô vàng nên bị hiện thành 0, thay vì phải dò ra số tiền lương của ổng.

Thôi mình xài Sumif vậy. Tại muốn dùng Vlookup, hi. Cảm ơn mọi người nhiều.
Nếu các tên trong bảng đều có số thứ tự, thì bạn thử thêm hàm if (nếu A >0, vlookup(ABC,.....), 0)
 
VLookup là hàm dò bảng. Bảng chuẩn thì mỗi từ khoá để lookup phải là duy nhất.
Riêng bài này, muốn tạm chuẩn hoá nó thì phải dùng hàm Choose hoặc tương tự để gộp cái từ khoá tên với cái con số ở cột kia (tức là "NGUYỄN VĂN A1000000")
Lúc tra, dùng wildcard, D3&"?*"
 
Tình huống thực tế mình gặp đây:
View attachment 248255

Cái ông tô vàng ổng lập nhiều biểu bên trên và bên dưới nữa, của các phòng ban, đơn vị khác trong công ty. Bị trùng cột B.
Xong cái mình qua sheet khác làm danh sách chuyển khoản tiền lương cho toàn công ty nên dò ngược sang sheet tính lương này. Dùng vlookup sẽ bị trùng tên cái ông tô vàng nên bị hiện thành 0, thay vì phải dò ra số tiền lương của ổng.

Thôi mình xài Sumif vậy. Tại muốn dùng Vlookup, hi. Cảm ơn mọi người nhiều.
Bỏ ký tự "V" thành Lookup
 
Mọi người cho mình hỏi trường hợp sau, tại ô E3 nếu mình vẫn muốn dùng Vlookup thì làm sao để cho nó ra đúng kết quả được ạ?
Với ngoài Vlookup và Sumif ra thì còn cách nào khác gọn bằng hoặc gọn hơn không?
View attachment 248249

Mặc dù chỉ là minh họa nhưng đây là trường hợp thực tế. Nguyễn Văn A là người lập Bảng lương cho toàn công ty nên bị vướng tình huống trên.
Xin cảm ơn.
Dùng MAX(IF... thì sao? Chẳng hạn:
Mã:
=MAX(IF($A$2:$A$10=D3,$B$2:$B$10,""))
Nếu tất cả các hàng đều có dữ liệu mà dùng SUMIF thì... coi chừng
 
Dùng INDEX+MATCH => Kết quả là NGUYỄN VĂN A có tiền "Đầu tiên".

Dùng LOOKUP Kết quả là NGUYỄN VĂN A có tiền "Cuối cùng".
Sao con làm Lookup hông có ra. Nó ra 0 quài.
VLookup là hàm dò bảng. Bảng chuẩn thì mỗi từ khoá để lookup phải là duy nhất.
Riêng bài này, muốn tạm chuẩn hoá nó thì phải dùng hàm Choose hoặc tương tự để gộp cái từ khoá tên với cái con số ở cột kia (tức là "NGUYỄN VĂN A1000000")
Lúc tra, dùng wildcard, D3&"?*"
Con chưa hiểu cách làm của bác.
Dùng MAX(IF... thì sao? Chẳng hạn:
Mã:
=MAX(IF($A$2:$A$10=D3,$B$2:$B$10,""))
Nếu tất cả các hàng đều có dữ liệu mà dùng SUMIF thì... coi chừng
Con làm Max If ra được kết quả đúng luôn rồi.
 
Của bác con thử và đã ra kết quả đúng rồi.
Mà cho con hỏi tại sao con làm công thức như này lại không ra đúng:
...
Cái khổ ở GPE này là xài công thức mẹo riết, người ta quên mất công thức căn bản.
Đọc lại cách dùng hàm Lookup căn bản sẽ thấy rằng hàm này bắt buộc mảng dò phải được sắp xếp.
 
Lookup(1, 1/...) hoặc Lookup(2, 1/...) là một xảo thuật (lưu ý từ xảo thuật có nghĩa là một mánh khoé, không phải là kỹ thuật chính thống) thường dùng cho một trong hai trường hợp sau đây:

1. tìm với nhiều điều kiện (ở phạm vi thớt này không thấy nói tới)

2. tìm với mảng không được sắp xếp và muốn tìm trị xuất hiện cuối cùng thay vì đầu tiên (hàm Match cũng dò được mảng không sắp xếp nhưng nó lấy trị đầu tiên)

Muốn biết tại sao có cái vụ 2,1 thì phải hiểu nguyên tắc của dò mảng sắp xếp.
Đối với mảng không sắp xếp, các hàm dò sẽ dò theo tuyến tính (linear search). Tức là dò từ đầu đến cuối, tới chỗ match thì dừng.
Đối với mảng sắp sếp, các hàm sẽ dò theo nhị phân (binary search).

Lookup có ba đặc tính sau đây:
1. nó là hàm mảng ngầm. Tức là nó tự biết triển khai các con toán mảng thành kết quả mảng.
2. nó luôn coi như mảng dò đã sắp xếp, tức là nó sẽ dò theo nhị phân.
3. nó sẽ bỏ qua các trị số error

Xảo thuật mà người ta lợi dụng là:
- Lookup(n, 1/...) dò tìm số n trong mảng tạo ra bởi con tính 1/...
- vì biểu thức (...) là biểu thức so sánh cho nên kết quả chỉ trả về {true, false, ...}. Nhưng ô thoả điều kiện trả về true, và nhưng ô không thoả thì trả về false.
- vì True/False có tính chất lượng nên Excel tự đặt luật để số lượng hoá True thành 1 và False thành 0 khi cần thiết phải làm toán số lượng. Như vậy, đem làm mẫu số cho con toán 1/... thì biểu thức sẽ tự số lượng hoá nó thành {1, 0,... } để có thể thực hiện phép chia.
- như vậy, biểu thức 1/{true, false, true, ...} sẽ thành { 1/1, 1/0, 1/1, ... }, và kế tiếp là { 1, error, 1, ... }
- Lookup sau đó sẽ cố tìm trị n trong mảng { 1, error, 1, ... }. Lưu ý là ở đây sẽ có người cho rằng không phải error, mà Lookup đã tự động biến error thành 0. Tôi không tranh cãi, bởi vì điều này không quan trọng, miễn nó không lớn hơn 1 là không ảnh hưởng đến phép dò nhị phân.
- Khi dò nhị phân một trị n trong mảng { ... }, phép dò sẽ dừng lại ở phần tử bên phải cùng và thoả điều kiện <= n. Lưu ý đây là tính chất dò nhị phân của MS chứ không nên kết luận do nó dò từ bên phải.
- trong mảng { 1, error, 1, ... } nếu n >= 1 thì phép dò sẽ dừng lại ở phần tử đầu tiên bên phải có trị là 1. Và đó chính là phần tử ở vị trí ô thoả các điều kiện ban đầu đặt ra.

Suy ra, theo lý thuyết, ở trường hợp của bạn thì Lookup(1, 1/...) hay Lookup(2, 1/...) đều như nhau. Cả 12 đều thoả điều kiện >=1
Cái khổ ở GPE này là xài công thức mẹo riết, người ta quên mất công thức căn bản.
Đọc lại cách dùng hàm Lookup căn bản sẽ thấy rằng hàm này bắt buộc mảng dò phải được sắp xếp.
Trước giờ con thấy mọi người xài Lookup mà không biết đâu là xài mẹo, đâu là xài căn bản. Chỉ nghĩ là có nhiều cách dùng. Không lẽ Sumproduct cũng vậy?!
Con có tìm kiếm và xem lại cái bài giải thích ở trên của bác về hàm Lookup.
Nhưng con chưa biết cái này: thế nào là mảng sắp xếp và thế nào là mảng không sắp xếp. Nhờ bác giải thích thêm.
 
Suy ra, theo lý thuyết, ở trường hợp của bạn thì Lookup(1, 1/...) hay Lookup(2, 1/...) đều như nhau. Cả 12 đều thoả điều kiện >=1
Không chính xác bác ạ. Tôi đã cho ví dụ khi n = 1 thì kết quả sai.

Bài #3 trong


Với cấu trúc lookup(n, 1/...) thì bắt buộc n > 1. Tức vd. n = 1,1. Đơn giản hơn nên lấy n = 2. Còn n = 1 sẽ sai.

Vd.

Kết quả sai

lookup1.jpg

Kết quả đúng

lookup2.jpg
 
Lần chỉnh sửa cuối:
Mọi người cho mình hỏi trường hợp sau, tại ô E3 nếu mình vẫn muốn dùng Vlookup thì làm sao để cho nó ra đúng kết quả được ạ?
Với ngoài Vlookup và Sumif ra thì còn cách nào khác gọn bằng hoặc gọn hơn không?
View attachment 248249

Mặc dù chỉ là minh họa nhưng đây là trường hợp thực tế. Nguyễn Văn A là người lập Bảng lương cho toàn công ty nên bị vướng tình huống trên.
Xin cảm ơn.
Chào bạn,
Nếu dùng công thức đơn giản trực quang thì mình bày như sau:
Thêm cột phụ "Tần Suất" và "STT"​
Công thức tại ô A2 là =COUNTIF($B$2:B2,B2)&"-"&B2
Công thức tại ô F2 là =IFERROR(VLOOKUP(E2&"-"&$F$1,$A$2:$C$17,3,0),0)
Fill xuống rồi Sum thôi, có thể dùng Conditional Formating để ẩn mấy cái không cần thiết.​
1604366580747.png
 
Chào bạn,
Nếu dùng công thức đơn giản trực quang thì mình bày như sau:
Thêm cột phụ "Tần Suất" và "STT"​
Công thức tại ô A2 là =COUNTIF($B$2:B2,B2)&"-"&B2
Công thức tại ô F2 là =IFERROR(VLOOKUP(E2&"-"&$F$1,$A$2:$C$17,3,0),0)
Fill xuống rồi Sum thôi, có thể dùng Conditional Formating để ẩn mấy cái không cần thiết.​
Bạn hiểu sai "đề bài" của mình á, hi. Bạn xem bài #11 mình có giải thích rõ hơn á. Đây là Bảng lương Khối văn phòng. Mỗi họ tên chỉ xuất hiện có 1 lần hà. Duy có cái ông Lập bảng lương á, xuất hiện rất nhiều lần chỗ ký tên, vì có nhiều bảng lương của nhiều phòng ban; và ổng lại là người của 1 phòng. Nên khi lập danh sách chuyển khoản gửi ngân hàng mình dùng vlookup dò tiền lương nó bị sai cái trường hợp của cái ông lập biểu.

Bài này mọi người đã giúp mình dùng những hàm sau đều giải quyết được hết rồi đó bạn: max+if, lookup, sumif.

Cảm ơn bạn nhiều nhé.
 
Lần chỉnh sửa cuối:
Tình huống thực tế mình gặp đây:
View attachment 248255

Cái ông tô vàng ổng lập nhiều biểu bên trên và bên dưới nữa, của các phòng ban, đơn vị khác trong công ty. Bị trùng cột B.
Xong cái mình qua sheet khác làm danh sách chuyển khoản tiền lương cho toàn công ty nên dò ngược sang sheet tính lương này. Dùng vlookup sẽ bị trùng tên cái ông tô vàng nên bị hiện thành 0, thay vì phải dò ra số tiền lương của ổng.

Thôi mình xài Sumif vậy. Tại muốn dùng Vlookup, hi. Cảm ơn mọi người nhiều.
Sao phải nhọc vậy nhỉ, cái ông lập biểu lại đưa vào đúng vị trí cột họ Tên , Nên đặt ông ấy ở cột khác ví dụ A
- Hơn nữa đấy là bảng in (Report) thì mới có người lập biểu, mà bản in thì tính toán tìm kiếm làm chi nữa - Nên phân định phần tính toán chung ở 1 sheet TinhToan khác
Như thế khỏi phải công thức phức tạp, nặng file
 
Sao phải nhọc vậy nhỉ, cái ông lập biểu lại đưa vào đúng vị trí cột họ Tên , Nên đặt ông ấy ở cột khác ví dụ A
- Hơn nữa đấy là bảng in (Report) thì mới có người lập biểu, mà bản in thì tính toán tìm kiếm làm chi nữa - Nên phân định phần tính toán chung ở 1 sheet TinhToan khác
Như thế khỏi phải công thức phức tạp, nặng file
Còn nếu không làm được như trên, thì thay ông Lập biểu đi , Lập biểu gì mà không tìm được chính mình
 
Sao phải nhọc vậy nhỉ, cái ông lập biểu lại đưa vào đúng vị trí cột họ Tên , Nên đặt ông ấy ở cột khác ví dụ A
- Hơn nữa đấy là bảng in (Report) thì mới có người lập biểu, mà bản in thì tính toán tìm kiếm làm chi nữa - Nên phân định phần tính toán chung ở 1 sheet TinhToan khác
Như thế khỏi phải công thức phức tạp, nặng file
Bảng tính toán với bảng in đang là 1 á bác.
Còn đặt ông ấy sang cột A là con phải cut paste 52 chỗ (cả khối gián tiếp lẫn trực tiếp) rồi canh cho nó ngay ngắn ở mỗi biểu nữa. Nó nhọc hơn là chỉ chỉnh công thức con dò tìm qua. Gửi ngân hàng chuyển khoản nó có cái mẫu biểu khác nữa.
Còn nếu không làm được như trên, thì thay ông Lập biểu đi , Lập biểu gì mà không tìm được chính mình
Thôi đừng thay bác ưi, tội nghiệp con. Con cũng đang trên đường tìm lại chính mình, hi.

Cảm ơn bác nhiều. :)
 
Bảng tính toán với bảng in đang là 1 á bác.
Còn đặt ông ấy sang cột A là con phải cut paste 52 chỗ (cả khối gián tiếp lẫn trực tiếp) rồi canh cho nó ngay ngắn ở mỗi biểu nữa. Nó nhọc hơn là chỉ chỉnh công thức con dò tìm qua. Gửi ngân hàng chuyển khoản nó có cái mẫu biểu khác nữa.

Thôi đừng thay bác ưi, tội nghiệp con. Con cũng đang trên đường tìm lại chính mình, hi.

Cảm ơn bác nhiều. :)
Nên tách vấn đề tính toán ra riêng phần in (report)

Chỉnh lại vị trí 1 lần dùng mãi mãi và máy không phải làm gì nữa
Chỉnh công tức tiếp kiệm được vài phút - Nhưng máy phải tính toán cả đời file
 
Không chính xác bác ạ. Tôi đã cho ví dụ khi n = 1 thì kết quả sai.
...
Ừ nhỉ. Tôi nhầm rồi. Vậy thì bắt buộc phải dùng số lớn hơn 1.
Có lẽ phép search của MS nó không thuần nhị phân mà có thêm phép tối ưu nào đó (ví dụ đoán theo độ cân bằng của cây nhị phân?).
 

Bài viết mới nhất

Back
Top Bottom