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

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

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

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

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

Другие вопросы по тегам