Làm thế nào để thực hiện một số mã VBA định kỳ, hoàn toàn tự động?Cách tạo macro thực thi định kỳ trong Excel?
Trả lời
Bạn có thể sử dụng Application.OnTime để sắp xếp một vĩ mô được thực hiện theo định kỳ. Ví dụ: tạo một mô-đun với mã bên dưới. Gọi "Bật" để bắt đầu hẹn giờ đang chạy.
Điều quan trọng là để ngăn chặn các bộ đếm thời gian chạy khi bạn đóng bảng tính của bạn: để làm như vậy xử lý Workbook_BeforeClose và gọi là "Disable"
Option Explicit
Private m_dtNextTime As Date
Private m_dtInterval As Date
Public Sub Enable(Interval As Date)
Disable
m_dtInterval = Interval
StartTimer
End Sub
Private Sub StartTimer()
m_dtNextTime = Now + m_dtInterval
Application.OnTime m_dtNextTime, "MacroName"
End Sub
Public Sub MacroName()
On Error GoTo ErrHandler:
' ... do your stuff here
' Start timer again
StartTimer
Exit Sub
ErrHandler:
' Handle errors, restart timer if desired
End Sub
Public Sub Disable()
On Error Resume Next ' Ignore errors
Dim dtZero As Date
If m_dtNextTime <> dtZero Then
' Stop timer if it is running
Application.OnTime m_dtNextTime, "MacroName", , False
m_dtNextTime = dtZero
End If
m_dtInterval = dtZero
End Sub
Hoặc bạn có thể sử dụng API Win32 SetTimer/KillTimer chức năng trong một cách tương tự .
Có một phương pháp ứng dụng có thể được sử dụng cho các sự kiện thời gian. Nếu bạn muốn điều này xảy ra định kỳ, bạn sẽ phải 'tải lại' bộ đếm thời gian sau mỗi lần thực hiện, nhưng điều đó khá đơn giản.
Sub MyTimer()
Application.Wait Now + TimeValue("00:00:05")
MsgBox ("5 seconds")
End Sub
-Adam
Bạn có thể xem Windows Task Scheduler và VBScript.
Tôi làm điều này mọi lúc, tôi sử dụng phương pháp "OnTime" như được hiển thị ở trên nhưng nó hiển thị máy bạn đang chạy mã trên vô ích cho những thứ khác, vì Excel đang chạy 100% thời gian. Thay vào đó, tôi sử dụng một workbook đã được sửa đổi và tôi thực thi với các cửa sổ Task Scheduler và trong chức năng workbook_open thisworkbook gọi macro từ sổ làm việc cá nhân của bạn, hoặc mở và chạy một workbook khác với mã trong đó. Sau khi mã đã chạy, bạn có thể gọi hàm application.quit từ sổ làm việc ẩn và đóng ecxel cho lần chạy tiếp theo. Tôi sử dụng nó cho tất cả các chức năng báo cáo không giám sát của tôi trong 15 phút và hàng ngày.
Tôi phải nói điều này không còn đúng nữa. Tôi đang chạy một Sub định kỳ ngay bây giờ (một lần mỗi giây) và excel không hog CPU ở tất cả. – rix0rrr
... để tự động hoàn toàn câu trả lời chính xác này, hãy thêm Gọi MacroName() vào sự kiện Workbook_Open(). Bằng cách này, bất cứ khi nào bạn mở xls/xlsm, MacroName bắt đầu các đặc điểm của nó mà không cần bất kỳ sự can thiệp của người dùng nào. – jpinto3912
Hmm, tôi tự hỏi, khi nào 'm_dtInterval' được gán (cho cái gì khác hơn dtZero)? – gregseth
Tại sao việc dừng hẹn giờ khi sổ làm việc bị đóng lại quan trọng? Điều gì sẽ xảy ra nếu bạn không làm điều đó? –