KÍCH HOẠT MACROS VBA KHI MỘT GIÁ TRỊ Ô THAY ĐỔI
Hôm nay, chúng ta sẽ bàn về cách làm thế nào để mã VBA tự động chạy dựa trên một giá trị ô cụ thể bị thay đổi. Excel luôn dõi theo những sự gì xảy ra trong khi người dùng đang làm việc với trang tính. Những sự việc đó được gọi là Event Handlers và chúng ta có thể sử dụng Event Handlers để kích ...
Hôm nay, chúng ta sẽ bàn về cách làm thế nào để mã VBA tự động chạy dựa trên một giá trị ô cụ thể bị thay đổi. Excel luôn dõi theo những sự gì xảy ra trong khi người dùng đang làm việc với trang tính. Những sự việc đó được gọi là Event Handlers và chúng ta có thể sử dụng Event Handlers để kích hoạt macros dựa trên những gì người dùng đang thao tác với trang tính của họ.
Một vài ví dụ về Event Handlers
Event Handlers được chia làm hai nhóm: trong workbook và trong worksheet. Những gì handlers nắm bắt được sẽ thể hiện rõ qua tên gọi của chúng, vì vậy chúng ta sẽ không đi vào chi tiết từng cái.Dưới đây là danh sách các events
Workbook Events
|
Worksheet Events
|
Event Handlers nằm ở đâu?
Event Handlers không được lưu trữ trong module điển hình. Chúng được lưu hoàn toàn trong Workbook hoặc Worksheet. Để đi đến vùng đặt mã (coding area) của workbook hay worksheet, bạn cần nhấn đúp chuột vào ThisWorkbook hoặc tên của sheet (một cách lần lượt) trong VBA Project mà bạn muốn ( trong Project Window của Visual Basic Editor).
Làm thế nào để thêm một Event Handler?
Event Handlers có tên chương trình và các biến cụ thể. Điều quan trọng là không được để có bất kì lỗi đánh máy nào trong tên và các biến mà nó biểu thị. Để đảm bảo rằng tránh được các lỗi đánh máy, nên sử dùng Visual Basic Editor để cài đặt mã Event Handler. Để thực hiện điều này, chọn Worksheet hoặc Workbook từ hộp Object rồi chọn Event Handler bạn muốn sử dụng từ hộp Procedure.
Hãy cùng xem xét ví dụ sau
Hy vọng rằng bạn đã có một chút khái niệm về Event Handlers, bây giờ làm thế nào để sử dụng chúng trong thực tế? Hãy cùng xem một ví dụ đơn giản sau, nó cho phép ta chạy mã VBA bất cứ khi nào mà ô G7 chứa từ “yes”.
Dưới đây là giao diện Excel sẽ hiển thị khi bạn gõ từ “Yes” vào ô trống (ô G7)
Ví dụ khi thực hiện
Bạn có thể thấy rằng, khi ta gõ “Yes, tell me a joke!” thì ngay lập tức một câu chuyện đùa sẽ xuất hiện.
Mã VBA đằng sau trang tính
Để trang tính hoạt động như trên, chúng ta cần phải thêm một Event handler giúp nắm bắt lại bất kì sự thay đổi nào trong ô G7 bằng cách sử dụng Change Event Handler.
Change event có thể bắt được bất cứ sự thay đổi nào trong trang tính của bạn ( ngoại trừ các thay đổi định dạng). Bạn sẽ để ý thấy rằng chương trình con Worksheet_Change có một biến tên là Target. Biến này sẽ là ô được sửa đổi cuối cùng bởi người sử dụng. Nếu bạn thay đổi giá trị trong ô A1, chương trình Worksheet_Change sẽ bắt đầu và chuyển ô A1 vào biến Target.
Với điều này, chúng ta sẽ kiểm tra xem ô được sửa đổi cuối cùng trong trang tính có phải là ô G7 hay không? Có thể làm được điều này bằng cách bắt đầu với IF Statement – nó đóng vai trò như là cánh cửa dẫn tới các phần còn lại của mã. IF Statement sẽ kiểm tra xem liệu ô được sửa lần cuối có phải là ô G7 hay không?
‘Determine if change was made to cell G7 If Not Intersect(Target, Range(“G7”)) Is Nothing Then |
Nếu ô trong biến Target không vượt qua được cánh cửa,thì mã sẽ kết thúc và điều này xảy rất nhanh và người dùng sẽ không biết điều gì vừa xảy ra.
Dưới đây là mã hoàn chỉnh, nó sẽ kiểm tra xem từ “Yes”có trong ô G7 hay không bất cứ lúc nào có sự thay đổi trong Sheet 1.
‘Remove Case Sensitivity Option Compare TextPrivate Sub Worksheet_Change(ByVal Target As Range)’Determine if change was made to cell G7 If Not Intersect(Target, Range(“G7”)) Is Nothing Then’Determine if the work “yes” is contained within cell G7 If InStr(1, Range(“G7”), “Yes”) > 0 Then Range(“G9”).Font.Color = Range(“F5”).Font.Color Else Range(“G9”).Font.Color = Range(“G9”).Interior.Color End If End If End Sub |
Và đây là nơi bạn đặt mã trong VBA Project:
Tại sao những thay đổi của tôi không được ghi lại?
Nhiều người sẽ tắt tính năng theo dõi của Event để tăng tốc mã VBA. Vậy nếu như chúng không hoạt động thì bạn có thể chạy lệnh dưới đây trong Immediate Window ( dùng phím tắt Ctrl+g để hiển thị cửa sổ này) trong Visual Basic Editor.
Nhấn enter sau khi gõ cụm từ dưới đây vào Immediate Window:
Application.EnableEvents = True |