Найти в Дзене
VBA Excel с нуля

VBA Excel № 100.2 Событие OnTime (часть 2).

Продолжим? Начало в статье № 100.1 Событие OnTime (часть 2). Ниже представлены две процедуры, которые пошагово объясняют методы управления повторяющимися событиями. В данном случае основное внимание уделяется обновлению ячейки A1 каждую секунду с записью в нее текущего времени. Процедуры "ОбновитьВремя" обеспечивают обновление времени в ячейке A1 и автоматически запускают эту операцию повторно через секунду. Для прекращения этого "секундного" цикла используется процедура "СтопЧасы". Важно отметить, что переменная "СледСекунда" является переменной уровня модуля, сохраняющей интервал времени до наступления следующего события. Каждую процедуру я поставил на кнопку (о том, как это делается написано в статье №6). Событие OnTime происходит даже в том случае, если рабочая книга закрывается. Иными словами, если закрыть рабочую книгу без вызова процедуры СтопЧасы, то через секунду она автоматически повторно откроется (при условии, что Excel продолжает выполняться). Чтобы предотвратить такое пов
Скриншот с моего ноутбука.
Скриншот с моего ноутбука.

Продолжим? Начало в статье № 100.1

Событие OnTime (часть 2).

Ниже представлены две процедуры, которые пошагово объясняют методы управления повторяющимися событиями. В данном случае основное внимание уделяется обновлению ячейки A1 каждую секунду с записью в нее текущего времени. Процедуры "ОбновитьВремя" обеспечивают обновление времени в ячейке A1 и автоматически запускают эту операцию повторно через секунду. Для прекращения этого "секундного" цикла используется процедура "СтопЧасы". Важно отметить, что переменная "СледСекунда" является переменной уровня модуля, сохраняющей интервал времени до наступления следующего события. Каждую процедуру я поставил на кнопку (о том, как это делается написано в статье №6).

Процедура написана в обычном модуле. Скриншот с моего ноутбука.
Процедура написана в обычном модуле. Скриншот с моего ноутбука.

Событие OnTime происходит даже в том случае, если рабочая книга закрывается. Иными словами, если закрыть рабочую книгу без вызова процедуры СтопЧасы, то через секунду она автоматически повторно откроется (при условии, что Excel продолжает выполняться). Чтобы предотвратить такое поведение рабочей книги, используется процедура обработки событий Workbook_BeforeClose, включающая следующую инструкцию:

Скриншот с моего ноутбука
Скриншот с моего ноутбука

Это гарантирует корректное завершение цикла перед закрытием рабочей книги и предотвращает автоматическое повторное открытие файла.

Давайте более подробно рассмотрим код:

  1. Dim СледСекунда As Date:

Эта строка объявляет переменную с именем "СледСекунда" типа "Date". В данном случае, эта переменная будет использоваться для хранения времени следующего события.

  1. Sub ОбновитьВремя(): Это начало объявления подпрограммы (процедуры) с именем "ОбновитьВремя".
  2. ThisWorkbook.Sheets(1).Range("A1") = Time: Эта строка кода обновляет значение ячейки A1 текущим временем, полученным из функции Time.
  3. СледСекунда = Now + TimeValue("00:00:01"): Здесь переменной "СледСекунда" присваивается значение, равное текущему моменту времени, увеличенному на 1 секунду.
  4. Application.OnTime СледСекунда, "ОбновитьВремя": Эта строка кода устанавливает событие OnTime, которое запустит процедуру "ОбновитьВремя" через 1 секунду после текущего момента времени. Таким образом, происходит рекурсивное обновление времени каждую секунду.

  1. Sub СтопЧасы(): Это начало объявления подпрограммы (процедуры) с именем "СтопЧасы".
  2. On Error Resume Next: Эта строка кода предназначена для перехода к следующей строке кода в случае возникновения ошибки, чтобы предотвратить возможные проблемы выполнения.
  3. Application.OnTime СледСекунда, "ОбновитьВремя", , False: Эта строка кода отменяет событие OnTime, остановливая тем самым рекурсивное обновление времени. Переменная "СледСекунда" указывает на следующее запланированное событие, и она передается в качестве аргумента для отмены.
Коротко. Когда вызывается подпрограмма "ОбновитьВремя", она обновляет ячейку A1 текущим временем, устанавливает следующее событие через 1 секунду и таким образом создает цикл обновления времени. Подпрограмма "СтопЧасы" служит для остановки этого цикла, отменяя запланированные события.

Скриншот с моего ноутбука
Скриншот с моего ноутбука