Tôi đã dành rất nhiều thời gian để nghiên cứu vấn đề này và tìm hiểu cách hoạt động của tất cả, sau khi thực sự làm rối tung các trình kích hoạt sự kiện. Vì có quá nhiều thông tin rải rác, tôi quyết định chia sẻ những gì tôi đã tìm thấy để làm việc tất cả ở một nơi, từng bước như sau:
1) Mở VBA Editor, trong Dự án VBA (YourWorkBookName.xlsm) mở Đối tượng Microsoft Excel và chọn Trang tính mà sự kiện thay đổi sẽ liên quan.
2) Chế độ xem mã mặc định là "Chung". Từ danh sách thả xuống ở giữa trên cùng, hãy chọn "Trang tính".
3) Private Sub Worksheet_SelectionChange đã có sẵn như bình thường, hãy để nó yên. Sao chép / Dán mã của Mike Rosenblum từ bên trên và thay đổi tham chiếu .Range thành ô mà bạn đang xem để thay đổi (trong trường hợp của tôi là B3). Tuy nhiên, chưa đặt Macro của bạn (tôi đã xóa từ "Macro" sau "Sau đó"):
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
End Sub
hoặc từ danh sách thả xuống ở trên cùng bên trái, chọn "Thay đổi" và trong khoảng trống giữa Sub riêng và Sub kết thúc, hãy dán If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
4) Trên dòng sau "Sau đó", hãy tắt các sự kiện để khi bạn gọi macro của mình, nó sẽ không kích hoạt các sự kiện và cố gắng chạy lại Worksheet_Change này trong một chu kỳ không bao giờ kết thúc làm hỏng Excel và / hoặc làm mọi thứ rối tung lên:
Application.EnableEvents = False
5) Gọi macro của bạn
Call YourMacroName
6) Bật lại sự kiện để kích hoạt thay đổi tiếp theo (và bất kỳ / tất cả các sự kiện khác):
Application.EnableEvents = True
7) Kết thúc khối If và khối Sub:
End If
End Sub
Toàn bộ mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("B3")) Is Nothing Then
Application.EnableEvents = False
Call UpdateAndViewOnly
Application.EnableEvents = True
End If
End Sub
Điều này giúp bật / tắt các sự kiện khỏi Mô-đun tạo ra sự cố và chỉ cần cho phép trình kích hoạt thay đổi, tắt các sự kiện, chạy macro của bạn và bật lại các sự kiện.