Запуск макроса excel по расписанию

Запуск макроса по времени

Весьма частый случай на практике: вам нужно запускать один или несколько ваших макросов в заданное время или с определенной периодичностью. Например, у вас есть большой и тяжелый отчет, который обновляется полчаса и вы хотели бы запускать обновление за полчаса до вашего прихода на работу утром. Или у вас есть макрос, который должен делать автоматическую рассылку сотрудникам с заданной периодичностью. Или, работая со сводной таблицей, вы хотите, чтобы она обновлялась «на лету» каждые 10 секунд и т.д.

Давайте разберемся с тем, какие в Excel и Windows есть возможности для реализации подобного.

Запуск макроса с заданной частотой

Для этого проще всего использовать встроенный в VBA метод Application.OnTime, который запускает заданный макрос в указанный момент времени. Давайте разберемся с этим на практическом примере.

Откройте редактор Visual Basic одноименной кнопкой на вкладке Разработчик (Developer) или сочетанием клавиш Alt+F11, вставьте новый модуль через меню Insert — Module и скопируйте туда следующий код:

Dim TimeToRun   'глобальная переменная, где хранится следующее время запуска

'это главный макрос
Sub MyMacro()
    Application.Calculate                               'пересчитываем книгу
    Range("A1").Interior.ColorIndex = Int(Rnd() * 56)   'заливаем ячейку А1 случайным цветом :)
    Call NextRun                                        'запускаем макрос NextRun для назначения след.времени запуска
End Sub

'этот макрос назначает время следующего запуска главного макроса
Sub NextRun()
    TimeToRun = Now + TimeValue("00:00:03")     'прибавляем к текущему времени 3 сек
    Application.OnTime TimeToRun, "MyMacro"     'назначаем следующий запуск
End Sub

'макрос для запуска последовательности повторений
Sub Start()
    Call NextRun
End Sub

'макрос для остановки последовательности повторений
Sub Finish()
    Application.OnTime TimeToRun, "MyMacro", , False
End Sub

Давайте разберемся что здесь что.

Для начала, нам нужна переменная, где будет храниться время следующего запуска нашего макроса — я назвал её TimeToRun. Обратите внимание, что содержимое этой переменной должно быть доступно всем нашим последующим макросам, поэтому её надо сделать глобальной, т.е. объявить в самом начале модуля до первого Sub.

Дальше идет наш главный макрос MyMacro, который будет выполнять основную задачу — пересчитывать книгу с помощью метода Application.Calculate. Чтобы было нагляднее, я добавил на лист в ячейку А1 формулу =ТДАТА(), которая выводит дату и время — при пересчете её содержимое будет обновляться прямо у нас на глазах (только включите отображение секунд в формате ячейки). Для дополнительного веселья я добавил в макрос еще и команду заливки ячейки А1 случайно выбранным цветом (код цвета — это целое числов в диапазоне 0..56, которое генерит функция Rnd и округляет до целого числа функция Int).

Заготовка

Макрос NextRun добавляет к предыдущему значению TimeToRun еще 3 секунды и затем назначает следующий запуск главного макроса MyMacro на это новое время. Само-собой, на практике можно использовать любые другие нужные вам временные интервалы, задавая аргументы функции TimeValue в формате «чч:мм:сс».

Ну и, наконец, просто для удобства добавлены еще макросы запуска последовательности Start и её завершения Finish. В последнем из них для прерывания последовательности используется четвёртый аргумент метода OnTime равный False.

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

Запуск макроса через 3 сек

Остановить последовательность можно, запустив, соответственно макрос Finish. Для удобства можно обоим макросам назначить сочетания клавиш, используя команду Макросы — Параметры на вкладке Разработчик (Developer — Macros — Options).

Запуск макроса по расписанию

Само-собой, всё описанное выше возможно только в том случае, если у вас запущен Microsoft Excel и в нём открыт наш файл. Теперь давайте рассмотрим более сложный случай: нужно по заданному расписанию, например, каждый день в 5:00 запускать Excel, открывать в нем большой и сложный отчет и обновлять в нем все связи и запросы, чтобы к нашему приходу на работу он был уже готов :)

