
VBA Events, Class Module Và Custom Objects: Lập Trình Hướng Sự Kiện Trong Excel
Chia sẻ
"Tìm hiểu lập trình hướng sự kiện trong VBA: Workbook Events, Worksheet Events, Class Module, Custom Objects, Collection. Nâng tầm VBA từ macro đơn giản lên ứng dụng chuyên nghiệp."
VBA không chỉ là macro ghi lại thao tác. Khi bạn hiểu về Events (sự kiện), Class Module và Custom Objects, bạn sẽ biến Excel thành một ứng dụng thực thụ — tự động phản hồi khi người dùng thao tác, có cấu trúc code rõ ràng và dễ bảo trì.
Bài viết này dành cho những ai đã biết VBA cơ bản (Sub, Function, biến, vòng lặp) và muốn nâng cấp lên level chuyên nghiệp.

1. Workbook Events — Sự Kiện Ở Cấp Workbook
Workbook Events là các sự kiện xảy ra ở cấp file Excel: mở file, đóng file, lưu file, in ấn... Code được viết trong ThisWorkbook module.
1.1 Các Workbook Events phổ biến
' Chạy khi mở file
Private Sub Workbook_Open()
MsgBox "Chào mừng bạn đến với hệ thống quản lý!"
Sheets("Dashboard").Activate
' Tự động cập nhật ngày hiện tại
Sheets("Dashboard").Range("B1").Value = Date
End Sub
' Chạy trước khi lưu file
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
' Tự động cập nhật timestamp
Sheets("Log").Range("A" & Rows.Count).End(xlUp).Offset(1).Value = Now()
Sheets("Log").Range("B" & Rows.Count).End(xlUp).Value = Environ("USERNAME")
End Sub
' Chạy trước khi đóng file
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If MsgBox("Bạn đã lưu file chưa?", vbYesNo) = vbNo Then Cancel = True
End Sub1.2 Ứng dụng thực tế
Auto-backup file khi lưu: sao chép file vào thư mục backup với tên chứa timestamp
Ghi log ai mở/sửa file khi nào
Tự động refresh Pivot Table hoặc Power Query khi mở file
Hiển thị form đăng nhập khi mở file (bảo mật)
2. Worksheet Events — Sự Kiện Ở Cấp Sheet
Worksheet Events xảy ra khi người dùng tương tác với 1 sheet cụ thể. Code viết trong module của sheet đó (double-click tên sheet trong VBA Editor).
2.1 Worksheet_Change — Bắt thay đổi dữ liệu
' Tự động tô màu khi nhập dữ liệu vào cột D (Trạng thái)
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 4 Then Exit Sub
If Target.Cells.Count > 1 Then Exit Sub
Select Case UCase(Target.Value)
Case "HOÀN THÀNH": Target.Interior.Color = RGB(144, 238, 144) ' Xanh lá
Case "ĐANG LÀM": Target.Interior.Color = RGB(255, 255, 153) ' Vàng
Case "TRỄ HẠN": Target.Interior.Color = RGB(255, 150, 150) ' Đỏ
Case Else: Target.Interior.ColorIndex = xlNone
End Select
End Sub2.2 Worksheet_SelectionChange — Highlight dòng đang chọn
' Highlight toàn bộ dòng hiện tại
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Cells.Interior.ColorIndex = xlNone ' Xóa highlight cũ
Target.EntireRow.Interior.Color = RGB(230, 240, 255) ' Xanh nhạt
End Sub2.3 Worksheet_BeforeDoubleClick — Double-click kích hoạt hành động
' Double-click để toggle trạng thái Đã duyệt / Chưa duyệt
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Column = 5 Then ' Cột E = Duyệt
Cancel = True
If Target.Value = "✅" Then
Target.Value = "⬜"
Else
Target.Value = "✅"
End If
End If
End Sub3. Class Module — Tạo Object Riêng
Class Module cho phép bạn tạo Custom Object với Properties và Methods riêng — giống lập trình hướng đối tượng (OOP). Điều này giúp code sạch, tái sử dụng được và dễ bảo trì.
3.1 Tạo Class Module
Insert → Class Module → Đặt tên (VD: clsNhanVien). Trong class, khai báo Properties và Methods:
' === Class Module: clsNhanVien ===
Private pMaNV As String
Private pHoTen As String
Private pLuongCB As Currency
Private pNgayCong As Integer
' Properties
Public Property Get MaNV() As String: MaNV = pMaNV: End Property
Public Property Let MaNV(v As String): pMaNV = v: End Property
Public Property Get HoTen() As String: HoTen = pHoTen: End Property
Public Property Let HoTen(v As String): pHoTen = v: End Property
Public Property Get LuongCB() As Currency: LuongCB = pLuongCB: End Property
Public Property Let LuongCB(v As Currency): pLuongCB = v: End Property
' Method: Tính lương thực nhận
Public Function TinhLuong() As Currency
Dim luongGross As Currency
luongGross = pLuongCB * pNgayCong / 26
TinhLuong = luongGross - (luongGross * 0.105) ' Trừ BH 10.5%
End Function3.2 Sử dụng Class trong code
Sub TinhLuongNhanVien()
Dim nv As New clsNhanVien
nv.MaNV = "NV001"
nv.HoTen = "Nguyễn Văn A"
nv.LuongCB = 15000000
MsgBox nv.HoTen & " - Lương: " & Format(nv.TinhLuong(), "#,##0")
End Sub4. Collection Của Custom Objects
Kết hợp Class Module với Collection để quản lý danh sách objects — ví dụ danh sách nhân viên, sản phẩm, đơn hàng:
Sub QuanLyNhanVien()
Dim dsNV As New Collection
Dim nv As clsNhanVien
Dim ws As Worksheet: Set ws = Sheets("DanhSach")
Dim i As Long
' Load từ bảng Excel vào Collection
For i = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row
Set nv = New clsNhanVien
nv.MaNV = ws.Cells(i, 1).Value
nv.HoTen = ws.Cells(i, 2).Value
nv.LuongCB = ws.Cells(i, 3).Value
dsNV.Add nv, nv.MaNV ' Key = Mã NV
Next i
' Tìm nhân viên theo mã
Set nv = dsNV("NV001")
MsgBox nv.HoTen & " - Lương: " & Format(nv.TinhLuong(), "#,##0")
End Sub5. WithEvents — Bắt Sự Kiện Từ Controls
WithEvents cho phép Class Module bắt sự kiện từ các ActiveX Controls hoặc Application object. Ví dụ: tạo 1 class xử lý click event cho tất cả Button trên form.
' === Class: clsButtonHandler ===
Public WithEvents btn As MSForms.CommandButton
Private Sub btn_Click()
MsgBox "Bạn đã click: " & btn.Caption
End Sub6. Best Practices
Luôn dùng Option Explicit để tránh lỗi biến
Đặt tên Class có prefix: cls (clsNhanVien, clsDonHang)
Dùng Property Let/Get thay vì Public variables
Comment mô tả mục đích của mỗi Event procedure
Tránh đặt code dài trong Event — gọi Sub/Function riêng
Test Events bằng Debug.Print trước khi viết logic phức tạp
Kết Luận
Events, Class Module và Custom Objects là 3 trụ cột giúp VBA chuyển từ "ghi macro" sang "lập trình thực thụ". Workbook/Worksheet Events tạo phản hồi tự động, Class Module giúp tổ chức code sạch, và Collection giúp quản lý dữ liệu linh hoạt.
Học thêm VBA và các kỹ thuật nâng cao tại Trà Đá Data! 🍵
📌 Lưu ý: File demo .xlsm download từ mạng cần bỏ chặn macro trước khi sử dụng. Xem hướng dẫn chi tiết: Cách Bỏ Chặn Macro Excel.
Bình luận
Đăng nhập để tham gia bình luận
Đăng nhậpNhận bài viết mới nhất
Đăng ký để nhận thông báo khi có bài viết mới. Không spam, chỉ kiến thức chất lượng.
Bài viết liên quan
Khám phá thêm các bài viết cùng chủ đề

