Таймер для excel макрос

Применение функции Timer в VBA Excel для приостановки выполнения приложений и определения времени работы процедур. Примеры использования.

Timer – это функция без аргументов, которая возвращает количество секунд, прошедших после полночи. Значение типа Single.

На сайте разработчика сказано, что в Windows функция Timer возвращает дробные части секунды. О порядке дробной части там информации нет. Попробуем выяснить это сами, запустив в редакторе VBA Excel подпрограмму со строкой

MsgBox «Timer = « & 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 записать нашу функцию и всё будет готово.

Не помню кто из великих сказал… И не помню что. Но в процессе разработки 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

Если вы хотите обрабатывать некоторые данные в течение ограниченного времени, вы можете вставить таймер обратного отсчета в свой рабочий лист данных, и по окончании обратного отсчета времени появится всплывающее диалоговое окно, напоминающее вам. Здесь я расскажу вам код VBA для вставки таймера обратного отсчета в Excel.

Вставить таймер обратного отсчета в Excel


стрелка синий правый пузырь Вставить таймер обратного отсчета в Excel

В Excel нельзя отсчитывать время, но вы можете скопировать следующий код VBA, чтобы помочь отсчитать время.

1. Выберите ячейку и отформатируйте ее как форматирование времени, щелкнув ячейку правой кнопкой мыши и выбрав Формат ячеек, затем в диалоговом окне, нажав Продолжительность и выбор 13: 30: 55 в Тип список, при последнем нажатии OK для выхода из этого диалога. Смотрите скриншот:

2. Введите время, которое вы хотите отсчитать, в ячейку форматирования. Смотрите скриншот:

Док-таймер обратного отсчета-5

3. Нажмите Alt + F11 ключи для открытия Microsoft Visual Basic для приложений окно.

4. Нажмите Вставить > Модули а затем скопируйте следующий VBA в новое окно.

VBA: таймер обратного отсчета.

Dim gCount As Date
'Updateby20140925
Sub Timer()
    gCount = Now + TimeValue("00:00:01")
    Application.OnTime gCount, "ResetTime"
End Sub
Sub ResetTime()
Dim xRng As Range
Set xRng = Application.ActiveSheet.Range("E1")
xRng.Value = xRng.Value - TimeSerial(0, 0, 1)
If xRng.Value <= 0 Then
    MsgBox "Countdown complete."
    Exit Sub
End If
Call Timer
End Sub

Функции: E1 в приведенном выше коде указывает ячейку времени, которую вы вводите на шаге 2.

5. Нажмите Run или нажмите F5 для запуска таймера обратного отсчета. Теперь время отсчитывается.

Док-таймер обратного отсчета-3

6. И когда обратный отсчет закончится, всплывающее диалоговое окно напомнит вам.

Док-таймер обратного отсчета-4

Функции: Вы не можете остановить обратный отсчет, когда он запущен, за исключением закрытия книги.


Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Комментарии (15)


Оценок пока нет. Оцените первым!

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!

Like this post? Please share to your friends:
  • Табличный редактор ms excel построение диаграмм
  • Таймер в ячейке excel
  • Табличный редактор ms excel основные понятия
  • Таймер в excel без макросов
  • Табличный редактор microsoft office excel