В такой ситуации лучше воспользоваться Планировщиком Windows — специально встроенной в любую версию Windows программой, которая умеет по расписанию выполнять заданные действия. По факту, вы уже используете его, сами того не зная, ведь ваш ПК регулярно проверяет обновления, качает новые антивирусные базы, синхронизирует облачные папки и т.д. — это всё работа Планировщика. Так что наша задача сводится к тому, чтобы добавить к уже имеющимся задачам ещё одну, которая будет запускать Excel и открывать в нём заданный файл. А мы с вами повесим наш макрос на событие Workbook_Open этого файла — и задача решена.

Хочу сразу предупредить, что для работы с Планировщиком, возможно, потребуются расширенные пользовательские права, поэтому, если вы не можете найти описанных ниже команд и функций у себя на рабочем компьютере в офисе — обратитесь за помощью к вашим IT-специалистам.

Запускаем Планировщик

Итак, давайте запустим Планировщик. Для этого можно либо:

  • Щелкнуть правой кнопкой мыши по кнопке Пуск и выбрать Управление компьютером (Computer management)
  • Выбрать в Панели управления: Администрирование — Планировщик заданий (Control Panel — Administrative Tools — Task Scheduler)
  • Выбрать в главном меню Пуск — Стандартные — Служебные — Планировщик заданий
  • Нажать сочетание клавиш Win+R, ввести taskschd.msc и нажать Enter

На экране должно появиться примерно такое окно (у меня англоязычная версия, но у вас может быть и русскоязычная):

Планировщик заданий

Создаем задачу

Чтобы создать новую задачу с помощью простого пошагового мастера нажмем на ссылку Создать простую задачу (Create Basic Task) в правой панели.

На первом шаге мастера нужно ввести название и описание создаваемой задачи:

Создаем задание

Жмем на кнопку Далее (Next) и на следующем шаге выбираем триггер — частоту запуска или событие, которое будет запускать нашу задачу (например, включение компьютера):

Выбираем триггер

Если вы выбрали Ежедневно (Daily), то на следующем шаге нужно будет выбрать конкретное время, дату начала последовательности и шаг (каждый 2-й день, 5-й день и т.д.):

Выбираем время

Следующий шаг — выбираем действие — Запуск программы (Start a program):

Выбираем действие - старт программы

И, наконец, самое интересное — что именно нужно открывать:

Выбираем программу и файл

В поле Программа или сценарий (Program/script) нужно ввести путь к Microsoft Excel как к программе, т.е. непосредственно к исполняемому файлу Excel. На разных компьютерах с разными версиями Windows и Office этот файл может лежать в разных папках, поэтому вот вам несколько способов, как можно узнать его местоположение:

  • Щелкнуть правой кнопкой мыши по иконке (ярлычку) запуска Excel на рабочем столе или в панели задач и выбрать команду Свойства (Properties), а затем в открывшемся окне скопировать путь из строки Target:

    Где лежит excel.exe                      Путь к файлу EXCEL.EXE

  • Открыть любую книгу Excel, затем открыть Диспетчер задач (Task Manager) нажатием Ctrl+Alt+Del и, щелкнув правой кнопкой мыши по строке Microsoft Excel, выбрать команду Свойства (Properties). В открывшемся окне можно скопировать путь, не забыв потом дописать к нему обратный слэш и EXCEL.EXE в конце:

    Excel в Диспетчере задач Windows              Свойства процесса Excel.exe

  • Открыть Excel, открыть редактор Visual Basic сочетанием клавиш Alt+F11, открыть панель Immediate сочетанием Ctrl+G, ввести в неё команду:
    ? Application.Path
    … и нажать на Enter

    Путь к Excel через VBA
    Cкопировать получившийся путь, не забыв потом дописать к нему обратный слэш и EXCEL.EXE в конце.

В поле Добавить аргументы (необязательно) (Add arguments (optional)) нужно вставить полный путь к книге с макросом, которую мы хотим открыть.

Когда всё ввели, то жмем Далее и затем Готово (Finish). Задача должна добавиться в общий список:

Управление созданной задачей

Управление созданной задачей удобно осуществлять с помощью кнопок справа. Здесь можно протестировать задачу, запустив её немедленно (Run), не дожидаясь наступления заданного срока. Можно временно деактивировать задачу (Disable), чтобы она перестала выполняться на время, например, вашего отпуска. Ну, и изменить параметры (даты, время, имя файла) тоже всегда можно через кнопку Свойства (Properties).

