Một hàm tự viết thay thế cho DLOOKUP của Access

  • Thread starter lehongduc
  • Ngày gửi
L

lehongduc

Trung cấp
29/3/05
131
1
18
66
VietNam
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:

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]
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:
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: "D:\MYAPP\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"
 
Khóa học Quản trị dòng tiền
C

ceschenry14

Guest
2/12/12
1
0
0
30
Bến Tre
Ðề: Một hàm tự viết thay thế cho DLOOKUP của Access

a ơi, nhưng làm sao mình sữa/tạo hàm này a? a giúp e chi tiết tí nhe a, e mới học nhưng đang rất cần dễ nộp bài báo cáo
 
L

lehongduc

Trung cấp
29/3/05
131
1
18
66
VietNam
Ðề: Một hàm tự viết thay thế cho DLOOKUP của Access

a ơi, nhưng làm sao mình sữa/tạo hàm này a? a giúp e chi tiết tí nhe a, e mới học nhưng đang rất cần dễ nộp bài báo cáo

Chào Bạn,
Dễ thôi mà, vắn tắt thế này nhé:
- Trong cửa sổ Database của MS. Access, chọn module
- Bấm nút New sẽ mở ra 1 trang module trống
- Copy nguyên cái đoạn mã trên vào module trống đang mở
- Lưu trang module trống đó lại với tên tuỳ ý.
Vậy là Bạn đã có 1 Function để sử dụng trong Database đang mở.
Bạn cần cố gắng đọc help của MS. Access để hiểu sâu và chắc hơn về nhu cầu Bạn đang cần.

Chúc sức khoẻ.
 
tinhdonphuong

tinhdonphuong

Trung cấp
13/12/12
78
0
0
Hà Nội
Ðề: Một hàm tự viết thay thế cho DLOOKUP của Access

hình như bản 2013 có mã code khác đúng ko ạ?
 
L

lehongduc

Trung cấp
29/3/05
131
1
18
66
VietNam
Ðề: Một hàm tự viết thay thế cho DLOOKUP của Access

hình như bản 2013 có mã code khác đúng ko ạ?
Không rõ ý Bạn muốn hỏi gì?
Nếu Bạn muốn nói đến các phiên bản của MS Access thì thể này: Hàm trên có thể sử dụng được trên MS Access từ phiên bản 97 trở về sau.
 

Xem nhiều