Excel VBA: Application.OnTime не выполняется должным образом - PullRequest
2 голосов
/ 15 апреля 2010

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

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

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

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

Подведем итог:

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

1 Ответ

1 голос
/ 16 апреля 2010

Какие другие синхронизированные макросы запускаются из 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

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

...