138
Đoạn mã trên sử dụng cách thức 2 để tham chiếu đến một ô trong worksheet. Object ở đây
chính là đối tượng Worksheet, vì vậy tập đối tượng Cells là tập đối tượng chứa tất cả các ô có
trong worksheet. Ô đầu tiên – ô A1 – sẽ có thứ tự là 1, các ô còn lại được đánh số từ trái sang
phải và sau đó từ trên xuống dưới. Một worksheet là một vùng dữ liệu có 65536 hàng và 256
cột nên ô thức 256 là ô cuối cùng của hàng thứ nhất, ô IV1; còn ô thứ 257 sẽ
là ô đầu tiên của
hàng thứ 2, ô A2.
Xét đoạn mã thứ 3:
Worksheets("Sheet1").Cells.Clear
Đoạn mã trên sử dụng cách thứ 3 để tham chiếu đến các ô. Theo đó, tất cả các ô đều được tham
chiếu và sẽ đều được xử lý giống nhau.
Ngoài ra, người lập trình còn có thể tham chiếu đến từng ô trong tập đối tượng Cells bằng cách
thực hiện câu lệnh lặp For Each… Next. Ví dụ sau sẽ thực hiện tính tổng tất cả các ô nằm trong
vùng dữ liệu được tham chiếu:
Sub VD_Cells()
Dim myCell As Range
Dim Tong As Double
Tong = 0
For Each myCell In Worksheets("Sheet1").Range("A2.C4").Cells
Tong = Tong + myCell.Value ‘ÅTính tổng
Next myCell
MsgBox Tong ‘Å Hiển thị kết quả
End Sub
6. Sự kiện của các đối tượng trong Excel
Khi người dùng thực hiện một thao tác nào đó trong chương trình, Excel sẽ làm sinh một sự
kiện tương ứng với các thao tác đó, chẳng hạn như các sự kiện khi mở hoặc lưu workbook. Nhờ
có các sự kiện mà người lập trình có thể viết mã lệnh để thực hiện một số thao tác mỗi khi sự
kiện đó xảy ra (còn gọi là bộ xử lý sự kiện – event handler). Những hộp thông báo như “Would
ện mức ứng dụng): các sự kiện xảy ra bên trong
chương trình Excel. Các sự kiện này bao gồm NewWorkbook (khi một workbook mới
được tạo), WorkbookBeforeClose (trước khi đóng một workbook nào đó), SheetChange
(khi một ô nào đó trong workbook bị thay đổi).
C
C
H
H
Ư
Ư
Ơ
Ơ
N
N
G
G
I
I
V
V
:
:
L
L
Ậ
Ậ
C
C
R
R
O
O
S
S
O
O
F
F
T
T
E
E
X
X
C
C
E
E
L
L
139
worksheet hiện hành.
6.1. Tạo bộ xử lý sự kiện cho một sự kiện
Những người mới lập trình VBA thường không biết nơi nào để tạo bộ xử lý sự kiện, hoặc bộ xử
lý sự kiện được tạo ra nhưng lại không hoạt động được. Nguyên nhân là do chương trình con
chứa các bộ xử lý sự kiện không được đặt đúng vị trí.
Để có thể hoạt động đúng như mong muốn, các bộ xử lý sự kiện của từng đối t
ượng phải được
đặt trong mô-đun mã lệnh tương ứng của đối tượng đó.
Ví dụ sau sẽ minh hoạ cách tạo bộ xử lý sự kiện cho sự kiện
Worksheet_Change của Sheet 1
(là sự kiện phát sinh khi người dùng thay đổi giá trị của một ô nào đó trong Sheet 1).
Tạobộxửlýsựkiện
1. Trong cửa sổ Project của VBAIDE, kích đúp chuột lên đối tượng Sheet1 để hiển thị cửa sổ
mã lệnh cho đối tượng Sheet1.
2. Trong cửa sổ mã lệnh vừa hiển thị, chọn danh sách ở góc trên bên trái và chọn mục
Worksheet Ö chọn danh sách ở góc trên bên phải và chọn mục Change. 140
3. VBAIDE sẽ tự động phát sinh đoạn mã lệnh sau:
Private Sub Worksheet_Change(ByVal Target As Range)
End Sub
Chương trình con dạng thủ tục trên chính là bộ xử lý sự kiện cho sự kiện Change của đối tượng
Sheet1. Người lập trình có thể viết mã lệnh để thực hiện các thao tác cần thiết mỗi khi sự kiện
xảy ra. Đoạn mã sau sẽ hiển thị hộp thoại thông báo địa chỉ của ô đã bị thay đổi nội dung:
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox(“Ô đã bị thay đổi: ” & Target.Address)
Ư
Ơ
Ơ
N
N
G
G
I
I
V
V
:
:
L
L
Ậ
Ậ
P
P
T
T
R
R
Ì
O
F
F
T
T
E
E
X
X
C
C
E
E
L
L
141
NewSheet Một worksheet vừa được tạo trong workbook
Open Mở workbook
SheetActivate Một sheet nào đó được chọn làm sheet hiện hành
SheetBeforeDoubleClick Người dùng kích đúp chuột trên sheet nào đó. Sự kiện này xảy ra ngay
trước khi kích đúp.
SheetBeforeRightClick Ngay trước khi người dùng kích phải chuột trên sheet
SheetCalculate Khi trên workshet có thực hiện tính toán nào đó
SheetChange Khi worksheet bị thay đổi
hoạt động của workbook đã được cài đặt hay chưa…
Khuôn mẫu của bộ xử lý sự kiện Open như sau:
Private Sub Workbook_Open()
‘Mã lệnh sẽ được đặt ở đây
End Sub
Dưới đây là một ví dụ đơn giản của thủ tục Workbook_Open. Chương trình có sử dụng hàm
Weekday của VBA để xác định một ngày trong tuần. Nếu đó là ngày thứ 6, một hộp thông báo
sẽ xuất hiện, nhắc nhở người dùng thực hiện sao lưu workbook hàng tuần. Nếu không phải là
thứ 6, thì sẽ không có gì xảy ra cả.
Private Sub Workbook_Open()
Dim strThongBao As String
If Weekday(Now) = vbFriday Then
strThongBao = "Hôm nay là thứ Sáu. ”
strThongBao = strThongBao & "Nhớ phải sao lưu workbook hàng tuần!
"
MsgBox strThongBao, vbInformation
End If
End Sub 142
SựkiệnBeforeClose
Sự kiện BeforeClose xảy ra trước khi một workbook chuẩn bị đóng. Sự kiện này thường được
dùng kết hợp với sự kiện Open. Lấy ví dụ như, có thể sử dụng sự kiện Open để tạo trình đơn
tuỳ biến cho workbook, sau đó sử dụng sự kiện BeforeClose để xoá trình đơn đó trước khi
workbook được đóng. Và như vậy, theo cách này, workbook luôn có một trình đơ
n tuỳ biến mà
không làm ảnh hưởng đến chương trình Excel nói chung.
Khuôn mẫu của bộ xử lý sự kiện BeforeClose như sau:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
workbook thành TRUE, điều này sẽ làm cho Excel nghĩ là workbook đã được lưu, nhưng thực
chất là không thực hiện thao tác lưu workbook. Khi người dùng chọn Cancel thì tham số
Cancel sẽ được gán bằng TRUE, khi đó Excel sẽ không đóng workbook lại.
6.3. Sự kiện trong Worksheet
Sự kiện ở mức worksheet xảy ra bên trong một worksheet nào đó. Việc xử lý tốt các sự kiện ở
mức worksheet sẽ giúp ứng dụng mở rộng hoạt động hiệu quả và chuyên nghiệp hơn. Dưới đây
là một số sự kiện trong worksheet:
Sự kiện Thao tác làm phát sinh sự kiện