Nếu bạn đang làm việc với Microsoft Access, DLookup giống như một “người vận chuyển” tận tụy. Nó giúp bạn tìm kiếm một giá trị cụ thể trong một bảng (Table) hoặc một truy vấn (Query) mà không cần phải mở bảng đó ra hay viết code SQL phức tạp.
Dưới đây là hướng dẫn chi tiết nhưng cực kỳ dễ hiểu để bạn làm chủ hàm này.
1. Cấu trúc của hàm DLookup
Hàm DLookup có 3 thành phần chính (đối số), tất cả đều phải nằm trong dấu ngoặc kép “”:
DLookup("Trường cần lấy", "Nguồn dữ liệu", "Điều kiện lọc")Trường cần lấy: Tên của cột dữ liệu bạn muốn lấy giá trị về (ví dụ: TenSanPham, GiaBan).
Nguồn dữ liệu: Tên của Table hoặc Query chứa dữ liệu đó.
Điều kiện lọc: (Tùy chọn) Giống như lệnh WHERE để chỉ định chính xác dòng nào cần lấy. Nếu bỏ qua, Access sẽ bốc đại dòng đầu tiên nó thấy.
2. Các ví dụ thực tế
Hãy giả sử bạn có một bảng tên là NhanVien. Trường hợp 1: Lấy dữ liệu với điều kiện là số Bạn muốn tìm tên nhân viên có mã số là 10.=DLookup("HoTen", "NhanVien", "ID = 10")
Trường hợp 2: Lấy dữ liệu với điều kiện là chữ (Text)
Khi điều kiện là chữ, bạn cần bao bọc giá trị đó bằng dấu nháy đơn '.
=DLookup("SoDienThoai", "NhanVien", "HoTen = 'Nguyen Van A'")
Trường hợp 3: Lấy dữ liệu dựa trên một ô (Control) trên Form
Đây là cách dùng phổ biến nhất. Ví dụ: Bạn nhập mã nhân viên vào ô txtMaNV và muốn một ô khác hiện tên tương ứng.
=DLookup("HoTen", "NhanVien", "ID = " & [txtMaNV])
3. Những lưu ý "sống còn" để không bị lỗi
DLookup rất hữu ích nhưng cũng khá "nhạy cảm". Hãy nhớ các quy tắc sau: Giá trị Null: Nếu không tìm thấy kết quả, DLookup trả về Null. Để tránh lỗi hiển thị, bạn nên kết hợp với hàm Nz. Ví dụ:Nz(DLookup(...), "Không tìm thấy")
Tốc độ: DLookup sẽ chạy chậm nếu bạn dùng nó trong một Query có hàng ngàn bản ghi. Nó phù hợp nhất để dùng trên Form hoặc Report.
Dấu ngoặc vuông []: Nếu tên bảng hoặc tên trường của bạn có khoảng trắng (ví dụ: Ho Ten), bạn bắt buộc phải dùng dấu ngoặc vuông: [Ho Ten].
4. Bảng so sánh các kiểu dữ liệu trong điều kiện
| Kiểu dữ liệu | Cú pháp ví dụ |
|---|---|
| Số (Number) | "ID = " & [txtID] |
| Chữ (Text) | "Ten = '" & [txtTen] & "'" |
| Ngày tháng (Date) | "NgayVaoLam = #" & [txtNgay] & "#" |
5. Ví dụ dùng hàm DLookup với Form Đăng nhập
a. Bảng NguoiDung có các trường sau: TenDangNhap: Tên Đăng Nhập MatKhau: Mật Khẩu b. frmLogin có các thành phần sau: txtTenDangNhap: Textbox để nhập Tên Đăng Nhập txtMatKhau: Textbox để nhập Mật Khẩu c. Code thực hiện quy trình đăng nhập
Option Compare Database
Option Explicit
Private Sub btnDangNhap_Click()
' Khai bao bien
Dim varMatKhau As Variant
' Bat dau bay loi
On Error GoTo Err_Handler
' 1. Kiem tra rong (Validation)
If IsNull(Me.txtTenDangNhap) Or Me.txtTenDangNhap = "" Then
MsgBox "Vui long nhap Ten Dang Nhap!", vbExclamation, "Thong Bao"
Me.txtTenDangNhap.SetFocus
Exit Sub
End If
If IsNull(Me.txtMatKhau) Or Me.txtMatKhau = "" Then
MsgBox "Vui long nhap Mat Khau!", vbExclamation, "Thong Bao"
Me.txtMatKhau.SetFocus
Exit Sub
End If
' 2. Dung DLookup de tim mat khau
varMatKhau = DLookup("MatKhau", "NguoiDung", "TenDangNhap = '" & Me.txtTenDangNhap & "'")
' 3. Kiem tra logic dang nhap
If IsNull(varMatKhau) Then
MsgBox "Ten dang nhap khong ton tai!", vbCritical, "Loi"
Else
' So sanh mat khau (Dung vbBinaryCompare de phan biet hoa thuong)
If StrComp(varMatKhau, Me.txtMatKhau, vbBinaryCompare) = 0 Then
MsgBox "Dang nhap thanh cong! Chao mung " & Me.txtTenDangNhap, vbInformation, "Thanh Cong"
' Mo Form chinh va dong Form dang nhap
' DoCmd.OpenForm "frmMain"
' DoCmd.Close acForm, Me.Name
Else
MsgBox "Mat khau khong chinh xac!", vbCritical, "Loi"
Me.txtMatKhau = ""
Me.txtMatKhau.SetFocus
End If
End If
' Tram dung de thoat code an toan
Exit_Sub:
Exit Sub
' Xu ly khi co loi bat ngo
Err_Handler:
MsgBox "Da xay ra loi he thong!" & vbCrLf & _
"Ma loi: " & Err.Number & vbCrLf & _
"Mo ta: " & Err.Description, vbCritical, "Loi VBA"
Resume Exit_Sub
End Sub
Private Sub FORM_LOAD()
Me.lblLoginForm.Caption = UCase(Me.lblLoginForm.Caption)
End Sub

