Lỗi khi dùng hàm VLOOKUP

Liên hệ QC

guitarthieuday

Thành viên mới
Tham gia
30/10/10
Bài viết
9
Được thích
0
Mình sử dụng hàm VLOOKUP để tìm kiếm học sinh khác nhau giữa 2 danh sách nhưng hiện tại bị lỗi một bên nhận thông tin đúng, một bên lại không nhận thông tin đó, mình đã sử dụng hàm TRIM để loại bỏ khoảng trống trong tên. Hai bên đều dùng font UNICODE. Mình có gửi kèm file mong các cao nhân giúp đỡ.
Xin chân thành cảm ơn !!!
 

File đính kèm

  • Tim hoc sinh.xls
    1.1 MB · Đọc: 12
Mình sử dụng hàm VLOOKUP để tìm kiếm học sinh khác nhau giữa 2 danh sách nhưng hiện tại bị lỗi một bên nhận thông tin đúng, một bên lại không nhận thông tin đó, mình đã sử dụng hàm TRIM để loại bỏ khoảng trống trong tên. Hai bên đều dùng font UNICODE. Mình có gửi kèm file mong các cao nhân giúp đỡ.
Xin chân thành cảm ơn !!!
Hi bạn,

Trong file bạn chưa khóa $ bảng dò, mình gửi lại file nhé.
 

File đính kèm

  • Tim hoc sinh.xls
    1.1 MB · Đọc: 5
Cảm ơn b đã góp ý, nhưng bên sheet 1 thì tìm được thông tin bên sheet 2 mà bên sheet 2 thì lại không tìm được bên sheet 1. Không biết tại sao và sửa như thế nào b nhỉ.
 
Cảm ơn b đã góp ý, nhưng bên sheet 1 thì tìm được thông tin bên sheet 2 mà bên sheet 2 thì lại không tìm được bên sheet 1. Không biết tại sao và sửa như thế nào b nhỉ.
Bạn xem file mình làm có đúng ý bạn chưa nhé:

* Hỏi thêm: mục đích bạn dò chéo qua lại như vậy để làm gì á?
 

File đính kèm

  • Tim hoc sinh.xls
    1.1 MB · Đọc: 6
* Hỏi thêm: mục đích bạn dò chéo qua lại như vậy để làm gì á?
Có thể để kiểm tra sự thiếu sót bên này so với bên kia. Ví dụ sheet1 có 100 người, sheet2 có 101 người. Nếu chỉ công thức ở sheet1(tìm bên sheet2) thì tất cả đều hiện tên đầy đủ, nhưng ngược lại, nếu công thức ở sheet2(tìm ở sheet1) thì có 1 người không có trong danh sách và bị hiên #N/A
 
Có thể để kiểm tra sự thiếu sót bên này so với bên kia. Ví dụ sheet1 có 100 người, sheet2 có 101 người. Nếu chỉ công thức ở sheet1(tìm bên sheet2) thì tất cả đều hiện tên đầy đủ, nhưng ngược lại, nếu công thức ở sheet2(tìm ở sheet1) thì có 1 người không có trong danh sách và bị hiên #N/A
Nếu mục đích kiểm tra thiếu sót giữa hai bên thì trường hợp này chỉ khả thi khi có mã vì tên trùng nhau nhiều lắm và định dạng chữ cũng không đồng nhất.
 
Nếu mục đích kiểm tra thiếu sót giữa hai bên thì trường hợp này chỉ khả thi khi có mã vì tên trùng nhau nhiều lắm và định dạng chữ cũng không đồng nhất.
Có lẽ bạn ấy đang tìm ra những mã #N/A để kiểm tra, theo như ban đầu bạn ấy nói:
Mình sử dụng hàm VLOOKUP để tìm kiếm học sinh khác nhau giữa 2 danh sách
Và gặp nhiều trường hợp như này, lấy tên học sinh để dò. Không biết khái niệm này từ đâu ra nhưng đó là điều hoàn toàn không hợp lý. Nếu nối chuỗi tên,ngày sinh, lớp thì nó khá an toàn. Còn tìm kiếm mỗi tên không thôi thì một trường như vậy khả năng trùng tên nhau là cực kỳ lớn
Còn vấn đề nữa, thớt nói là tất cả font đều bằng unicode (đúng hơn là bảng mã), nhưng mình tin chắc là bảng mã trong file chắc chắn có sự khác nhau. Chỉ là mình chưa biết cách kiểm tra bảng mã nguồn của nó
 
