Kiện Change

Một phần của tài liệu LẬP TRÌNH TRÊN MICROSOFT EXCEL (Trang 41)

Sự kiện Change xảy ra khi có một ô nào đó trong worksheet bị thay đổi. Sự kiện này sẽ không xảy ra khi quá trình tự động tính toán của Excel làm thay đổi giá trị của ô, hoặc khi chèn một đối tượng vào trong worksheet.

Khuôn mẫu của bộ xử lý sự kiện Change như sau:

Private Sub Worksheet_Change(ByVal Target As Range) ‘Mã lệnh sẽ được đặt ở đây

End Sub

Tham số Giải thích

Target Tham số kiểu Range, là ô/vùng dữ liệu bị thay đổi

Khi thủ tục Worksheet_Change được thực thi (nghĩa là khi sự kiện xảy ra), thủ tục này sẽ nhận được một đối tượng kiểu Range được truyền thông qua tham số Target. Đối tượng này có thể là một ô hoặc một vùng dữ liệu đã bị thay đổi. Ví dụ sau sẽ hiển thị một hộp thông báo thể hiện địa chỉ của ô đã bị thay đổi (địa chỉ của đối tượng Target):

Private Sub Worksheet_Change(ByVal Target As Excel.Range) MsgBox “Vùng dữ liệu “ & Target.Address & “ đã thay đổi.” End Sub

Để có thể hiểu rõ hơn các loại thao tác làm phát sinh sự kiện Change của workshet, nhập đoạn mã trên vào trong mô-đun mã lệnh của worksheet. Sau khi nhập xong đoạn mã lệnh trên, quay trở lại Excel và thực hiện thay đổi worksheet bằng nhiều cách khác nhau. Mỗi khi sự kiện Change xảy ra, một hộp thông báo sẽ được hiện lên thông báo địa chỉ của vùng dữ liệu đã bị tác động. Khi thực hiện theo cách như vậy, ta có thể tình cờ phát hiện ra nhiều điều thú vị về sự kiện này. Một số thao tác làm phát sinh sự kiện, nhưng một số thao tác khác lại không như thế:

Ø

ØThay đổi định dạng của ô không làm phát sinh sự kiện Change như mong đợi, nhưng nếu sử dụng trình đơn Edit Ö Clear Ö Formats thì lại làm phát sinh sự kiện này.

Ø

ØThêm, hiệu chỉnh hoặc xoá chú thích của các ô không làm phát sinh sự kiện Change.

Ø

ØNhấn phím DEL trên bàn phím sẽ làm phát sinh sự kiện Change (mặc dù ô hiện tại đang là một ô trắng).

Ø

ØNhững ô bị thay đổi khi sử dụng các lệnh của Excel có thể có hoặc không làm phát sinh sự kiện này. Ví dụ, chọn trình đơn Data Ö FormData Ö Sort không làm phát sinh sự kiện. Nhưng nếu chọn trình đơn Tools Ö SpellingEdit Ö Replace thì lại làm phát sinh sự kiện này.

Ø

ØNếu trong các chương trình con của VBA có làm thay đổi một ô nào đó thì sẽ làm phát sinh sự kiện Change.

Rõ ràng, sự kiện Change khá phức tạp và có thể có tính chất khác nhau tuỳ theo từng phiên bản của Excel. Tuy nhiên, sự kiện này lại rất hữu ích, đặc biệt là những ứng dụng quan trọng, đòi hỏi cần phải có sự kiểm tra, giám sát đến giá trị của từng ô.

Sự kiện Change phát sinh khi có một ô nào đó bị thay đổi, nhưng thông thường người lập trình chỉ cần quan tâm đến một vùng nào đó trong worksheet mà thôi. Ví dụ sau sẽ thực hiện giám sát một vùng dữ liệu có tên là SoLieu trong worksheet. Nếu người dùng làm thay đổi giá trị bất kỳ ô nào trong vùng này, chương trình sẽ xuất hiện thông báo cho người dùng:

Private Sub Worksheet_Change(ByVal Target As Range) Dim VRange As Range

Set VRange = Range("SoLieu")

If Not Intersect(Target, VRange) Is Nothing Then MsgBox "Ô thay đổi nằm trong vùng dữ liệu: SoLieu." End If

