1. CÁC LOẠI SỰ KIỆN TRONG VBA EXCEL
Trong VBA có 2 loại sự kiện chính:
- Sự kiện cho Workbook: Là các sự kiện liên quan tới workbook hay còn gọi là 1 file excel: khi chọn 1 file excel, khi mở 1 file, hoặc khi đóng, khi lưu 1 file… Đối tượng trong nhóm sự kiện này rất nhiều và đa dạng.
- Sự kiện cho Worksheet: Là các sự kiện liên quan tới các WorkSheet trong 1 workbook. Sự kiện dành cho WorkSheet ít hơn so với Workbook, chủ yếu gắn liền với việc có sự thay đổi trong việc chọn lựa, tính toán, cập nhật dữ liệu trong sheet.
Ngoài ra còn 1 loại sự kiện nữa là sự kiện trong UserForm, nội dung này sẽ được trình bày trong bài viết khác.
2. Ý NGHĨA CỦA CÁC SỰ KIỆN
Bởi có rất nhiều sự kiện nên chúng ta sẽ tìm hiểu thông qua một vài sự kiện hay sử dụng và từ đó các bạn sẽ áp dụng cho các sự kiện khác:
A. SỰ KIỆN CHO WORKBOOK
Các sự kiện độc lập:
- Active là hoạt động, kích hoạt. Tức là khi workbook đó được chọn, được kích hoạt thì sẽ có điều gì xảy ra
- Deactive là khi không được kích hoạt
- Open là khi workbook đó được mở thì có thể xảy ra điều gì, ví dụ như ẩn 1 số Sheet nào đó, hay hiện lên 1 thông báo bằng Userform
Các sự kiện gắn với Before
Là trước khi hoàn thành 1 việc gì đó, trước khi thực hiện một sự kiện gì đó thì sẽ thực hiện câu lệnh macro trước, rồi sau đó mới đến lượt sự kiện đó được thực thi. Macro sẽ phải hoàn thành trước rồi mới thực hiện sự kiện đó.
- BeforeClose: trước khi workbook được đóng lại thì có thể làm gì? ví dụ như xóa một nội dung, tính toán lại 1 bảng tính, cập nhật báo cáo… sau đó mới thực hiện đóng workbook
- BeforePrint: trước khi thực hiện việc in thì sẽ phải hoàn tất một thủ tục gì đó, ví dụ như kẻ khung, định dạng, thêm bớt nội dung, ẩn/hiện một số dòng, cột trong 1 sheet… rồi mới đến thực hiện lệnh in
Các sự kiện gắn với After
Là sau khi hoàn thành 1 sự kiện thì lập tức thực hiện tiếp một số câu lệnh. Macro sẽ thực hiện sau khi sự kiện đó hoàn thành. Mặc dù kết quả đều gần giống với sự kiện Before nhưng thứ tự thực hiện là khác nhau, nên có thể dẫn tới việc kết quả đưa ra có chính xác hay không.
- AfterSave: Sau khi workbook được lưu
- AfterXMLImport: Sau khi nạp dữ liệu từ 1 file XML vào workbook
Các sự kiện liên quan tới Sheet trong Workbook
Là khi một trong số các Sheet trong Workbook được tác động: Bị xóa, bị đổi tên, bị di chuyển, click chuột trái, click chuột phải… thì sẽ có thể chạy ra 1 câu lệnh macro
Các sự kiện liên quan tới Window – cửa sổ làm việc của Excel
Khi cửa sổ làm việc của excel diễn ra một sự kiện nào đó, như thay đổi kích thước (resize), được kích hoạt (active), không được kích hoạt (deactive)… thì chúng ta có thể gắn vào đó một số câu lệnh. Ví dụ như khi cửa sổ làm việc của Excel bị thay đổi kích thước thì chúng ta cũng đồng thời thay đổi kích thước của 1 Userform chẳng hạn.
B. SỰ KIỆN CHO WORKSHEET
Tương tự với các sự kiện của Workbook, trong Worksheet cũng có các sự kiện độc lập, sự kiện gắn với Before. Ngoài ra còn có các sự kiện đặc trưng cho đối tượng Pivot table, Table.
Mỗi khi chúng ta tác động tới một đối tượng cụ thể, một vùng cụ thể trong Sheet bằng một sự kiện: thay đổi dữ liệu, thay đổi vị trí chọn, click chuột phải, nháy đúp chuột… thì đều có thể gắn với 1 lệnh macro để thực hiện một điều gì đó.
Nếu tại Worksheet thì chúng ta cần phải chọn cụ thể là worksheet nào. Khi đó tại đúng Sheet đã được thiết lập sự kiện mới có thể khiến macro trong sự kiện đó hoạt động.
3. CÁCH TẠO 1 SỰ KIỆN TRONG VBA
Rất đơn giản, chúng ta chỉ cần chọn nơi mà chúng ta muốn bắt sự kiện: tại workbook hay tại worksheet. Nếu tại Worksheet thì cần cụ thể là Worksheet nào.
Khi chọn nơi bắt sự kiện, phần bảng viết code sẽ có 2 mục: Đối tượng nào và sự kiện nào.
- Đối tượng nào: Thường trong ThisWorkbook sẽ chọn Workbook, trong Sheet sẽ chọn Worksheet
- Sự kiện nào: tùy theo mục đích mà chúng ta sẽ chọn sự kiện phù hợp với đối tượng được chọn. Hầu hết các sự kiện có thể xảy ra đều được liệt kê đầy đủ, có sẵn để cho chúng ta chọn.
Khi chọn 1 sự kiện thì sẽ ra một câu lệnh đặ trong Private Sub:
Private Sub là 1 thủ tục chạy ngầm, không gọi trực tiếp như Sub thông thường.
Khi chọn sự kiện trong Worksheet thì ban đầu sẽ tự động mặc định là sự kiện SelectionChange (thay đổi đối tượng được chọn). Muốn thay đổi sang sự kiện khác thì chúng ta sẽ chọn lại sự kiện trong mục Sự kiện nào
Các câu lệnh macro cần thực hiện khi sự kiện diễn ra (khi bắt được sự kiện) phải được đặt trong cấu trúc của sự kiện đó (nằm trong Private Sub – End Sub)