Применение функции Timer в VBA Excel для приостановки выполнения приложений и определения времени работы процедур. Примеры использования.
Timer – это функция без аргументов, которая возвращает количество секунд, прошедших после полночи. Значение типа Single.
На сайте разработчика сказано, что в Windows функция Timer возвращает дробные части секунды. О порядке дробной части там информации нет. Попробуем выяснить это сами, запустив в редакторе VBA Excel подпрограмму со строкой
MsgBox «Timer = « & Timer |
Исходя из результата, отображенного в информационном окне MsgBox, будем считать, что функция Timer возвращает сотые доли секунды. Во время экспериментов с процедурой Vremya из Примера 2 результат вычисления разницы между двумя значениями функции Timer достигал шести знаков после запятой, и один раз – семи.
Примеры использования в VBA Excel
Пример 1
Присвоение значения функции Timer переменной:
Пример 2
Код VBA Excel для приостановки приложений:
Dim Start As Single, Pause As Single Start = Timer Pause = 0.5 Do While Timer < Start + Pause DoEvents Loop |
- Start – переменная, в которую записывается первоначальное значение таймера.
- Pause – время в секундах (до сотых значений), на которое следует приостановить программу.
Функция DoEvents во время выполнения цикла передает управление операционной системе для обработки других событий. По рекомендации разработчиков не следует использовать DoEvents в тех случаях, когда
- приостановленная процедура может быть запущена повторно из другой части вашего кода;
- другие приложения могут обратиться к приостановленной процедуре.
Код для приостановки приложений можно использовать как отдельную подпрограмму, вставляя ее имя с указанием интервала в нужные места других процедур:
Sub StopSub(Pause As Single) Dim Start As Single Start = Timer Do While Timer < Start + Pause DoEvents Loop End Sub |
Проверяем работоспособность подпрограммы StopSub:
Sub Vremya() Dim x As Single x = Timer Call StopSub (3) MsgBox Timer — x End Sub |
Точный или почти точный результат будет только при использовании в качестве аргумента целых секунд, в том числе и в примере кода, предложенного разработчиком.
Такой способ приостановки приложений можно использовать в VBA Excel при создании бегущей строки.
Пример 3
Функцию Timer можно использовать для замера времени работы процедуры. Мы ее уже использовали для определения времени выполнения подпрограммы StopSub:
Sub Vremya() Dim x As Single x = Timer Call MySub MsgBox Timer — x End Sub |
Замените MySub на имя вашей подпрограммы и запустите код в редакторе VBA Excel. Информационное окно MsgBox покажет время работы процедуры.
Запуск макроса через определённое время
Таймер. Application.OnTime
Хочу рассказать как можно в Excel использовать таймеры. Как ни странно, но они очень часто применяются, например, при составлении тестов, когда необходимо дать определённое время на выполнение теста. Или необходимость запускать автосохранение книги через каждые 5 минут. А так же во многих других случаях. Делается таймер при помощи команды
Application.OnTime
Запуск макроса через некоторое время
Продемонстрирую на примере простейшего кода:
Sub Procedura_1()
Application.OnTime Now + TimeValue(«00:00:03»), «Proc»
End Sub
Sub Proc()
MsgBox «Время вышло!», vbInformation, «Пример таймера»
End Sub
В этом примере таймер задаётся в процедуре Procedura_1(), а вот процедура Proc() выполняется через заданный промежуток времени. В данном случае тут отсчитывается 3 секунды от текущей даты Now + TimeValue(«00:00:03»).
Оператор Now в данном случае является переменной, которая несёт в себе полную информацию, т.е. число, месяц, год, часы, минуты, секунды. Это хорошо заметно при пошаговом выполнении макроса.
Дальше идёт прибавление некоторого значения к текущему времени Now + TimeValue(«00:00:03»). В данном случае мы к текущей дате прибавили всего 3 секунды.
И после того как мы задали время, через запятую, указываем имя самого макроса, который должен выполниться «Proc».
При этом если Вам не нужны такие большие точности, т.е. год, месяц и т.д., то Вы вполне можете заменить оператор Now на Time, который хранит в себе только время.
Теперь понятно, что макрос «Proc» выполнится через 3 секунды после макроса Procedura_1.
Хочу обратить внимание, что TimeValue(«00:00:03») можно заменить на TimeSerial(0, 0, 3) и предыдущую процедуру можно записать так:
Sub Procedura_2()
Application.OnTime Time + TimeSerial(0, 0, 3), «Proc»
End Sub
Из скриншота видно, что цифры через запятую обозначают часы, минуты и секунды.
Запуск макроса в заданное время
Теперь рассмотрим такой случай когда необходимо, чтобы макрос сработал в заданное время. Например в 18:00. Делается это по аналогии с предыдущей записью, только мы упускаем оператор Now или Time.
Sub Zapusk()
Application.OnTime TimeValue(«18:00:00»), «Proce»
End Sub
Sub Proce()
MsgBox «Время пришло!», vbInformation, «Пример таймера»
End Sub
При такой записи процедура Proce() выполнится в 18:00 вечера.
Отмена таймера
Ну вот. Всё вроде хорошо. Но вдруг мы передумали и нам теперь не надо запускать этот макрос в 18:00 вечера. Отменить данную команду можно при помощи команды Schedule:=False, которая отменяет запуск указанного макроса. Например:
Sub Zapusk()
Application.OnTime TimeValue(«18:00:00»), «Proce»
End Sub
Sub Otmena()
Application.OnTime TimeValue(«18:00:00»), «Proce», Schedule:=False
End Sub
Sub Proce()
MsgBox «Время пришло!», vbInformation, «Пример таймера»
End Sub
В этом случае у нас есть макрос который включает таймер — Zapusk, и макрос который отключает таймер —Otmena.
Если запустить макрос Zapusk, то в 18:00 у нас выполнится макрос Proce. А вот если до 18:00 выполнить макрос Otmena, то макрос Proce не запустится.
Зацикливание таймера
Ну вот мы и подошли к вопросу как сделать автосохранение книги, или внесение каких-то определённых данных через заданный промежуток времени. Сделать это просто.
Sub Procedura_2()
Application.OnTime Time + TimeSerial(0, 0, 5), «Proc»
End Sub
Sub Proc()
MsgBox «Время вышло!», vbInformation, «Пример таймера»
Procedura_2
End Sub
При такой записи сообщение нам будет выводиться каждые 5 секунд, потому что мы зациклили эти два макроса.
А вот для того, чтобы сделать включение и отключение таймера например с двух кнопок, можно воспользоваться глобальной переменной.
Public sostoyanie As Boolean
Sub Procedura_2_Zapusk()
sostoyanie = True
Procedura_2
End Sub
Sub Procedura_2_Otmena()
sostoyanie = False
End Sub
Sub Procedura_2()
Application.OnTime Time + TimeSerial(0, 0, 5), «Proc»
End Sub
Sub Proc()
MsgBox «Время вышло!», vbInformation, «Пример таймера»
If sostoyanie = True Then Procedura_2
End Sub
В этом случае запуск макроса осуществляется процедурой Procedura_2_Zapusk, а его остановка процедуройProcedura_2_Otmena.
Событие возникающее при открытии и закрытии книги
Открытие книги. Workbook_Open
Рассмотрим событие, которое возникает при открытии книги. Я бы сказал, что это очень важное событие при составлении программ. Например, для того чтобы сразу придать нужное оформление нашему документу, или запустить какой-нибудь макрос, который запрашивает логин и пароль.
Делается это следующим образом. Заходим в окно VB, щёлкаем слева по книге «ЭтаКнига». Открывается окно. В левом верхнем окошке выбираем пункт Workbook и правом окошке Open.
После этого появится следующие начало и конец макроса, который и будет срабатывать при открытии книги.
Private Sub Workbook_Open()
End Sub
Если в этот код поместить информационное сообщение, то при открытии книги нам будет появляться сообщение (не забываем, что при отключенных макросах такое сообщение нам не появится).
Private Sub Workbook_Open()
MsgBox «Привет » & Application.UserName, vbInformation, «Приветствие»
End Sub
Закрытие книги. Workbook_BeforeClose
Рассмотрим событие, которое возникает при закрытии книги, если быть точнее, то перед закрытием.
Заходим в окно VB, щёлкаем слева по книге «ЭтаКнига». Открывается окно. В левом верхнем окошке выбираем пункт Workbook и правом окошке BeforeClose.
После этого появится следующие начало и конец макроса, который и будет срабатывать перед закрытием книги.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
End Sub
Если в этот код поместить информационное сообщение, то при попытке закрыть книгу нам будет появляться сообщение.
Private Sub Workbook_BeforeClose(Cancel As Boolean)
MsgBox «Прощай » & Application.UserName, vbInformation, «Прощание»
End Sub
Событие возникающее при сохранении книги
Макрос срабатывающий перед сохранением книги.
Workbook_BeforeSave
Рассмотрим событие, которое возникает при попытке сохранения книги. Это очень удобно, если Вам необходимо выполнить какое-то действие прежде чем книга будет сохранена, например, занести в таблицу данные о компьютере с которого было внесено изменение и сохранение книги.
Делается это следующим образом. Заходим в окно VB, щёлкаем слева по книге «ЭтаКнига». Открывается окно. В левом верхнем окошке выбираем пункт Workbook и правом окошке BeforeSave.
После этого появится следующие начало и конец макроса, который и будет срабатывать при открытии книги.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
End Sub
Если в этот код поместить информационное сообщение, то при сохранении книги нам будет появляться сообщение (не забываем, что при отключенных макросах такое сообщение нам не появится).
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
MsgBox «Вы сохраняете книгу», vbInformation, «Сохранение»
End Sub
Возможно даже сохранить книгу своим способом или отменить её сохранение.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Res = MsgBox(«Вы хотите сохранить эту книгу?», vbQuestion + vbYesNo, «Сохранение»)
If Res = vbNo Then Cancel = True
End Sub
Если пользователь в этом макросе откажется от сохранения, то книга не будет сохраняться, так как происходит отмена сохранения посредством переменной Cancel = True.
Макрос срабатывающий после сохранения книги.
Workbook_AfterSave
Теперь посмотрим на событие, которое возникает после сохранения книги. Заходим в окно VB, щёлкаем слева по книге «ЭтаКнига». Открывается окно. В левом верхнем окошке выбираем пункт Workbook и правом окошке AfterSave.
После этого появится следующие начало и конец макроса, который и будет срабатывать после сохранения книги.
Private Sub Workbook_AfterSave(ByVal Success As Boolean)
End Sub
Если в этот код поместить информационное сообщение, то после сохранения книги нам будет появляться сообщение.
Private Sub Workbook_AfterSave(ByVal Success As Boolean)
MsgBox «Книга успешно сохранена», vbInformation, «Отчёт»
End Sub
А можно сделать и так, что при сохранении нам будет указываться промежуток времени за который произошло сохранение книги.
Public Tm As Date, Res As Double
‘Макрос срабатывающий перед сохранением книги
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Res = MsgBox(«Вы хотите сохранить эту книгу?», vbQuestion + vbYesNo, _
«Сохранение»)
Tm = Time
If Res = vbNo Then Cancel = True
End Sub
‘Макрос срабатывающий после сохранения книги
Private Sub Workbook_AfterSave(ByVal Success As Boolean)
Dim T As Integer
If Res = vbNo Then
Else
T = (Time — Tm) * 24 * 60 * 60 ‘Время в секундах
MsgBox «Книга успешно сохранена за » & T & » секунд!», vbInformation, _
«Отчёт»
End If
End Sub
Событие книги
Правая и левая кнопка мыши
В предыдущих уроках я рассматривал каким образом можно сделать событие создающееся на листе от команды правой кнопки мыши и двойного щелчка левой кнопки мыши.
В событии с книгой всё аналогично, поэтому я не буду много уделять времени. Только хочу уточнить одну деталь. Если в предыдущих уроках мы рассматривали команды которые имеют своё влияние только на лист, то в макросе события книги, он действует на всю книгу и на все листы.
Двойной щелчок левой кнопки мыши
Выбираем ЭтаКнига, в левом окошке выбираем Workbook, в правом окошке выбираемSheetBeforeDoubleClick, как показано на скриншоте ниже.
После этого появится следующие начало и конец макроса, который и будет срабатывать при двойном щелчке мыши по ячейкам любого листа.
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, _
ByVal Target As Range, Cancel As Boolean)
End Sub
Если в этот код поместить информационное сообщение, то при двойном щелчке мыши по ячейке на любом листе книги, нам будет отоброжаться наше информационное сообщение.
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, _
ByVal Target As Range, Cancel As Boolean)
MsgBox «Вы произвели двойное нажатие ЛКМ», vbInformation, «Пример»
End Sub
Для того чтобы не входить в режим редактирования добавляем в коде Cancel = True
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, _
ByVal Target As Range, Cancel As Boolean)
Cancel = True
MsgBox «Вы произвели двойное нажатие ЛКМ», vbInformation, «Пример»
End Sub
Правая кнопка мыши
Теперь посмотрим на событие, которое возникает на всех листах книги, при нажатии на правую кнопку мыши. Заходим в окно VB, щёлкаем слева по книге «ЭтаКнига». Открывается окно. В левом верхнем окошке выбираем пункт Workbook и правом окошке SheetBeforeRightClick.
После этого появится следующие начало и конец макроса, который и будет срабатывать после нажатия на ПКМ.
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, _
ByVal Target As Range, Cancel As Boolean)
End Sub
Если в этот код поместить информационное сообщение, то при нажатии правой кнопки мыши на любом листе книги, нам будет появляться сообщение.
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, _
ByVal Target As Range, Cancel As Boolean)
Cancel = True
MsgBox «Вы произвели нажатие ПКМ», vbInformation, «Пример»
End Sub
Можно сделать и так, чтобы при нажатии на правую кнопку мыши удалялась строка, над которой находится курсор.
Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, _
ByVal Target As Range, Cancel As Boolean)
Cancel = True
ActiveCell.Rows.Delete
MsgBox «Строка удалена!», vbExclamation, «Пример»
End Sub
Как отличить текст от числа?
Целое или дробное? Чётное или нечётное?
Остаток от деления
Текст или число?
При написании программы с возможностью ручного ввода данных , очень часто возникает необходимость отличить какие именно данные введены — текст или число? Предположим вы пишите программу, которая запрашивает от пользователя ввести число от 0 до 50, но пользователь не знает цифр и вместо этого пишет в поле ввода данных — батон. И после таких данных наша программа выдаст окно VB с ошибкой, так как нам надо было число или цифру, а не текст. И для того, чтобы такого не происходило я покажу Вам как отличить что именно ввёл пользователь — число или текст.
Делается это при помощи проверочной команды:
IsNumeric(a)
где a — это проверяемая переменная (текст, цифра, число).
Данная команда может принимать только два значение — False или True (если запись будет выглядеть так: b=IsNumeric(a)).
Напишем простенькую программку, которая будет определять введённые данные.
Sub Text()
Dim a As Variant ‘описываем переменную
a = InputBox(«Введите текст или число.», «Ввод данных»)
If a = «» Then Exit Sub ‘Если данных не введено, то выходим из процедуры
If IsNumeric(a) Then ‘проверяем число или текст
MsgBox «Вы ввели число!», vbInformation, «Число»
Else
MsgBox «Вы ввели текст или смешанные данные!», vbInformation, _
«Смешанные данные»
End If
End Sub
Как видно из программы — a присваивает значение введённых данных.
Далее в условии Если То проверяется число это или текст, и если введённые данные это число, то нам выскакивает сообщение о том, что Вы ввели число. В противном случае нам покажется сообщение о смешанных данных или что это текст.
If a = «» Then Exit Sub — если пользователь не ввёл никаких данных, то просто выходим из процедуры.
Как работают все представленные в уроке программы можно посмотреть на небольшом видеоролике.
Остаток числа (модуль)
Теперь научимся определять остаток числа при делении. Делается это при помощи оператора Mod, другими словами — модуль, но не путайте с математическим понятием модуля. Синтаксис записи его следующий:
c = a Mod b
А вот теперь надо понять что происходит при такой записи. Объясняю логику работы данного модуля:
Первым делом это значение a делится на значение b. Если деление произошло без остатка (например, 4:2 или 9:3), то в результате запишетсяc = 0. В противном случае, если при делении образуется остаток (например, 9:2 — остаток 1, 9:5 — остаток 4), то c будет равно остатку (при этом, если остаток не целый, то он округляется, например 15:6.3=2, остаток 2.4 — округляем в большую сторону получается 3.
Рассмотрим как это будет выглядеть програмно. Напишем простенькую программу, которая нам будет определять округлённый остаток.
Sub modul()
a = InputBox(«Введите первое число A в выражении C = A Mod B.», «Ввод данных»)
b = InputBox(«Введите второе число B в выражении C = A Mod B.», «Ввод данных»)
c = a Mod b
MsgBox a & » Mod » & b & «= » & c, vbInformation, «Модуль»
End Sub
Как отличить целое число от дробного?
Этот вопрос волновал многих людей, которые работаю с большими табличными данными. И очень часто возникал вопрос: Как отличить дробное число от целого?
Теперь Вы это узнаете. Делается это при помощи простого оператора Int или Fix.
Int(a)
Fix(a)
А вот чем они отличаются это мы сейчас и увидим на простом примере.
Sub IntFix()
a = InputBox(«Введите любое дробное число через запятую, например 68,8», _
«Ввод данных»)
b = Int(a)
c = Fix(a)
MsgBox «Int(a) = » & b & Chr(13) & _
«Fix(a) = » & c, vbInformation, «Целое»
End Sub
У нас имеется программа, которая запрашивает любое дробное число, дабы понять в чём суть отделения целой части. А теперь попробуем вводить несколько дробных чисел (положительных и отрицательных) и будем смотреть на результат, который будет выводиться в сообщении.
Ниже представлена таблица, при помощи которой можно легко понять в чём различие этих двух операторов.
Число |
Оператор |
Результат |
23,2 |
Int(a) |
23 |
23,2 |
Fix(a) |
23 |
23,8 |
Int(a) |
23 |
23,8 |
Fix(a) |
23 |
23,5 |
Int(a) |
23 |
23,5 |
Fix(a) |
23 |
-23,2 |
Int(a) |
-24 |
-23,2 |
Fix(a) |
-23 |
-23,8 |
Int(a) |
-24 |
-23,8 |
Fix(a) |
-23 |
-23,5 |
Int(a) |
-24 |
-23,5 |
Fix(a) |
-23 |
Исходя из заданных чисел и полученных результатов видно, что при положительных значениях чисел, операторы Int и Fix округляют число в меньшую сторону, тем самым получается, что просто отделяется целая часть от положительного числа.
А вот с отрицательными числами всё интересней. Оператор Int продолжает округлять число в меньшую сторону, т.е. число, например, -23,2 превращается в -24 (так как в меньшую сторону), т.е. мы уже не можем воспользоваться данным опертором для отделения целой части отрицательных чисел, так как будет выдаваться ложный результат.
А вот оператор Fix уже можно использовать в качестве отделения им целой части отрицательных чисел, так как он округляет в большую сторону (как видно из таблицы), и число -23,2 будет иметь значение -23, что нам и нужно.
Теперь зная как работают операторы Int и Fix мы можем составить полноценную программу по правильному отделению целой части от числа. Выглядеть она будет следующим образом.
Sub celoe()
a = InputBox(«Введите любое дробное число через запятую, например 68,8» & _
» или -56,4.», «Ввод данных»)
c = Fix(a)
MsgBox «Целая часть от числа » & a & » = » & c, vbInformation, «Целая часть»
End Sub
Чётное или нечётное?
Теперь зная всё выше рассказанное, мо можем составить полноценную программу, которая сможет определять чётное число или нечётное. Логика её работы будет такая:
— определяем введённые данные (текст или число);
— если это число, то определяем дробное оно или нет;
— если число не дробное, то делим его на 2, чтобы узнать есть ли остаток при делении;
— если образовался остаток при делении на 2, то относим число к нечётному, в противном случае число является чётным.
А теперь посмотрим на её код:
Sub Chetnoe()
a = Cells(3, 1) ‘берём данные из ячейки А3
If IsNumeric(a) Then
If Int(a) = a And a Mod 2 = 0 Then
MsgBox «Введёное вами число » & a & » — Чётное», vbInformation, «Чётное»
Else
MsgBox «Введёное вами число » & a & » — Нечётное», vbInformation, «Нечётное»
End If
Else
MsgBox «Введены некорректные данные!!!», vbCritical, «Ошибка ввода»
End If
End Sub
В примере можно посмотреть её работу.
Применение функций в Excel
Создание своих собственных функций
Функция (отображение, оператор, преобразование) — математическое понятие, отражающее связь между какими-либо значениями. Можно сказать, что функция — это «закон», по которому одна величина зависит от другой величины.
Это стандартное определение, которое все знают из википедии. И в принципе уже всё понятно. Однако, хочу заметить, что в Excel, функция может быть и не математической. А, например, логической, финансовой или текстовой.
Большинство результатов можно добиться при пощи тех функций, которые имеютя в Excel. В этом занятии я покажу как можно создать свои собственные функции, если вам недостаточно базовых, которые заложены в Excel. Весь список функций, можно найти нажав вот на такую пиктограмму в строке формул
или на ленте выбрать вкладку Формулы и сразу откроется весь список имеющихся функций
Создание собственной функции
Если же из указанного списка вы не нашли нужную функцию, то вам нажна UDF. UDF (User Defined Function) — это функция, которую Вы создаете сами при помощи VBA.
А теперь создадим свою собственную функцию, на основе VBA. Разберём на простом примере, в котором функция должна будет прибавлять НДС к некоторой сумме.
Заходим в окно VB (Alt+F11), нажимаем Insert и добавляем новый модуль Module.
Синтаксис записи функции в VB следующий
Function name [(arglist)] [As type]
[statements]
[name = expression]
[Exit Function]
[statements]
[name = expression]
End Function
Function — объявление функции
name — имя функции (подчиняются тем же правилам, что и имена в процедурах Sub);
[(arglist)] [As type] — аргументы функции и их тип (иногда их не указывают и они принимают значение variant);
[statements] — Любая группа инструкций для выполнения в рамках процедуры Function;
[name = expression] — присвоение функции значение, которое она должна возвращать;
[Exit Function] — В случае, если результат достигнут раньше, то можно выйти из функции, первоначально присвоив name нужное значение;
End Function — конец функции.
Теперь создадим небольшую табличку, в которой мы и будем применять нашу функцию.
В столбик Цена с НДС мы запишем нашу функцию, которую мы создадим.
Теперь в новом созданном модуле запишем следующий код:
Function Cena_S_NDS(Cena_bez_NDS As Long)
Cena_S_NDS = Cena_bez_NDS * 1.18
End Function
Из данной процедуры видно, что имя нашей функции Cena_S_NDS, которая присваивает значение цены без НДС и умножает на 1,18. Вот вообщем, то и вся формула. Теперь нам надо её применить в созданной таблице. Для этого ставим курсор в столбец Цена с НДС и нажимаем на строке формул на функцию.
После этого появится окно со всеми функциями, которые имеются в данном документе. Мы выбираем из выпадающего списка пункт «Определённые пользователем».
При этом появится функция, которую мы создали.
Выбираем созданную функцию и нажимаем ОК. Теперь нам появилось новое окно, в котором необходимо указать переменную, которую мы объявили. В данном случае — это Цена без НДС.
Ну вот теперь копируем получившуюся формулу в каждую ячейку таблицы, где необходимо посчитать НДС и дело сделано.
Цифры прописью
Теперь рассмотрим другой пример. Создадим функцию, которая будет определять цифры от 1 до 10 и записывать их прописью.
Для этого в модуле запишем следующий код:
Function Cifra(C As Variant)
Select Case C
Case 1
Cifra = «Один»
Case 2
Cifra = «Два»
Case 3
Cifra = «Три»
Case 4
Cifra = «Четыре»
Case 5
Cifra = «Пять»
Case 6
Cifra = «Шесть»
Case 7
Cifra = «Семь»
Case 8
Cifra = «Восемь»
Case 9
Cifra = «Девять»
Case 10
Cifra = «Десять»
Case Else
Cifra = «Введены некорректные данные»
End Select
End Function
В связи с тем, что пользователь может записать вместо цифры буквы, то описываем переменную Сзначением Variant. Теперь остаётся только в ячейку В2 записать нашу функцию и всё будет готово.
- Календарь (дата, время)
В Excel есть инструментарий для запуска макроса по расписанию, — Application.Ontime
При помощи этого метода можно запускать макрос с заданным интервалом (например, раз в секунду)
Но есть и другой вариант, — использование объекта htmlfile:
(код надо поместить в модуль ЭтаКнига — ThisWorkbook)
Private m_TimerId As Variant Private m_doc As Object Const ATTRNAME = "VBATimerHandler" Private Sub StartTimer() Const Script = "document.documentElement.getAttribute('" & ATTRNAME & "').TimerProc()" EndTimer Set m_doc = CreateObject("htmlfile") m_doc.DocumentElement.setAttribute ATTRNAME, Me m_TimerId = m_doc.parentWindow.setInterval(Script, 50) ' интервал 50 миллисекунд End Sub Private Sub EndTimer() If m_doc Is Nothing Then Exit Sub If Not IsEmpty(m_TimerId) Then m_doc.parentWindow.clearInterval m_TimerId m_TimerId = Empty End If m_doc.DocumentElement.removeAttribute ATTRNAME Set m_doc = Nothing End Sub Public Sub TimerProc() ' этот макрос будет запускаться 20 раз в секунду Debug.Print Now() End Sub
Источник: http://www.ka-net.org/office/of12.html
- 17077 просмотров
Не получается применить макрос? Не удаётся изменить код под свои нужды?
Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.
Не помню кто из великих сказал… И не помню что. Но в процессе разработки vba-приложений время от времени возникает необходимость использовать таймер. «Из коробки» решения, к сожалению, нет.
Application.OnTime?
Данный метод отложенных вызовов сам по себe решает проблему, но лишь один раз. В том смысле, что таймер срабатывает лишь единожды — указать переодичность вызовов, увы, нельзя.
Application.OnTime + рекурсия?
Очевидно, что в конце необходимой процедуры можно вызывать её же с помощью данного метода, но не менее очевидны и недостатки этого решения — отсутствие достаточного контроля и неудобство вызова:
- не таймер вызывает действие;
- чтобы остановить цикл придётся объявлять глобальную переменную;
- добавление «костыля» в тело отдельно взятой процедуры. Если в следующий раз будет нужно вызвать по таймеру другую — то и в неё придётся переносить данный «костыль».
Evaluate в помощь?
Написать свой класс и вызывать внутри необходимую процедуру с помощью Application.Evaluate. Особо упорные в стремлении создать приемлемый метод вызова таймера доходят до этого решения и упираются в стран/ш/ный баг, отловить который достаточно сложно: udf-функция переданная в переменной будет вызываться каждый раз
по два(!) раза.
Потому что гладилус
Способ обойти этот баг пока найден лишь один:
ActiveSheet.Evaluate "0+" & nameOfProcedure
Решение
Для простоты вызова написан не класс, а метод. Достаточно указать интервал, имя вызываемой процедуры и, опционально, кол-во необходимых вызовов:
StartTimer 60, "CalculateTotal()", 30 'вызов CalculateTotal() каждую минуту в течении получаса.
StopTimer 'остановка таймера
модуль
Option Explicit
Private Type Timer
interval As Long
procedure As String
times As Long
enabled As Boolean
initialized As Boolean
ticks As Long
End Type
Private Timer As Timer
Public Sub StartTimer(ByRef interval As Long, _
ByRef procedure As String, _
Optional ByRef times As Long)
With Timer
.interval = interval
.procedure = procedure
.times = times
.enabled = True
.initialized = False
.ticks = 0
End With
InvokeTimer
End Sub
Public Sub StopTimer()
Timer.enabled = False
End Sub
Private Function InvokeTimer()
If Timer.ticks > Timer.times And Not Timer.times = 0 Then StopTimer
If Not Timer.enabled Then Exit Function
If Timer.initialized Then
ActiveSheet.Evaluate "0+" & Timer.procedure
Else
Timer.initialized = True
End If
Timer.ticks = Timer.ticks + 1
Application.OnTime Now + 1 / 86400 * Timer.interval, "InvokeTimer"
End Function
Запуск макроса по времени
Весьма частый случай на практике: вам нужно запускать один или несколько ваших макросов в заданное время или с определенной периодичностью. Например, у вас есть большой и тяжелый отчет, который обновляется полчаса и вы хотели бы запускать обновление за полчаса до вашего прихода на работу утром. Или у вас есть макрос, который должен делать автоматическую рассылку сотрудникам с заданной периодичностью. Или, работая со сводной таблицей, вы хотите, чтобы она обновлялась «на лету» каждые 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, то вся эта карусель завертится, и мы увидим на листе вот такую картину:
Остановить последовательность можно, запустив, соответственно макрос 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, затем открыть Диспетчер задач (Task Manager) нажатием Ctrl+Alt+Del и, щелкнув правой кнопкой мыши по строке Microsoft Excel, выбрать команду Свойства (Properties). В открывшемся окне можно скопировать путь, не забыв потом дописать к нему обратный слэш и EXCEL.EXE в конце:
- Открыть Excel, открыть редактор Visual Basic сочетанием клавиш Alt+F11, открыть панель Immediate сочетанием Ctrl+G, ввести в неё команду:
? Application.Path
… и нажать на Enter
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
Excel VBA TIMER Function
VBA Timer is an inbuilt function that gives us the fractional value of seconds. It is a very useful function used sometimes to pause any set of codes running or resume them based on the time provided by the user. In addition, one may use the Timer function as a statement in VBA with time input.
In simple terms, the TIMER gives the total number of seconds gone from midnight of the current day. Right from line one of the code, we can track the time consumed by our code to complete the process specified in the subprocedure.
Sometimes when you write a code. You want to test the code duration, i.e., the total time your code takes to complete the subprocedure. By testing the actual duration taken by your code, you can make your code efficient and eliminate the time-consuming process by deleting unwanted or long codes from your module.
Table of contents
- Excel VBA TIMER Function
- How to use the TIMER Function in VBA?
- Examples
- Example #1 – Calculate the Total Time Taken by your Code
- Example #2 – Show the Result in the Correct Time Format
- Example #3 – Alternative Code to Timer
- Things to Remember
- Recommended Articles
You are free to use this image on your website, templates, etc, Please provide us with an attribution linkArticle Link to be Hyperlinked
For eg:
Source: VBA Timer (wallstreetmojo.com)
How to use the TIMER Function in VBA?
As we told you, the TIMER function returns the total seconds passed from midnight to the current date. So, when we write this article, the time is 13:50:45 in India.
We have created a Macro name and assigned the value of TIMER in the VBA message boxVBA MsgBox function is an output function which displays the generalized message provided by the developer. This statement has no arguments and the personalized messages in this function are written under the double quotes while for the values the variable reference is provided.read more.
Code:
Sub Timer_Example1() MsgBox Timer End Sub
When we ran this code, we got the result of 50480.08.
The total seconds went past today’s midnight, i.e., from 12:00:00 AM.
So, from midnight to the current time, 14:01:20, a total of 14 hours, 1 minute, and 20 seconds have passed. Therefore, in seconds it is equal to 50480.08, given by our TIMER function.
Examples
You can download this VBA Timer Excel Template here – VBA Timer Excel Template
Example #1 – Calculate the Total Time Taken by your Code
Now, we will perform some simple coding to test the time the VBA takes to execute the procedure. But, first, we have written some code, as shown in the below image.
Code:
Sub Do_Until_Example1() Dim ST As Single ST = Timer Dim x As Long x = 1 Do Until x = 100000 Cells(x, 1).Value = x x = x + 1 Loop MsgBox Timer - ST End Sub
If we run this code now, it will show me the total time the VBA takes to execute.
It says 3.058594. The result given by this function is in seconds, i.e., the total time taken by this code is 3.058 seconds.
For you to use the code, we have written the below code for you.
Code:
Sub Timer_Example1() Dim StartingTime As Single StartingTime = Timer 'Enter your code here 'Enter your code here 'Enter your code here 'Enter your code here MsgBox Timer - StartingTime End Sub
Use the above and type your code after the code StartingTime = Timer, but before the code MsgBox Timer – StartingTime, i.e., in a green area, you need to enter your code.
Explanation: Firstly, the variable StartingTime = Timer means that the time of running the code equals the time elapsed from midnight to code running time.
Timer – StartingTime: After running the code, what is the time elapsed minus time recorded at the beginning of the code through the variable starting time?
It will give the difference between start and end time and return the result.
Example #2 – Show the Result in the Correct Time Format
As we have seen, the result given by the function is in seconds but not in a proper format. However, we can apply a VBA timeThe VBA time function returns the current time. This function has no arguments and returns the current system time. Thus, using this function, we can find the actual time taken by the line of codes to complete the process.read more format to the result using the FORMAT function.
Use the below code to see the result in the correct time format, i.e., “hh: mm: ss” format.
We have used the FORMAT function here. The result is given by (Timer – starting time). First, we divided it by the number 86400 to convert it to seconds as per time format rules. Then, we applied the time format in an hour, minute, and second format.
Now, if we run the code, it will give the result like this.
So, the total time taken by the code is 3 seconds.
The beauty of this code is the moment it crosses 60 seconds, it will show the result in minutes. So, we paused my code running for a minute (using Ctrl + Break) and saw the result.
So, the total time this code takes is 1 minute 2 seconds.
Example #3 – Alternative Code to Timer
There is an alternative to TIMER by using the NOW () function. Below is the alternative code.
Things to Remember
- The TIMER function will rest the value at the end of the day, i.e., at 11:59:59 PM.
- The NOW function returns the current date and current time.
- The TIMER function shows the total seconds gone past from the current date of midnight.
Recommended Articles
This article has been a guide to VBA Timer. Here, we learned how to use the Timer function in Excel VBA, its alternative function, and some simple to advanced examples. Below are some useful Excel articles related to VBA: –
- Excel VBA Progress Bar
- Formula of TIME in Excel
- Add Time in Excel
- Timeline in Excel
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:
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 VBA Schedule Macro to Run at Specific Time
Here you will learn – How to add Excel VBA Timer Event to run macro automatically at certain time & how to create a Excel timer.
There are 2 different possibilities in here. Are you going to run the schedule the macro to run once or repeatedly.
- Scheduled Macro Run(One Time): VBA run macro at specific time or
- Excel VBA Timer Event (Reccursive): Adding repeated tasks to Excel VBA Timer Event. Set of code has to run repeatedly based on time interval.
Function Used: Both this scenarios use the Excel VBA Timer Event – Application.OnTime
Let us see how this can be achieved using examples:
1. How to Run Excel Macro Automatically at Specific time?
To setup a Excel VBA timer event and schedule a macro to run at particular time, follow these steps.
- Press Alt+F11 from Excel to open VB editor.
- Click Menu -> Insert -> Module, to add new module in VBA Project.
- Copy & add the code in this page.
- Keep the cursor inside “Add_Schedule_Event_in_VBA()” procedure.
- Press F5 to activate time event.
Private Sub Excel_VBA_Timer_Event() MsgBox "Automatic Scheduled Event: Good Morning" End Sub Private Sub Schedule_Run_Macro_Specific_Date_Time() 'Application.OnTime Schedule_Time,"Sub Procedure Name" Application.OnTime VBA.Now + TimeValue("00:00:01"), "VBA_Timer_Event" End Sub
This will automatically trigger the code, exactly at the scheduled time.
In 5 seconds, a message box will pop-up with the text you have entered in code. This way you don’t want to keep any remainders for certain tasks.
2. Timer in Excel – How to Run Macro Repeatedly at Certain Time Interval
Adding a vba timer event to a Excel Macro is similar to the scheduling macro.
But just that we need to mention the same procedure name to Application.Ontime function, as in below example.
Private Sub Excel_VBA_Timer_Repeated_Run_Macro() ThisWorkbook.Sheets(1).Cells(1, 1) = VBA.Now Application.OnTime Now + TimeValue("00:00:01"), "VBA_Timer_Repeated_Event" End Sub
Copy paste this code into you module and press F5.
Now, go to the Sheet1 on the workbook and you can see that Cell A1 will have current system time and it will refresh every second.
Restrictions:
This VBA timer event will keep on running the macro at certain time interval repeatedly. So, it will hinder the manual tasks that you are performing in any Excel file.
Before executing a timer event, save all your latest work in all the Excel workbook. Also, keep the interval for more than 5 seconds, while you activate this function for first time or while testing.
Timer in Excel & Scheduled VBA Macro
One could execute a VBA code either by using a User Interface (Clicking a command button) or Event Triggered (When user edit a value in cell) or Time Triggered.
Here are some of the Time triggered application uses.
- Scheduled Mail Service: We can combine the functionality of sending personalized email from Excel with Timer and make the Excel or Outlook VBA send email at specific time to set of email ids.
- Quiz: Excel VBA Timers can be used to organize online quiz application, that will complete within certain Time Period.
- Task Monitor: Employees can be asked to enter the task that they are performing for every scheduled time interval. By this, they can utilize their Work Time more efficiently.
- Schedule Tasks: Though Windows OS has the option to add scheduled tasks. with this Excel VBA timer option, you can build your own customized task scheduler. Using Shell and Application.OnTime function, a list of tasks can be executed from Excel at predefined time.
Also Read: Lock, Logoff, Shutdown system at scheduled Time and Balance Work-Life
Web References for More Info:
- http://msdn.microsoft.com/en-us/library/office/ff196165(v=office.14).aspx
- http://www.ozgrid.com/forum/showthread.php?t=17162