VBA DoEvents

Mục lục

VBA DoEvents hàm tạm thời tạm dừng macro đang chạy, tạo cơ hội cho Excel xử lý các lần nhấn phím, nhấp chuột và các thông báo hệ điều hành khác.

Trong các macro hoạt động lâu dài, Excel có thể bị treo và không phản hồi, và macro có thể không ngắt được. Nếu DoEvents được bao gồm trong mã của bạn, người dùng có thể yên tâm rằng macro vẫn đang chạy và vẫn có thể làm gián đoạn việc thực thi nếu cần.

Ví dụ về VBA DoEvents

Hãy xem xét đoạn mã sau:

1234567891011 Kiểm tra phụ công khai ()Dim i As LongĐối với i = 1 đến 20000Phạm vi (“A1”). Giá trị = iTiếp theo tôiKết thúc Sub

Khi thử mã này, bạn sẽ lưu ý rằng không thể tương tác với cửa sổ Excel. Tuy nhiên, vì nó không đòi hỏi cao đối với bộ xử lý, macro vẫn có thể bị gián đoạn bằng cách nhấn ESC hoặc CTRL + BREAK.

Tuy nhiên, nếu nhiều hàm phức tạp và đòi hỏi được thực hiện trong vòng lặp này, Excel sẽ mất nhiều thời gian hơn để đăng ký sự kiện nhấn phím - lên đến vài phút hoặc có thể không, đặc biệt nếu máy tính đang chạy các chương trình khác cùng lúc.

Bây giờ, hãy thêm một dòng với DoEvents bên dưới phần gán Phạm vi:

123 Phạm vi ("A1"). Giá trị = iDoEvents

Nếu bạn chạy lại mã này, bạn sẽ thấy rằng Excel hiện đã phản hồi - nó có thể được lấy nét và đưa lên nền trước. DoEvents được gọi mọi lúc qua vòng lặp, điều này đảm bảo rằng macro luôn mang lại hiệu quả thực thi để Excel có thể xử lý bất kỳ thông báo nào được gửi đến nó. Bởi vì macro này chạy nhanh, có vẻ như nó đang chạy trong nền (mặc dù không phải vậy) - nhiều thao tác hơn bên trong vòng lặp sẽ nhanh chóng làm lộ ra ảo ảnh đó.

DoEvents Nguy hiểm

Tuy nhiên, hãy nhìn lại lần thứ hai. Không chỉ đơn giản là cho phép Excel được tập trung, bạn thực sự có thể nhấp vào xung quanh bên trong các ô và thậm chí chuyển đổi các tab trong khi macro đang chạy (hãy thử nó - bạn sẽ thấy một số hành vi vui nhộn). Điều này cho thấy một trong những mối nguy hiểm của DoEvents - nó có thể là nguyên nhân gây ra những hậu quả không mong muốn nếu macro của bạn không được mã hóa cẩn thận.

Một mối nguy hiểm khác là DoEvents có thể đóng vai trò như một cửa sổ cho các macro khác chạy bên trong. Hãy thử cách này: đặt ActiveX CommandButton trên trang tính, bấm đúp vào nó và thêm mã sau vào sự kiện CommandButton1_Click ():

1234567 Dim c As RangeĐối với mỗi c Trong phạm vi ("B3: E8")c.Value = c.Value + 1Tiếp theo c

Tắt Chế độ thiết kế trong Excel, sau đó chạy macro Kiểm tra () mà bạn đã thêm trước đó. Trong khi macro Kiểm tra đang chạy, bạn có thể nhấp vào CommandButton trên trang tính và macro được liên kết của nó sẽ chạy ngay khi DoEvents cho phép macro Kiểm tra () tạm dừng.

Điều nguy hiểm ở đây là nếu macro CommandButton thay đổi dữ liệu mà macro Test () đang hoạt động hoặc kích hoạt lại macro Test (). Bạn có thể nhận được một số kết quả cực kỳ lộn xộn nếu bạn không cẩn thận.

Cuối cùng, bạn nên biết rằng DoEvents sẽ khiến macro của bạn bị ảnh hưởng hiệu suất khi được gọi. Bên trong một vòng lặp, tác động này sẽ tăng lên nhanh chóng trừ khi bạn giới hạn tần suất DoEvents được gọi. Tham khảo ví dụ Test () của chúng tôi, hãy thử điều này:

1 Nếu tôi Mod 1000 = 0 thì DoEvents

Điều này làm giảm khả năng phản hồi của Excel một cách rõ ràng, nhưng tác động về hiệu suất sẽ giảm đi.

Khi nào sử dụng DoEvents

Bất chấp những nguy hiểm này, DoEvents là một chức năng tiện dụng hỗ trợ kiểm tra và gỡ lỗi. Cân nhắc thêm DoEvents vào các vòng lặp hoạt động lâu dài.

Một lý do khác để bao gồm DoEvents là cho phép phản hồi của người dùng. Ví dụ: macro có thể cập nhật các nhãn của UserForm với các chỉ báo tiến trình. Nếu không có DoEvents, Excel có thể không nhận được thông báo để sơn lại UserForm, khiến người dùng có ấn tượng rằng macro đã ngừng hoạt động - đặc biệt nếu bạn chuyển sang chương trình khác và sau đó cố gắng chuyển trở lại Excel. Tuy nhiên, với DoEvents, UserForm sẽ tiếp tục được sơn lại và các cập nhật về tiến trình của macro sẽ tiếp tục xuất hiện.

Phần lớn, DoEvents không phải là thứ bạn muốn đưa nhiều vào mã của mình và thường có thể bị bỏ qua. Nếu khả năng phản hồi là thứ mà vĩ mô của bạn cần, thì đừng tính đến điều đó!

Bạn sẽ giúp sự phát triển của trang web, chia sẻ trang web với bạn bè

wave wave wave wave wave