Chào các Bạn,
Do nhu cầu công việc, tôi phải viết 1 hàm tìm kiếm để thay thế DLOOKUP, vốn dĩ ít linh hoạt và có phần nặng nề. Tôi đã sử dụng hàm mình tự viết và thấy nó "đa năng" hơn, đồng thời cũng hiệu quả hơn rất nhiều so với DLOOKUP.
Các Bạn thử sử dụng xem có đúng như thế không nhé.
Nội dung hàm như sau:
Thí dụ:
1. Để tìm mã số khách hàng (mskh) xác định được ghi trong bảng đăng ký chứng từ (tblctunx) thỏa điều kiện "soctu = 'X12/0412'", đồng thời lấy luôn giá trị ngày (ngay) của chứng từ này gán cho biến NgayCtu, ta viết dòng lệnh như sau:
2. Nếu bảng cần tìm nằm ở database khác được lưu tại: "DMYAPP\MYDATA.MDB"
dòng lệnh sẽ như sau:
3. Nếu database nêu trên đã được bảo mật theo cấp độ người sử dụng, ta phải khai báo 2 thông số sUser và Psw như sau: giả định User-Name là "lehongduc" và Password là "thuThuatAcc"
Do nhu cầu công việc, tôi phải viết 1 hàm tìm kiếm để thay thế DLOOKUP, vốn dĩ ít linh hoạt và có phần nặng nề. Tôi đã sử dụng hàm mình tự viết và thấy nó "đa năng" hơn, đồng thời cũng hiệu quả hơn rất nhiều so với DLOOKUP.
Các Bạn thử sử dụng xem có đúng như thế không nhé.
Nội dung hàm như sau:
Mã:
[COLOR="#006400"]Function [B]fLookup[/B][/COLOR][COLOR="#0000CD"]([B]WhatField [/B]As String, [B]WhatTb[/B] As String, [B]sCri [/B]As String, Optional [B]SubValue[/B], Optional [B]SubValueVar[/B], Optional [B]ExDb[/B], Optional [B]sUser[/B], Optional [B]Psw[/B])[/COLOR]
[COLOR="#006400"]'Thay cho Function Dlookup
'[B]WhatField[/B]: cột cần tìm trong bảng WhatTb
'[B]sCri[/B]: biểu thức điều kiện để tìm
'[B]SubValue[/B]: tên của 1 cột khác (ngoài cột cần tìm là WhatField)
'[B]SubValueVar[/B]: tên biến giữ giá trị của SubValue
'[B]ExDb[/B]: tên và đường dẫn (Path) đầy đủ của Database nếu không phải tìm bảng nằm trong Database đang mở
'[B]sUser[/B]: User-Name để mở ExDb
'[B]Psw[/B]: PassWord của sUser[/COLOR]
Dim sqlSt As String
Dim sqlRec As DAO.Recordset
Dim MyDb As DAO.Database
Dim MyWrk As DAO.Workspace
If Not IsMissing(sUser) Then
Set MyWrk = DBEngine.CreateWorkspace("MyWrk", sUser, Psw)
Else
Set MyWrk = DBEngine.Workspaces(0)
End If
If IsMissing(SubValue) Then
sqlSt = "SELECT TOP 1 " & WhatValue
Else
sqlSt = "SELECT TOP 1 " & WhatValue & "," & SubValue
End If
sqlSt = sqlSt & " FROM " & WhatTb
If Not IsMissing(ExDb) Then sqlSt = sqlSt & " IN '" & ExDb & "'"
sqlSt = sqlSt & " WHERE("
sqlSt = sqlSt & sCri
sqlSt = sqlSt & ")"
If IsMissing(ExDb) Then
Set MyDb = CurrentDb()
Else
Set MyDb = MyWrk.OpenDatabase(ExDb, , True)
End If
Set sqlRec = MyDb.OpenRecordset(sqlSt)
If sqlRec.RecordCount > 0 Then
fLookup = sqlRec(WhatValue)
If Not IsMissing(SubValue) Then SubValueVar = sqlRec(SubValue)
Else
fLookup = Null
End If
Set sqlRec = Nothing
Set MyDb = Nothing
Set MyWrk = Nothing
'
[COLOR="#006400"][COLOR="#006400"]End Function[/COLOR][/COLOR]
1. Để tìm mã số khách hàng (mskh) xác định được ghi trong bảng đăng ký chứng từ (tblctunx) thỏa điều kiện "soctu = 'X12/0412'", đồng thời lấy luôn giá trị ngày (ngay) của chứng từ này gán cho biến NgayCtu, ta viết dòng lệnh như sau:
Mã:
flookup( "mskh", "tblctunx", "soctu = 'X12/0412'", "ngay", NgayCtu)
2. Nếu bảng cần tìm nằm ở database khác được lưu tại: "DMYAPP\MYDATA.MDB"
dòng lệnh sẽ như sau:
Mã:
flookup( "mskh", "tblctunx", "soctu = 'X12/0412'", "ngay", NgayCtu, "D:\MYAPP\MYDATA.MDB")
3. Nếu database nêu trên đã được bảo mật theo cấp độ người sử dụng, ta phải khai báo 2 thông số sUser và Psw như sau: giả định User-Name là "lehongduc" và Password là "thuThuatAcc"
Mã:
flookup( "mskh", "tblctunx", "soctu = 'X12/0412'", "ngay", NgayCtu, "D:\MYAPP\MYDATA.MDB"), "lehongduc", "thuThuatAcc"