End Sub

Ví dụ trên sử dụng biến kiểu Range có tên là VRange, thể hiện cho vùng dữ liệu cần giám sát sự thay đổi (là vùng dữ liệu có tên là SoLieu). Thủ tục này còn sử dụng hàm Intersect của VBA, là hàm tìm giao của hai vùng dữ liệu, để kiểm tra xem vùng dữ liệu Target (được truyền qua tham số của sự kiện) có nằm trong vùng dữ liệu VRange hay không. Hàm Intersect trả về giá trị Nothing có nghĩa là hai vùng dữ liệu đó không có ô nào chung nhau. Do có sử dụng toán tử Not nên biểu thúc “Not Intersect(Target, VRange) Is Nothing” sẽ trả về giá trị TRUE nếu hai vùng dữ liệu có ít nhất một ô chung nhau. Vì vậy, nếu vùng dữ liệu bị thay đổi có chung ô nào đó với vùng dữ liệu tên là SoLieu thì chương trình sẽ hiển thị hộp thông báo. Các trường hợp khác, thủ tục sẽ tự kết thúc và không có gì xảy ra cả.

6.4. Sự kiện trong UserForm

(Tham khảo đến phần của Anh độ, nếu không có thì lấy bảng các thuộc tính ở dưới) Activate The UserForm is activated.

AddControl A control is added at runtime.

the form.

BeforeDropOrPaste When the user is about to drop or paste data; i.e., when the user has released the mouse button.

Click A mouse click while the pointer is over the form.

DblClick A mouse double-click while the pointer is over the form. Deactivate The UserForm is deactivated.

Error A control detects an error and cannot return the error information to a calling program.

Initialize The UserForm is about to be shown. KeyDown A key is pressed.

KeyPress The user presses any ANSI key. KeyUp A key is released.

Layout A UserForm changes size. MouseDown A mouse button is pressed. MouseMove The mouse is moved. MouseUp A mouse button is released.

QueryClose Occurs before a UserForm closes.

RemoveControl A control is removed from the UserForm at runtime. Resize The UserForm is resized.

Scroll The UserForm is scrolled.

Terminate The UserForm is terminated. Zoom The UserForm is zoomed.

6.5. Sự kiện không gắn với đối tượng

Các sự kiện đã được đề cập đều được gắn với một đối tượng nào đó. Phần này sẽ giới thiệu một sự kiện không gắn với đối tượng nào cả rất hay dùng, đó là sự kiện và “OnKey”. Sự kiện này sẽ được truy cập thông qua đối tượng Application.

Sự kiện OnKey 

Trong khi người dùng đang làm việc trên bảng tính, Excel luôn giám sát những gì người dùng gõ vào từ bàn phím. Vì vậy, người lập trình có thể thiết lập phím tắt (hoặc tổ hợp phím tắt) để khi người dùng nhấn phím tắt thì sẽ tự động thực thi một thủ tục mong muốn.

Để cài đặt cho sự kiện OnKey, sử dụng phương thức OnKey có trong đối tượng Application. Cú pháp của phương thức này như sau:

expression.OnKey Key, Procedure

Tham số Giải thích

expression Biểu thức trả vềđối tượng kiểu Application

Procedure Tham số tuỳ chọn kiểu Variant, là chuỗi ký tự chứa tên của thủ tục sẽđược thực thi khi người dùng nhấn phím. Nếu giá trị của tham số này là “” (chuỗi rỗng) thì sẽ không có gì xảy ra khi người dùng nhấn phím cả. Nếu tham số Procedure được bỏ qua, thì phím tương ứng với tham số Key sẽđược thiết lập lại giá trị mặc định của Excel, tất cả các thủ tục đã được gán cho phím đó sẽ không còn hiệu lực nữa.

Cần lưu ý là, tham số Key có thể là môt phím hoặc một tổ hợp phím kết hợp với các phím ALT, CTRL hoặc SHIFT,… Mỗi phím sẽ được đại diện bằng một ký tự hoặc chuỗi ký tự, chẳng hạn như “a” đại diện cho phím a, hay “{ENTER}” đại diện cho phím ENTER.

