2010-04-15 305 views
2

我試圖從一個特定的時間點到特定的結束時間點,以非常短的時間間隔(例如每秒)運行某個宏。這意味着我需要一個起點和一個截止點。我不能使用Workbook_Open() Event,因爲在打開工作簿之後,我已經在不同時間觸發了其他宏。Excel VBA:Application.OnTime沒有正確執行

的基本路線,我用它來觸發宏一次,第二次是這樣的僞代碼:

Application.OnTime Now + TimeValue("00:00:01"), "Path to Macro" 

從我的實驗,到目前爲止,任何企圖我做結束了兩個結果。在第一種情況下,它從我打開工作簿的那一刻開始,並按照每秒一次的適當時間表運行。但是,第一個案例並不理想,因爲我需要它在啓動之前稍微等一下。在第二種情況下,它在我想要開始的時候運行 - 但它只運行一次,這也不是我想要發生的事情。

總結:

我需要類似的代碼行打開工作簿後開始運行15分鐘,停3個小時後。

回答

1

其他的定時宏是從workbook_open啓動的,爲什麼這些干擾會影響?這聽起來像是你不必要地限制自己。以下是解決問題的方法:

Workbook_open應該使用application.ontime來調用一個通用函數do_timed_events。 do_timed_events函數應該在每次運行時使用application.ontime重新添加自己。它也應該跟蹤狀態。對於它的前幾次運行,它應該執行其他特定任務,然後等待15米,然後開始執行每秒的任務。

下面是一些僞代碼:

private var do_timed_events_state as string 
sub do_timed_events 
    if do_timed_events_state = "" then 
     do_task_1(arg1,arg2) 
     do_timed_events_state = "task_2" 
     Application.OnTime Now + TimeValue("00:00:01"), "do_timed_events" 
    elseif do_timed_events_state = "task_2" then 
     do_timed_events_state = "repeating_task" 
     Application.OnTime Now + TimeValue("00:00:01"), "do_timed_events" 
    elseif do_timed_events_state = "repeating_task" then 
     Application.OnTime Now + TimeValue("00:00:01"), "do_timed_events" 
    end if 
end sub 

你或許可以拿出一個比我在這一個更好的設計。

+0

非常感謝K. Robinson,這是一個很好的解決方案,我會在週末後實施它,但它似乎很有意義。我必須說我完全忘記了使用自稱的例程。自從我上次處理代碼以來已經有一段時間了。再次感謝你。我喜歡這個網站! – Yaron 2010-04-16 16:39:45