Lỗi hàm match trong VBA

Liên hệ QC

ruoitrau1987

Thành viên mới
Tham gia
21/12/11
Bài viết
27
Được thích
4
Các bác cho em hỏi với ạ

Em tạo combo box trong excel từ một cột, sau đó dùng hàm match để tìm vị trí tương ứng trong cột đó thì toàn báo unable to get the match property of the worksheetfunction class

Em tìm mãi chưa thấy bị lỗi gì, các bác xem giúp em file đính kèm với ạ. Em cảm ơn nhiều ạ
 

File đính kèm

  • Test.xlsm
    23.4 KB · Đọc: 20
Các bác cho em hỏi với ạ

Em tạo combo box trong excel từ một cột, sau đó dùng hàm match để tìm vị trí tương ứng trong cột đó thì toàn báo unable to get the match property of the worksheetfunction class

Em tìm mãi chưa thấy bị lỗi gì, các bác xem giúp em file đính kèm với ạ. Em cảm ơn nhiều ạ
Bạn thử đưa cbsl gán vào một cell nào đó như kiểu: Sheet1.cells(1,....)=Me.cbsl.value
và thay vào.......match(Sheet1.cells(1,....),Sheet1.Range("A1:A1000"),0) xem thế nào.
 

File đính kèm

  • Test (2).xlsm
    20.7 KB · Đọc: 19
Lần chỉnh sửa cuối:
Upvote 0
Bạn sửa code thành (thêm .Value vào)
Mã:
Private Sub UserForm_Initialize()
Dim sl
For Each sl In [solo]
        cbsl.AddItem sl.Value
    Next
End Sub

Không được ạ. Nó báo lỗi ở dòng này

vitri = Application.WorksheetFunction.Match(cbsl.Value, Sheet1.Range("A:A"), 0)
Bài đã được tự động gộp:

Bạn thử đưa cbsl gán vào một cell nào đó như kiểu: Sheet1.cells(1,....)=Me.cbsl.value
và thay vào.......match(Sheet1.cells(1,....),Sheet1.Range("A1:A1000"),0) xem thế nào.
Được rồi ạ. Thanks bác nhiều. Nhưng sao lại thế nhỉ. Code khác tương tự em vẫn chạy bình thường ạ
 
Upvote 0
Không được ạ. Nó báo lỗi ở dòng này

vitri = Application.WorksheetFunction.Match(cbsl.Value, Sheet1.Range("A:A"), 0)
Bài đã được tự động gộp:


Được rồi ạ. Thanks bác nhiều. Nhưng sao lại thế nhỉ. Code khác tương tự em vẫn chạy bình thường ạ
Một cách khác
Mã:
Private Sub cbsl_Change()
Dim vitri As Long
If cbsl.ListIndex < 0 Then Exit Sub
vitri = cbsl.ListIndex + 3

tbph.Value = Range("B" & vitri).Value
tbdd.Value = Range("C" & vitri).Value
tbdt.Value = Range("D" & vitri).Value
tbms.Value = Range("E" & vitri).Value
tbdn.Value = Range("F" & vitri).Value
tbbl.Value = Range("G" & vitri).Value
tbda.Value = Range("H" & vitri).Value
tbpo.Value = Range("I" & vitri).Value
tbtg.Value = Range("J" & vitri).Value
tbng.Value = Range("K" & vitri).Value

End Sub
 
Upvote 0
Xin lỗi tác giả, mình không kiểm tra kỹ. Nguyên nhân lỗi là combobox lưu tất cả list item dạng text trong khi dữ liệu trên sheet lại có thể dạng bất kỳ. Cách khắc phục:
- Dùng cbsl.listindex thay cho match;
- Nếu tất cả dữ liệu dạng số thì thêm Val vào vitri = Application.WorksheetFunction.Match(Val(cbsl.Value), Sheet1.Range("A:A"), 0)
- Khai báo mảng hoặc dictionary dùng chung cho cả form (nên dùng private để khai báo), khi nạp dữ liệu vào combobox thì đồng thời nạp vào mảng hoặc dic. Với mảng thì dùng match thay cho Sheet1.Range("A:A"), với dic thì bạn cần gán item là thứ tự của key.
- Chuyển toàn bộ dữ liệu ban đầu thành text.
- Sử dụng Row Source
 
Upvote 0
Tôi cố tình đợi đến nay mới giải thích vì tôi không thích ba cái màn thanh thiếc của Tây con.
Tôi giải thích đây cho nhứng bạn còn chưa hiểu về hàm Match.

Lỗi này do VBA hơi tùm lum lum về phương diện báo lỗi.
Một số hàm bảng tính như Match có thể trả về lỗi một cách tự nhiên. Lỗi tự nhiên ở trường hợp Match là tìm không thấy (trên bảng tính, bạn sẽ thấy nó là #NA!). VBA chuyển lỗi này thành cái câu khó hiểu như trên.

Cách khác phục:
Khi dùng hàm Match trong VBA, luôn luôn bẫy lỗi.
Có hai cách bẫy, một là dùng câu lệnh "On Error ...", và hai là dùng hàm Match đã được gói trong Application (Application.Match thay vì WorksheetFunction.Match)

Chú: nếu tham số nạp không đúng, WorksheetFunction.Match cũng bị lỗi như trên.
 
Upvote 0
Web KT

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

Back
Top Bottom