
Hàm trong VBA Access và thủ tục trong VBA Access khác nhau như nào ?
Hàm còn gọi là function VBA
Thủ tục gọi là sub VBA
Hàm trong VBA là gồm những đoạn lệnh thực thi một hay nhiều hành động nào đó và trả về giá trị.
Thủ tục trong VBA là gồm những đoạn lệnh thực thi một hay nhiều hành động nào đó và KHÔNG có trả về giá trị.
Các bạn chú ý: có trả về giá trị và Không trả về giá trị

Công cụ tạo hàm và thủ tục nhanh trong VBA Access
1. Viết hàm và thủ tục cơ bản VBA Access
* Ví dụ 1 thủ tục (sub) trong VBA
Public Sub ThongBao()
MsgBox "Xin chao"
End Sub
* Ví dụ 1 hàm (function) trong VBA
Public Function Tong()
Tong = 2 + 5
End Function
* Cách sử dụng / cách gọi hàm và thủ tục VBA Access
Trong form Access kéo vào 1 nút lệnh tạo sự kiện click:
Đối với gọi thủ tục VBA:
Private Sub Command1_Click()
ThongBao
End Sub
Đối với gọi hàm VBA:
Private Sub Command1_Click()
a = Tong
MsgBox a
End Sub
?? Tại sao lại làm vấn đề code VBA phức tạp như vậy
?? Tại sao ta không code ghi rõ ra mà phải đưa vào hàm và thủ tục
Private Sub Command1_Click()
MsgBox "Xin chao"
MsgBox 5+2
End Sub
?? Bạn hãy suy nghĩ để trong đầu nha ! mình sẽ trình bày phần tiếp theo
2. Viết hàm và thủ tục có tham số truyền vào
* Ví dụ 1 thủ tục (sub) có tham số truyền vào trong VBA
Public Sub ThongBao(cauthongbao)
MsgBox cauthongbao
End Sub
* Ví dụ 1 hàm (function) có tham số truyền vào trong VBA
Public Function Tong(a,b)
Tong = a + b
End Function
* Cách sử dụng / cách gọi hàm và thủ tục có tham số truyền vào trong VBA Access
Trong form Access kéo vào 1 nút lệnh tạo sự kiện click:
Đối với gọi thủ tục VBA:
Private Sub Command1_Click()
ThongBao "Hello"
End Sub
Đối với gọi hàm VBA:
Private Sub Command1_Click()
a = Tong(2,5)
MsgBox a
End Sub
** Đến đây thì các bạn đã thấy 1 phần nào sự linh hoạt trong sử dụng các hàm và thủ tục
** Ví dụ 1 hàm Giải phương trình bậc 2:
Function GiaiPTB2(Za As Double, Zb As Double, Zc As Double, Optional Zx As Long) As String
Dim Denta As Double, Checked As Boolean
Denta = Zb ^ 2 - 4 * Za * Zc
If Denta > 0 Then
Checked = True
X1 = (-Zb + Denta ^ (1 / 2)) / (2 * Za)
X2 = (-Zb - Denta ^ (1 / 2)) / (2 * Za)
ElseIf Denta = 0 Then
Checked = True
X1 = -Zb / (2 * Za)
X2 = -Zb / (2 * Za)
Else
Checked = False
End If
'=========================================
If Checked = True Then
If Zx = 1 Then
GiaiPTB2 = "X1=" & X1
ElseIf Zx = 2 Then
GiaiPTB2 = "X2= " & X2
Else
GiaiPTB2 = "X1= " & X1 & " // X2= " & X2
End If
Else
GiaiPTB2 = "Phuong trinh vo nghiem"
End If
End Function
Cách gọi hàm giải phương trình bậc 2 VBA Access:
Private Sub Command1_Click()
x = GiaiPTB2(2, 12, 5)
MsgBox x
End Sub
** Nếu chúng ta không dùng hàm VBA mà viết trực tiếp code VBA thì
Private Sub Command1_Click()
Za = 12
Zb = 1
Zc = 2
Dim ketqua As String
Dim Denta As Double, Checked As Boolean
Denta = Zb ^ 2 - 4 * Za * Zc
If Denta > 0 Then
Checked = True
X1 = (-Zb + Denta ^ (1 / 2)) / (2 * Za)
X2 = (-Zb - Denta ^ (1 / 2)) / (2 * Za)
ElseIf Denta = 0 Then
Checked = True
X1 = -Zb / (2 * Za)
X2 = -Zb / (2 * Za)
Else
Checked = False
End If
'=========================================
If Checked = True Then
If Zx = 1 Then
ketqua = "X1=" & X1
ElseIf Zx = 2 Then
ketqua = "X2= " & X2
Else
ketqua = "X1= " & X1 & " // X2= " & X2
End If
Else
ketqua = "Phuong trinh vo nghiem"
End If
MsgBox ketqua
End Sub
** Tham số Optional trong hàm hay thủ tục VBA là gì ?
Tham số này là tùy chọn, có thể nhập hay bỏ qua chứ không bắt buộc, nếu như không để Optional thì bắt buộc phải có, nếu không có thì VBA sẽ báo lỗi.
** Qua ví dụ này ta thấy nếu không viết hàm giải PT bậc 2 thì mỗi lần cần xử lý chúng ta phải viết code lặp đi lặp lại rất nhiều, tốn thời gian, việc bảo trì phần mềm rất khó khăn.
- Tại sao việc bảo trì phần mềm là dễ dàng khi viết hàm ? bởi vì mỗi nút lệnh gọi hàm viết rất gọn chỉ 1 dòng, code gốc xử lý nằm tại hàm VBA, nếu có sự thay đổi code thì ta chỉ thay đổi ở hàm gốc là được
Ví dụ viết hàm để trả về 1 Recorderset trong VBA
Tham khảo tại: https://iif.vn/vba-access/cach-viet-ham-tra-ve-recordset-dao
Nếu không viết hàm thì việc gọi để lấy dữ liệu sẽ xảy ra rất nhiều lần khi viết phần mềm bằng Access.
** Làm sao để hiệu quả sử dụng hàm và thủ tục trong VBA ?
Chúng ta hãy đưa code vba vào trong module của VBA.