Добавляем макрос на открытие файла

Теперь осталось повесить в нашей книге запуск нужного нам макроса на событие открытия файла. Для этого откроем книгу и перейдем в редактор Visual Basic с помощью сочетания клавиш Alt+F11 или кнопки Visual Basic на вкладке Разработчик (Developer). В открывшемся окне в левом верхнем углу нужно найти наш файл на дереве и двойным щелчком мыши открыть модуль ЭтаКнига (ThisWorkbook).

Если у вас в редакторе Visual Basic не видно этого окна, то его можно открыть через меню View — Project Explorer.

В открывшемся окне модуля добавим обработчик события открытия книги, выбрав его из выпадающих списков в верхней части Workbook и Open, соответственно:

Добавляем обработчик события открытия книги

На экране должна появиться заготовка процедуры Workbook_Open, куда между строчками Private Sub и End Sub и нужно вставить те команды на VBA, которые должны автоматически выполняться при открытии этой книги Excel, когда её по расписанию откроет Планировщик. Вот несколько полезных вариантов для разгона:

  • ThisWorkbook.RefreshAll — обновление всех внешних запросов к данным, запросов Power Query и сводных таблиц. Самый универсальный вариант. Только не забудьте разрешить по умолчанию подключения к внешним данным и обновление связей через Файл — Параметры — Центр управления безопасностью — Параметры центра управления безопасностью — Внешнее содержимое, иначе при открытии книги появится стандартное предупреждение и Excel, ничего не обновляя, будет ждать от вас благословления в виде нажатия на кнопку Включить содержимое (Enable content):

    Предупреждение о подключении к внешним данным

  • ActiveWorkbook.Connections(«Имя_Соединения»).Refresh — обновление данных по соединению Имя_Соединения.
  • Sheets(«Лист5«).PivotTables(«СводнаяТаблица1«).PivotCache.Refresh — обновление отдельно взятой сводной таблицы с именем СводнаяТаблица1 на листе Лист5.
  • Application.Calculate — пересчет всех открытых книг Excel.
  • Application.CalculateFullRebuild — принудительный пересчет всех формул и перестроение всех зависимостей между ячейками во всех открытых книгах (равносильно повторному вводу всех формул).
  • Worksheets(«Отчет»).PrintOut — распечатать лист Отчет.
  • Call MyMacro — запустить макрос с именем MyMacro.
  • ThisWorkbook.Save — сохранить текущую книгу
  • ThisWorkbooks.SaveAs «D:АрхивОтчет » & Replace(Now, «:», «-«) & «.xlsx» — сохранить книгу в папку D:Архив под именем Отчет с добавлением к имени даты и времени.

Если вы хотите, чтобы макрос выполнялся только при открытии файла Планировщиком в 5:00, а не каждый раз при открытии книги пользователем в течение рабочего дня, то имеет смысл добавить проверку на время, например:

If Format(Now, "hh:mm") = "05:00" Then ThisWorkbook.RefreshAll

Вот и всё. Не забудьте сохранить книгу в формате с поддержкой макросов (xlsm или xlsb) и можно смело закрывать Excel и отправляться домой, оставив компьютер включенным. В заданный момент (даже если ПК заблокирован) Планировщик запустит Excel и откроет в нём заданный файл, а наш макрос выполнит запрограммированные действия. А вы будете нежиться в постели, пока ваш тяжелый отчёт автоматически пересчитывается — красота! :)

Ссылки по теме

  • Что такое макросы, как их использовать, куда вставлять код на Visual Basic в Excel
  • Как создать свою надстройку с макросами для Excel
  • Как использовать Личную Книгу Макросов (Personal Macro Workbook) как библиотеку для своих макросов в Excel

Время на прочтение
1 мин

Количество просмотров 1.8K

В этой статье мы продемонстрируем простую альтернативу Application.OnTime для периодического запуска VBA-процедур в MS Excel.

Предположим, что мы связали рабочую книгу MS Excel с каким-то внешним источником данных (напр., листом MS SharePoint или базой данных MS Access) и что данные автоматически обновляются каждые 2 минуты пока рабочая книга открыта, – это можно настроить при помощи Подключений.

Предположим также, что наша рабочая книга обрабатывает импортированные данные и что результат этих вычислений должен быть виден другим рабочим книгам, – для реализации последнего требования мы должны сохранять нашу рабочую книгу.

