Excel VBA: Application.OnTime не выполняется должным образом

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

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

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

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

Обобщить:

Мне нужно что-то вроде строки кода, чтобы начать работать через 15 минут после открытия книги и остановиться через 3 часа.


person Yaron    schedule 15.04.2010    source источник


Ответы (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

Вы, вероятно, можете придумать лучший дизайн, чем я на этом.

person Kimball Robinson    schedule 16.04.2010
comment
Большое спасибо, К. Робинсон, это отличное решение. Я реализую его после выходных, но, похоже, оно имеет большой смысл. Я должен сказать, что совершенно забыл об использовании подпрограммы, которая вызывает сама себя. Прошло некоторое время с тех пор, как я в последний раз имел дело с кодом. Еще раз спасибо. Я люблю этот сайт! - person Yaron; 16.04.2010