2013-04-02 35 views
7

Tôi đang sửa một bảng tính. Lập trình viên đã tạo một macro cho mỗi trang tính để kích hoạt khi trang tính được thay đổi. Điều này là tốt vì nó phối hợp màu các chi tiết trang tính khi thông tin mới được thêm vào để tôi muốn giữ tính năng này.Bỏ qua sự kiện thay đổi bảng tính VBA?

Tôi đã viết macro sắp xếp dữ liệu và cho phép xóa và thêm nhân viên mới, điều này xung đột với macro sự kiện thay đổi và khiến macro của tôi gặp lỗi nếu cả hai đều hoạt động.

Q. Có cách nào để bỏ qua sự kiện thay đổi trang tính trong khi macro đang chạy và sau đó có nó tại chỗ một lần nữa khi macro kết thúc?

Đây là mã cho sự kiện thay đổi.

Private Sub Worksheet_Change(ByVal target As Excel.Range, skip_update As Boolean) 
If skip_update = False Then 
    Call PaintCell(target) 
End If 
End Sub 

Macro của tôi gây ra lỗi khi tôi tham chiếu đến trang tính hoặc phạm vi.

+0

Tôi có hiểu chính xác không, trong khi bạn đang sắp xếp, sự kiện thay đổi được kích hoạt? – pintxo

Trả lời

15

Tôi nghĩ rằng bạn muốn EnableEvents tài sản của đối tượng Application. Khi bạn đặt EnableEvents thành Sai, thì mã của bạn sẽ không kích hoạt bất kỳ sự kiện nào và sẽ không có mã sự kiện nào khác chạy. Ví dụ, nếu mã của bạn thay đổi một ô, nó sẽ kích hoạt sự kiện Change hoặc sự kiện SheetChange. Tuy nhiên, nếu bạn cấu trúc nó như thế này

Application.EnableEvents = False 
    Sheet1.Range("A1").Value = "new" 
Application.EnableEvents = True 

sau đó thay đổi A1 sẽ không kích hoạt bất kỳ sự kiện nào.

Thỉnh thoảng có ích khi phải có mã sự kiện kích hoạt mã và đôi khi không. Sử dụng EnableEvents khi bạn muốn ngăn chặn nó.

0

Quá mạo hiểm theo ý kiến ​​của riêng tôi.

Tôi muốn sử dụng biến có tên "skip_update" được đặt thành "True" ở đầu mỗi macro và thành false khi kết thúc.

ví dụ:

dim skip_update as Boolean = False 

sub auto_macro_when_modify() 
    if skip_update == True then 
     exit sub ' NO CHANGE ! 
    end if 
end sub 

sub other_macro 
    skip_update = True 
    ' (do stuff) 
    skip_update = False 
end sub 
+0

Xin chào, cảm ơn vì đã trả lời, đó là một ý tưởng tuyệt vời. Tôi đã thử implimenting nó nhưng nó doesnt dường như đưa nó vào tài khoản. Tôi sẽ đăng mã để nó rõ ràng hơn, nhưng ngay sau khi tôi đặt sự kiện thay đổi trở lại chương trình, macro của tôi bắt đầu đưa ra lỗi ngay sau khi tôi nhấp vào chạy. Và ngay sau khi tôi xóa sự kiện thay đổi, nó sẽ chạy hoàn hảo trở lại. Nó có vẻ là trong kiểm tra sơ bộ trước khi chương trình thậm chí chạy là khi nó đưa lên lỗi. – user1545643

+0

"skip_update" của bạn phải được xác định "toàn cầu", nằm ngoài bất kỳ tiểu mục nào. Cách bạn đã làm nó, kích hoạt có thể không bị vô hiệu hóa. (Tôi cũng đã chỉnh sửa câu trả lời của mình) – mansuetus

+0

Xin chào, tôi đã định nghĩa nó như bạn đã nói, nhưng nó vẫn là một vấn đề. Tôi nhận được ứng dụng xác định hoặc đối tượng được xác định lỗi trong suốt vĩ mô của tôi bất cứ khi nào vĩ mô khác trong kích hoạt, ngay cả với tuyên bố là trong đó. – user1545643

0

Đây là một sửa đổi quan trọng đối với câu trả lời từ @Dick Kusleika.

Khi tắt cài đặt EnableEvents, bạn nên bao gồm xử lý lỗi để bật lại EnableEvents. Nếu bạn không và kịch bản ném lỗi, trình kích hoạt sự kiện thay đổi (tập lệnh của bạn) sẽ ngừng hoạt động cho đến khi bạn bật lại EnableEvents theo cách thủ công.

Lý tưởng nhất là bạn nên đặt dòng sau ngay trước khi bất kỳ mã nào kích hoạt lại sự kiện thay đổi của bạn. Dòng đầu tiên yêu cầu VBA goto một nhãn gọi là "enableEventsOn" khi nó gặp lỗi. Bỏ qua dòng thứ hai thay đổi các sự kiện.

On Error Goto enableEventsOn: 
Application.EnableEvents = False 

Sau đó, đặt mã này ngay sau mã đã kích hoạt lại sự kiện thay đổi của bạn. Điều này biến sự kiện thay đổi kích hoạt trở lại và trả về xử lý lỗi bình thường cho tập lệnh của bạn.

Application.EnableEvents = True 
On Error Goto 0 

Cuối cùng, đặt mã này vào cuối tập lệnh của bạn. Đó là một nhãn được đề cập ở trên. Nếu có lỗi xảy ra giữa "On Error Goto enableEventsOn:" và "On Error Goto 0" thì kịch bản sẽ xuất hiện ở đây và bật EnableEvents trở lại, để nó sẵn sàng bắt đầu kịch bản vào lần sau bạn thay đổi bảng tính.

enableEventsOn: 
Application.EnableEvents = True 
0

Bạn có thể giữ phím CTRL trong khi thực hiện mục nhập sẽ kích hoạt thay đổi về thường trình sự kiện. Tôi có một thói quen để tổng hợp các giá trị trong một phạm vi được chọn trong một cột nhất định. Nếu tôi kéo con trỏ từ hàng 1 đến 5, tô sáng chúng, thì tổng của chúng được lưu vào khay nhớ tạm. Bất kỳ mục nhập nào trong một ô trong cột này sẽ kích hoạt thường trình. Nếu tôi giữ phím CTRL trong khi thực hiện hành động dự định hoặc bất kỳ mục nhập nào trong một ô trong cột thì thường trình không được khởi tạo. Có thể không hoạt động cho các kịch bản ChangeEvent phức tạp hơn.

+0

Một vài hình ảnh làm nổi bật các bước có thể hữu ích ở đây. –

Các vấn đề liên quan