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
Вы, вероятно, можете придумать лучший дизайн, чем я, на этот раз.