Để xác định các phím không hiển thị trên màn hình khi người dùng nhấn phím tương ứng (chẳng hạn như phím TAB hoặc phím ENTER) cần phải sử dụng các giá trị đã được định nghĩa sẵn. Dưới đây là danh sách các mã phím đặc biệt đó. Mỗi mã phím tương ứng với một phím trên bàn phím.

Phím Mã phím

BACKSPACE {BACKSPACE} hoặc {BS} BREAK {BREAK}

CAPS LOCK {CAPSLOCK} CLEAR {CLEAR} CLEAR {CLEAR}

DELETE hoặc DEL {DELETE} hoặc {DEL} MŨI TÊN XUỐNG {DOWN}

END {END} ENTER ~ (dẫu ngã) ENTER ~ (dẫu ngã)

ENTER (phím số) {ENTER}

ESC {ESCAPE} hoặc {ESC} F1 đến F15 {F1} đến {F15}

HELP {HELP}

HOME {HOME}

Phím Mã phím

INS {INSERT} MŨI TÊN TRÁI {LEFT} MŨI TÊN TRÁI {LEFT}

NUM LOCK {NUMLOCK} PAGE DOWN {PGDN} PAGE DOWN {PGDN} PAGE UP {PGUP} RETURN {RETURN} MŨI TÊN PHẢI {RIGHT} SCROLL LOCK {SCROLLLOCK} TAB {TAB} MŨI TÊN LÊN {UP}

SHIFT + (dấu cộng) CTRL ^ (dấu mũ)

ALT % (phần trăm)

Để sử dụng tổ hợp phím, chỉ cần gán tham số Key bằng hợp của tất cả các phím đơn. Ví dụ như nếu cần gán sự kiện cho tổ hợp phím CTRL+Phím cộng, gán tham số Key= “^{+}”; hoặc với tổ hợp phím SHIFT+CTRL+Mũi tên phải, gán tham số Key= “+^{RIGHT}”.

Ví dụ sau sẽ xử lý sự kiện OnKey để cài đặt lại chức năng của phím PgUp và phím PgDn. Sau khi thực thi thủ tục Setup_ConKey, nếu người dùng nhấn phím PgDn, Excel sẽ thực thi thủ tục DgDn_Sub, còn nếu người dùng nhấn phím PgUp, Excel sẽ thực thi thủ tục PgUp_Sub. Và kết quả sẽ là: khi người dùng nhấn phím PgDn sẽ di chuyển con trỏ xuống hai hàng, còn khi nhấn phím PgUp sẽ di chuyển con trỏ lên hai hàng.

Sub Setup_OnKey()

Application.OnKey "{PgDn}", "PgDn_Sub" Application.OnKey "{PgUp}", "PgUp_Sub" End Sub

Sub PgDn_Sub()

On Error Resume Next

ActiveCell.Offset(2, 0).Activate End Sub

Sub PgUp_Sub()

ActiveCell.Offset(-2, 0).Activate End Sub

Ví dụ này có sử dụng câu lệnh On Error Resume Next để bỏ qua các lỗi có thể phát sinh. Chẳng hạn như nếu ô hiện hành đang ở hàng đầu tiên, nếu cố gắng di chuyển lên trên sẽ làm phát sinh lỗi. Hoặc nếu sheet hiện hành không phải là worksheet mà là chartsheet thì cũng làm phát sinh lỗi vì không có ô hiện hành nào trên chartsheet cả.

Để xoá sự kiện OnKey cho một phím nào đấy, cần phải thực thi lại phương thức OnKey mà không có tham số Procedure. Thao tác này sẽ trả về chức năng mặc định cho phím đã được gán:

Sub Cancel_OnKey()

Application.OnKey “{PgDn}” Application.OnKey “{PgUp}” End Sub

Mặc dù bằng cách này, người lập trình có thể gán phím tắt cho một Macro bất kỳ, tuy nhiên tốt nhất là nên sử dụng trình quản lý Macro để gán phím tắt cho Macro (xem thêm mục “Quản lý Macro” trang 13)

Một phần của tài liệu LẬP TRÌNH TRÊN MICROSOFT EXCEL (Trang 41)

Tải bản đầy đủ (PDF)

(77 trang)