Giúp đỡ hàm Match và Index trong VBA

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

quocvietpm

Thành viên mới
Tham gia
16/11/09
Bài viết
12
Được thích
0
Mọi người giúp em sửa code bên dưới. Số là em muốn trả về kết quả để dùng nó vào việc khác. Tuy nhiên Code này nó chỉ chạy đúng tầm 2 đến 3 lần. Nếu tiếp tục nhập mã nhân viên, các mã nhân viên nằm từ dòng 135 -->1 luôn trả về 135 trên hàm Match. Các mã nhân viên dòng 135 trở đi thì luôn luôn đúng. Mọi người chỉ giáo giúp. Nó không bị lỗi, chỉ là ra kết quả lúc được lúc không. Không biết code :D luôn (':D) luôn chuyển thành mặt cười, sửa thế nào nữa.

Private Sub txtoperatorcode_AfterUpdate() 'Update name basing on code
Dim Shman As Worksheet
Dim ocd As Long, position As Long
Dim status As String

Set Shman = ThisWorkbook.Worksheets("Man")

If WorksheetFunction.CountIf(Sheets("Man").Range("D:D"), Me.txtoperatorcode.Value) = 0 Then
MsgBox "This Operator Code is not on the list"
Me.txtoperatorcode.Value = ""

Exit Sub
End If

ocd = Me.txtoperatorcode.Value
position = WorksheetFunction.Match(ocd, Sheets("Man").Range("D1:D300"))
'status = Application.Lookup(ocd, Shman.Range("D:D"), Shman.Range("A:A"))
status = Application.Index(Sheets("Man").Range("A:A"), position, 0)
If status = "Active" Or status = "Leader" Or status = "Subleader" Then
On Error Resume Next
With Me
'ocd = .txtoperatorcode.Value
.txtoperatorname = Application.WorksheetFunction.VLookup(ocd, Shman.Range("D:E"), 2, 0)

If Err.Number <> 0 Then
.txtoperatorname = ""
End If
End With

Else
Me.txtoperatorname = ""
Me.txtoperatorcode = ""

End If

End Sub
 

File đính kèm

  • Crimping tools send-receive log.xlsm
    201 KB · Đọc: 13
:D (dấu hai chấm và D) sửa thành ": D" (có dấu cách) là được nhé
 
Upvote 0
:D (dấu hai chấm và D) sửa thành ": D" (có dấu cách) là được nhé
Cảm ơn anh. Số là mò đủ cách mà hàm match cứ nhảy số lung tung, không biết sao lại vậy. Thà nó lỗi thì có thể tìm xem bị thế nào. Đằng này vẫn ra địa chỉ nhưng lại sai. Hàm Index thì ra đúng.

Em cắt một đoạn mã này thôi cho đơn giản hơn

Private Function status(msnv As Double) As String

Dim position As Double
Dim idrange As Range, statusrange As Range

Set idrange = ThisWorkbook.Worksheets("Man").Range("D3: D200")
Set statusrange = ThisWorkbook.Worksheets("Man").Range("A3:A200")


msnv = Me.txtoperatorcode.Value
position = WorksheetFunction.Match(msnv, idrange)
MsgBox position
status = Application.WorksheetFunction.Index(statusrange, position, 1)


End Function
 
Upvote 0
Cảm ơn anh. Số là mò đủ cách mà hàm match cứ nhảy số lung tung, không biết sao lại vậy. Thà nó lỗi thì có thể tìm xem bị thế nào. Đằng này vẫn ra địa chỉ nhưng lại sai. Hàm Index thì ra đúng.

Em cắt một đoạn mã này thôi cho đơn giản hơn

Private Function status(msnv As Double) As String

Dim position As Double
Dim idrange As Range, statusrange As Range

Set idrange = ThisWorkbook.Worksheets("Man").Range("D3: D200")
Set statusrange = ThisWorkbook.Worksheets("Man").Range("A3:A200")


msnv = Me.txtoperatorcode.Value
position = WorksheetFunction.Match(msnv, idrange)
MsgBox position
status = Application.WorksheetFunction.Index(statusrange, position, 1)


End Function
Hay là bạn thử dùng hàm Find của VBA sẽ đơn giản hơn nhiều lắm
 
Upvote 0
Nếu mình nhớ không lầm thì match có thừa số 0 phía sau để tìm chính xác

Bạn đang tìm gần đúng
position = WorksheetFunction.Match(msnv, idrange)

Tìm chính xác:
position = WorksheetFunction.Match(msnv, idrange,0)
 
Upvote 0
Hay là bạn thử dùng hàm Find của VBA sẽ đơn giản hơn nhiều lắm
Cảm ơn anh đã khai mở. Em dùng hàm Find được rồi. Nhưng vẫn còn tò mò sao hàm Match lại chạy lộn xộn. Lần đầu chạy, test thấy được, hôm sau thì failed cho tới bây giờ vẫn chưa hiểu tại sao.
Bài đã được tự động gộp:

Nếu mình nhớ không lầm thì match có thừa số 0 phía sau để tìm chính xác

Bạn đang tìm gần đúng
position = WorksheetFunction.Match(msnv, idrange)

Tìm chính xác:
position = WorksheetFunction.Match(msnv, idrange,0)
Cảm ơn anh. Em đã thay đủ kiểu từ 0 và 1. Nhưng vẫn không chạy đúng được
 
Upvote 0
Mọi người giúp em sửa code bên dưới. Số là em muốn trả về kết quả để dùng nó vào việc khác. Tuy nhiên Code này nó chỉ chạy đúng tầm 2 đến 3 lần. Nếu tiếp tục nhập mã nhân viên, các mã nhân viên nằm từ dòng 135 -->1 luôn trả về 135 trên hàm Match. Các mã nhân viên dòng 135 trở đi thì luôn luôn đúng. Mọi người chỉ giáo giúp. Nó không bị lỗi, chỉ là ra kết quả lúc được lúc không. Không biết code :D luôn (':D) luôn chuyển thành mặt cười, sửa thế nào nữa.

Private Sub txtoperatorcode_AfterUpdate() 'Update name basing on code
Dim Shman As Worksheet
Dim ocd As Long, position As Long
Dim status As String

Set Shman = ThisWorkbook.Worksheets("Man")

If WorksheetFunction.CountIf(Sheets("Man").Range("D:D"), Me.txtoperatorcode.Value) = 0 Then
MsgBox "This Operator Code is not on the list"
Me.txtoperatorcode.Value = ""

Exit Sub
End If

ocd = Me.txtoperatorcode.Value
position = WorksheetFunction.Match(ocd, Sheets("Man").Range("D1:D300"))
'status = Application.Lookup(ocd, Shman.Range("D:D"), Shman.Range("A:A"))
status = Application.Index(Sheets("Man").Range("A:A"), position, 0)
If status = "Active" Or status = "Leader" Or status = "Subleader" Then
On Error Resume Next
With Me
'ocd = .txtoperatorcode.Value
.txtoperatorname = Application.WorksheetFunction.VLookup(ocd, Shman.Range("D:E"), 2, 0)

If Err.Number <> 0 Then
.txtoperatorname = ""
End If
End With

Else
Me.txtoperatorname = ""
Me.txtoperatorcode = ""

End If

End Sub
Muốn biết lỗi do đâu thì phải debug. Tôi xem file của bạn nhưng chẳng biết làm cách nào để nó xảy ra lỗi.
 
Upvote 0
Muốn biết lỗi do đâu thì phải debug. Tôi xem file của bạn nhưng chẳng biết làm cách nào để nó xảy ra lỗi.
Nó không có lỗi anh ơi. Nó chạy ra kết quả không đúng thôi. Em đổi kiểu biến, đổi cách khai báo, thậm chí tách ra 1 function. Nó cũng không ra kết quả đúng được. Đúng ra là có dòng đúng, dòng không, chứ không phải dòng nào cũng không ra đúng. Kểu randomly ấy. Nhưng nếu dòng đó 6, ra kết quả là 8 chẳng hạn thì nó sẽ ra vậy. Chỉnh trong code gì đó chút, thì lần sau sẽ khác. Tiếp tục giữ code đó thì nó ra đúng cái sai vậy. Dùng hàm Find thì giơ ra được rồi.
 
Upvote 0
Nó không có lỗi anh ơi. Nó chạy ra kết quả không đúng thôi. Em đổi kiểu biến, đổi cách khai báo, thậm chí tách ra 1 function. Nó cũng không ra kết quả đúng được. Đúng ra là có dòng đúng, dòng không, chứ không phải dòng nào cũng không ra đúng. Kểu randomly ấy. Nhưng nếu dòng đó 6, ra kết quả là 8 chẳng hạn thì nó sẽ ra vậy. Chỉnh trong code gì đó chút, thì lần sau sẽ khác. Tiếp tục giữ code đó thì nó ra đúng cái sai vậy. Dùng hàm Find thì giơ ra được rồi.
Bạn có chắc là randomly?
Không phải là inconsistent, sporadic, irregular?
Nếu bạn chắc thì tôi sẽ debug theo đường lối "sai kiểu ấy"
Nếu bạn không chắc thì nói rằng nó không nhát định.
Trong lập trình, random khác với inconsistent.
 
Upvote 0
Bạn có chắc là randomly?
Không phải là inconsistent, sporadic, irregular?
Nếu bạn chắc thì tôi sẽ debug theo đường lối "sai kiểu ấy"
Nếu bạn không chắc thì nói rằng nó không nhát định.
Trong lập trình, random khác với inconsistent.
Vì em không biết quy luật của nó nên em gọi là randomly. Nhưng nếu chọn inconsistent cho trường hợp này thì hợp lý hơn. Em rất tò mò sao lại bị như vầy. Tìm khắp nơi mà chưa biết nó bị thế nào. Có lẽ là keywords chưa đúng.
 
Upvote 0
Có khả năng liên quan đến kiểu dữ liệu trên cell vì hàm Match không tìm được kiểu dữ liệu số (không biết tôi có nhớ nhầm vụ này không)
 
Upvote 0
Có khả năng liên quan đến kiểu dữ liệu trên cell vì hàm Match không tìm được kiểu dữ liệu số (không biết tôi có nhớ nhầm vụ này không)
Em nghĩ nếu không tìm được nó sẽ báo lỗi. Đằng này nó ra không đúng. Dường như bên này họ cũng có lỗi tương tự. Không biết em có được phép post link này không. Nếu không được, Admin cho em xin lỗi.
 
Upvote 0
Web KT
Back
Top Bottom