Có lẽ bạn ấy đang tìm ra những mã #N/A để kiểm tra, theo như ban đầu bạn ấy nói:

Và gặp nhiều trường hợp như này, lấy tên học sinh để dò. Không biết khái niệm này từ đâu ra nhưng đó là điều hoàn toàn không hợp lý. Nếu nối chuỗi tên,ngày sinh, lớp thì nó khá an toàn. Còn tìm kiếm mỗi tên không thôi thì một trường như vậy khả năng trùng tên nhau là cực kỳ lớn
Còn vấn đề nữa, thớt nói là tất cả font đều bằng unicode (đúng hơn là bảng mã), nhưng mình tin chắc là bảng mã trong file chắc chắn có sự khác nhau. Chỉ là mình chưa biết cách kiểm tra bảng mã nguồn của nó
Thực ra cách dò của thớt có nhiều chỗ hở lắm. Nhưng đây là kiểu làm ăn "đến đâu hay đến đó" mà. Hễ kẹt thì lại lên đây hỏi tiếp.
Lối là lỗi tại sự sốt sắng của GPE khiến nhiều người ỷ lại, riết rồi không còn biết sử dụng tầm nhìn xa hơn.
 
Cảm ơn b đã góp ý, nhưng bên sheet 1 thì tìm được thông tin bên sheet 2 mà bên sheet 2 thì lại không tìm được bên sheet 1. Không biết tại sao và sửa như thế nào b nhỉ.
Chuyện tìm kiếm theo tên dĩ nhiên là không nên vì có thể 2 người cùng họ tên. Nhưng không thể chối cãi là Sheet1 tìm thấy "Nguyễn Trung Hiếu" trong sheet2 trong khi sheet2 không tìm thấy "Nguyễn Trung Hiếu" trong sheet1 mặc dù cả 2 sheet đều có "Nguyễn Trung Hiếu". Đây là vấn đề cần làm sáng tỏ, vì đây là vấn đề lòng tin vào anh VLOOKUP. Nếu anh ta lúc tìm thấy (khi vui anh ta dễ tính?) lúc không tìm thấy (khi bực bội anh ta không tìm?) thì không thể tin tưởng được anh ta. Mà đã không thể tin tưởng thì có nghĩa là không dùng được.

Vấn đề chỉ xuất hiện khi chuỗi có ký tự unicode. Có đúng là cả 2 sheet đều có "Nguyễn Trung Hiếu"? Đúng. Nhưng chúng ............. không như nhau. :D

1. Tại sao sheet2 không tìm thấy "Nguyễn Trung Hiếu" trong sheet1?

Trong sheet1 có 4 chỗ có "Nguyễn Trung Hiếu" - D19, D217, D960, D1117. Ta xét sheet2!B27. Hãy chạy code
Mã:
Sub test()
Dim k As Long, s As String
    s = Sheet2.Range("B27").Value
    Debug.Print Len(s)
    s = Sheet1.Range("D19").Value
    Debug.Print Len(s)
     s = Sheet1.Range("D217").Value
    Debug.Print Len(s)
    s = Sheet1.Range("D960").Value
    Debug.Print Len(s)
    s = Sheet1.Range("D1117").Value
    Debug.Print Len(s)
