2010-04-15 2 views
2

Я пытаюсь запустить определенный макрос за очень короткие промежутки времени, например каждую секунду, с определенного момента времени до определенного конечного момента времени. Это означает, что мне нужна начальная точка и точка отсечки. Я не могу использовать Workbook_Open() Event, так как у меня уже есть другие макросы, запускаемые в разное время после открытия рабочей книги.Excel VBA: Application.OnTime не выполняется должным образом

Основная линия Я использую для запуска макроса один раз в секунду это psuedocode:

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

Из моих экспериментов до сих пор, любая попытка, которую я сделал в конечном итоге с двумя результатами. В первом случае он запускался с момента, когда я открыл книгу и с соответствующим расписанием раз в секунду. Однако первый случай был субоптимальным, так как мне нужно было немного подождать, прежде чем он запустится. Во втором случае он работал в то время, когда я хотел, чтобы он начинался - но он работал только один раз, что тоже не то, что я хотел.

Резюмируя:

мне нужно что-то вроде строки кода для запуска 15 минут после того, как Workbook открывается и остановка на 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

Большое спасибо К. Робинсон, это отличное решение, которое я реализую после выходных, но, похоже, имеет большой смысл. Должен сказать, я полностью забыл об использовании рутины, которая называет себя. Прошло некоторое время с тех пор, как я последний раз разбирался с кодом. Еще раз спасибо. Мне нравится этот сайт! – Yaron

Смежные вопросы