Программный код 1 демонстрирует, как сохранять рабочую книгу всякий раз после импорта внешних данных на соответствующий лист.

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim xDiAl As Boolean
    xDiAl = Application.DisplayAlerts
    Application.DisplayAlerts = False
    ThisWorkbook.Save
    Application.DisplayAlerts = xDiAl
End Sub

Событие Worksheet_Change запускается каждый раз после импорта внешних данных (даже если не было никаких изменений в данных) и, в свою очередь, может запускать подпроцедуру, как показано в Программном коде 2.

Private Sub Worksheet_Change(ByVal Target As Range)
    Call xSubProc
End Sub

Таким образом, мы можем использовать этот подход в качестве простой альтернативы для Application.OnTime и планировать периодическое выполнение VBA-процедур при помощи интервала обновления, установленного в Свойствах подключения, как показано на Рис. 1.

Рис. 1. Свойства подключения

Рис. 1. Свойства подключения

With Application.OnTime method, you can set Excel to run some VBA at a specific time, or repeatedly at set intervals. In this guide, we’re going to show you how to run macro at a specified time in Excel.

Download Workbook

Application.OnTime

VBA’s Application.OnTime method is the direct answer of the topic. The method allows you to schedule a procedure to be run at a specified time in the future. The time can be either a specific time of day or a specific amount of time will pass.

Syntax

Application.OnTime (EarliestTime, Procedure, LatestTime, Schedule)

The Application.OnTime method has 4 parameters which includes 2 optional inputs:

Name Required/Optional Data type Description
EarliestTime Required Variant The time when you want this procedure to be run.
Procedure Required String The name of the procedure to be run.
LatestTime Optional Variant The latest time at which the procedure can be run. If this argument is omitted, Excel will wait until the procedure can be run.
Schedule Optional Variant

True to schedule a new OnTime procedure.

False to clear a previously set procedure.

The default value is True.

Examples to run macro at a specified time

Schedule a macro to run at 1 pm today

Supply 2 arguments to run the OnTime method in its basic form. To set a macro to run at a specific time, enter the time in TimeValue method as a string.

Application.OnTime TimeValue("13:00:00"), "BestMacroEver"

Schedule a macro to run 5 minutes from now

If would like to run a macro after a specific amount of time has passed, add the amount of time to the Now command, which returns the current time.

Application.OnTime Now + TimeValue("00:05:00"), "BestMacroEver"

Schedule a macro to run after midnight

To schedule a macro at a specific time after midnight, you have to specify the next day’s date. You can use the DateSerial method by adding 1 to the current day to populate next day’s date. The following code triggers the macro BestMacroEver after 5 minutes from midnight.

Application.OnTime DateSerial(Year(Now) + Month(Now), Day(Now) + 1) + TimeValue("00:05:00"), "BestMacroEver"

Running a code at set intervals

You can call OnTime method recursively to run a macro at set intervals. The following code makes subroutine CallMeMaybe call itself with 5-minute intervals, until 5 pm.

Sub CallMeMaybe()
 'Enter you code here
  Application.OnTime Now + TimeValue("00:05:00"), "CallMeMaybe", TimeValue("17:00:00")
End Sub

Cancel the scheduled task

Set the Schedule argument as False to cancel a scheduled task. You can use their names to specify arguments to skip optional argument LatestTime.

Application.OnTime EarliestTime:=TimeValue("13:00:00"), Procedure:="BestMacroEver", Schedule:=False

Часто вы, наверняка, думаете, как было бы удобно запускать макрос в предопределенное время или через указанные интервалы. К счастью, в 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.

Run a macro every 30 seconds, 1 minute, 10 minutes, 1 hour, etc.; this method allows you to run a macro at any set interval.

Sections:

The Code

Stop an Interval Macro

Notes

The Code

Sub macro_timer()

'Tells Excel when to next run the macro.
Application.OnTime Now + TimeValue("00:00:10"), "my_macro"

End Sub
Sub my_macro()

'Macro code that you want to run.
MsgBox "This is my sample macro output."

'Calls the timer macro so it can be run again at the next interval.
Call macro_timer

End Sub

This code requires two separate macros in order to run.

This specific setup gets the interval going. In order to be able to stop the interval when you want, look to the next section below.

