2008-10-17 40 views

Trả lời

11

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ự .

+2

... để 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

+1

Hmm, tôi tự hỏi, khi nào 'm_dtInterval' được gán (cho cái gì khác hơn dtZero)? – gregseth

+0

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 đó? –

1

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

0

Bạn có thể xem Windows Task Scheduler và VBScript.

0

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.

+0

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

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