End Sub
Kết quả có:
19
17
17
17
17
Chưa cần xét từng ký tự, chỉ cần xét độ dài chuỗi đã thấy là 4 chỗi ở sheet1 có độ dài như nhau bằng 17, còn chuỗi ở sheet2!B27 có độ dài 19. 2 chuỗi khác nhau về độ dài thì chắc chắn 200% là khác nhau. Ở đây là: 4 chuỗi có ký tự unicode dựng sẵn, còn 1 chuỗi có ký tự unicode tổ hợp. Cụ thể là trong sheet2!B27 cả "ễ" và "ế" đều là unicode tổ hợp. Kiểm tra dễ thôi. Nhập đâu đó trên sheet2 công thức
Mã:
=Len(B27)
Tất nhiên kết quả như trên tức 19. Bây giờ chọn B27 -> xóa hết chỉ để lại "ễ" -> công thức trả về 2 -> Undo lại "Nguyễn Trung Hiếu" -> xóa hết chỉ để lại "ế" -> công thức trả về 2. Tức 2 ký tự kia đều là unicode tổ hợp và có độ lớn là 2.

vd. "ễ" trong sheet2!B27 là ký tự unicode tổ hợp - được tổ hợp, được ghép từ 2 ký tự: từ ký tự "ê" có code = 00EA và ký tự dẫu ngã có code = 0303 - xem hình

1.JPG
2.JPG

Còn "ễ" trong vd. sheet1!D19 là ký tự unicode dựng sẵn có code = 1EC5 - xem hình

3.JPG

Tương tự với ký tự "ế" trong sheet2!B27 (unicode tổ hợp) và "ế" trong sheet1!D19 (unicode dựng sẵn).

2. Tại sao sheet1 tìm thấy "Nguyễn Trung Hiếu" trong sheet2?
Công thức ở sheet1!P19 tìm thấy "Nguyễn Trung Hiếu" nhưng ở sheet2!B154 chứ không phải ở sheet2!B27. Sheet1!D19 và sheet2!B154 đều chứa unicode dựng sẵn "ễ" và "ế". Chúng y hệt nhau còn hơn cả 2 chị em sinh đôi, vì chị em sinh đôi có thể khác nhau vd. 1 nốt ruồi. Vì thế sheet1 tìm thấy "Nguyễn Trung Hiếu" trong sheet2

Lưu ý: khi dùng unicode thì phải nhất quán. Hoặc mọi lúc mợi nơi dùng unicode tổ hợp, hoặc toàn unicode dựng sẵn. Tức mọi lúc mọi nơi chỉ dùng 1 kiểu. Bây giờ đã nhập rồi thì phải convert sang cùng một loại.
 
Lần chỉnh sửa cuối:
Cảm ơn các bác đã cho mình nhiều thông tin quý báu. Mình xin trả lời một số thông tin các bạn hỏi.
Mình cũng biết tìm người theo tên có nhiều hạn chế nhưng do phải so sánh danh sách từ 2 nguồn khác nhau nên không có mã số từng người, đành phải tìm theo tên rồi so ngày tháng năm sinh để ra được người thừa người thiếu, cũng mất thời gian lắm các bác ah.

Liệu có cách nào để so sánh và tìm nhanh hơn được không các bác ơi ???
Bài đã được tự động gộp:

Cảm ơn bác. Giờ mình đã hiểu vì sao rồi. Liệu có cách nào để chuyển đổi về cùng bảng mã không bác ơi. Kiểu như dùng chức năng CHUYỂN MÃ ở phần mềm UniKey ấy ???
 
Bạn hỏi tôi à? Viết chung chung thế ai biết hỏi ai.
Liệu có cách nào để chuyển đổi về cùng bảng mã không bác ơi. Kiểu như dùng chức năng CHUYỂN MÃ ở phần mềm UniKey ấy ???
Nếu Unikey có chức năng ấy thì dùng thôi. Tôi không dùng Unikey và không nhớ là Unikey có chức năng ấy không.
 
...Nếu Unikey có chức năng ấy thì dùng thôi. Tôi không dùng Unikey và không nhớ là Unikey có chức năng ấy không.
Chuyển mã là công vệc hết sức khó. Nếu bản ban đầu dùng tiêu chuẩn 1 mã thì gần như phần mềm nào cũng làm được. Nhưng nếu không bảo đảm được thuần một mã thì Unikey vừa chạy vừa khấn nguyện cho nó xuôi rót, nếu có vấn đề thì cũng một vài chỗ chỉnh tay được.
 
Web KT
Back
Top Bottom