Below, I’ll separate the macros and talk about each one.

Macro that sets the interval

Sub macro_timer()

'Tells Excel when to next run the macro.
Application.OnTime Now + TimeValue("00:00:10"), "my_macro"

End Sub

This is the timer macro. It is currently set to run another macro, called my_macro, 10 seconds after this timer macro is run.

my_macro is the name of the macro that you want to run each interval.

TimeValue(«00:00:10») is the part of the code that says how long to wait before running the macro; this is the interval. Currently, this is set to run the macro every 10 seconds. The first set of zeros is for hours, the second for minutes, and the third for seconds.

Interval time examples:

TimeValue(«05:00:00») run every 5 hours.

TimeValue(«00:10:00») run every 10 minutes.

TimeValue(«00:00:30») run every 30 seconds.

TimeValue(«01:30:00») run every 1.5 hours.

Macro that does something

Sub my_macro()

'Macro code that you want to run.
MsgBox "This is my sample macro output."

'Calls the timer macro so it can be run again at the next interval.
Call macro_timer

End Sub

This is the regular macro that has the code that you want executed at every interval.

You only need to make sure that, at the end of this macro, it calls the original timer macro.

Call macro_timer is the line that must be at the end of your macro. macro_timer is simply the name of the first macro in this example and Call is what tells the macro to «call» or run the other macro.

Stop an Interval Macro

The easiest way to stop a macro that runs on an interval is to hit Ctrl + Break on the keyboard.

Here is our tutorial on stopping a macro from running.

You can also use this setup:

96c95df267b24db656932d6dd4e1e0fe.jpg

Full code:

Public interval As Double
Sub macro_timer()

interval = Now + TimeValue("00:00:10")

'Tells Excel when to next run the macro.
Application.OnTime interval, "my_macro"

End Sub
Sub my_macro()

'Macro code that you want to run.
MsgBox "This is my sample macro output."

'Calls the timer macro so it can be run again at the next interval.
Call macro_timer

End Sub
Sub stop_macro()

Application.OnTime earliesttime:=interval, procedure:="my_macro", schedule:=False

End Sub

To stop the macro using this setup, just run the stop_macro.

This setup is almost exactly the same as the first setup above except that you need one line of code above everything else, need to set the interval as a variable, and need a macro to stop the interval.

One extra line at the top

Public interval As Double this makes the variable «interval» a variable that can be accessed across different macros.

Interval variable

interval = Now + TimeValue(«00:00:10») the time value is stored in the interval variable instead of hard-coding it into the Application.OnTime method. This new variable is then used within the Application.OnTime method for the first parameter.

Stop macro

Sub stop_macro()

Application.OnTime Earliesttime:=interval, Procedure:="my_macro", Schedule:=False

End Sub

This macro simply contains another Application.OnTime method and it must have the same parameters as the initial Application.OnTime method, except here, the Schedule parameter must be included and set to false.

In this macro, the parameters are explicitly named, which is why you see Earliesttime:= and Procedure:= and Schedule:= written out, whereas you don’t see that in the initial macro setup in the first section above.

Notes

The macros in the attached workbook are from the last example since that is the most versatile method to use.

Download the sample file to get these examples in Excel.

Similar Content on TeachExcel

Automatically Run a Macro at a Certain Time — i.e. Run a Macro at 4:30PM every day

Macro: Automatically run an Excel macro at a certain time. This allows you to not have to worry a…

Run Macros at Set Intervals in Excel

Tutorial: [files in side column or below here]…

Stop Excel Events from Triggering when Running a Macro

Tutorial: Create a macro that will run without triggering events, such as the Change event, or Activ…

Disable Calculation of Cells when Running a Macro in Excel

Tutorial: How to stop formulas and functions from updating in Excel when running a macro. This can s…

Run a Macro when a User Does Something in the Workbook in Excel

Tutorial:
How to run a macro when a user does something within the Workbook in Excel, such as openi…

Subscribe for Weekly Tutorials

BONUS: subscribe now to download our Top Tutorials Ebook!

Понравилась статья? Поделить с друзьями:
  • Запуск макроса excel безопасность
  • Запуск макроса excel 2010
  • Запуск макрос excel 2010
  • Запуск запроса в excel
  • Запуск активного содержимого отключен excel