25/05/2018, 23:29

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

  • Open
  • SheetChange
  • SheetActivate
  • BeforeClose
  • BeforeSave
  • NewChart
Worksheet Events
  • Change
  • Activate
  • BeforeDelete
  • BeforeDoubleClick
  • BeforeRightClick
  • SelectionChange

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
0