Трюк №82. Как запустить макрос в определенное время
Часто вы, наверняка, думаете, как было бы удобно запускать макрос в предопределенное время или через указанные интервалы. К счастью, в Excel предусмотрен метод VBA, который делает это возможным.
При помощи метода Application.OnTime можно запускать макрос автоматически, но сначала необходимо провести небольшую настройку. Предположим, есть макрос, который вы хотите запускать каждый день в 15:00 (3:00 p.m.). Сначала нужно определить, как заставить выполниться метод OnTime. Это можно сделать с помощью события Workbook_0pen в частном модуле для объекта Workbook.
В Windows самый быстрый способ попасть в частный модуль объекта Workbook (ThisWorkbook, Эта Книга) — правой кнопкой мыши щелкнуть значок Excel рядом с меню Файл (File) и в контекстном меню выбрать команду Исходный текст (View Code). (На Macintosh откройте VBE и затем откройте модуль объекта Workbook в окне Project.) Введите код из листинга 7.2.
1 2 3 4 | //Листинг 7.2 Private Sub Workbook Open () Application.OnTime T1meValue("15:00:00"). "MyMacro" End Sub |
Вместо MyMacro следует подставить имя макроса, который вы хотите выполнить. Он должен находиться в стандартном модуле и содержать метод OnTime, как показано в листинге 7.3.
1 2 3 4 5 | //Листинг 7.3 Sub MyMacro () Application.OnTime T1meValue("15:00:00"), "MyMacro" 'ВАШ КОД End Sub |
Процедура MyMacro будет запускаться каждый день в 15:00, пока Excel остается открытым.
Теперь предположим, вы хотите выполнять MyMacro каждые 15 минут после открытия книги. И снова вы будете запускать процедуру во время открытия книги, поэтому правой кнопкой мыши щелкните значок Excel рядом с меню Файл (File), выберите команду Исходный текст (View Code) и введите код из листинга 7.4.
1 2 3 4 5 6 7 8 | //Листинг 7.4 Private Sub Workbook_BeforeClose(Cancel As Boolean) Application.OnTime dTime. "MyMacro". . False End Sub Private Sub Workbook_Open() Application.OnTime Now + TimeValue("00:15:00"), "MyMacro" End Sub |
В любом стандартном модуле (который можно открыть командой Insert → Module) введите код, приведенный в листинге 7.5.
1 2 3 4 5 6 7 8 | //Листинг 7.5 Public dTime As Date Sub МуМасrо() dTime = Now + TimeValue("00:15:00") Application.OnTime dTime, "MyMacro" 'ВАШ КОД End Sub |
Обратите внимание, что.вы передаете значение времени, равное 15 минутам, общей (public) переменной dTime. Это нужно, чтобы вы могли отменить метод OnTime в событии Workbook_BeforeC1ose, присвоив дополнительному аргументу Schedule значение Ложь (False). По умолчанию его значение равно Истина (True), поэтому, изменив значение на Ложь (False), вы приказываете Excel отменить метод OnTime, настроенный на выполнение в указанное время.
Если не передать время в переменную, Excel не будет знать, какой метод OnTime нужно отменить, так как значение Now + TimeValue(«00:15:00») не является статическим, но становится статическим, когда передается в переменную. Если вы не присвоите дополнительному аргументу Schedule значение Ложь (False), рабочая книга будет автоматически открываться каждые 15 минут, после того как вы закроете ее, и выполнять макрос MyMacro.