Страницы: 1
RSS
Остановка процедуры с повторением всей процедуры по времени.
 
Добрый вечер Уважаемые Эксперты.

Как более старшие и опытные товарищи помогите пожалуйста советом.

Для работы некоторых макросов, необходимо "Циклическое выполнение всей процедуры".
Я имею ввиду прописанные в теле процедуры примерно такой конструкции:
Код
Application.OnTime Now() + TimeSerial(0, 0, 1), "Sub_Name" ' где Sub_Name - Имя процедуры
Подскажите пожалуйста, какие есть способы остановки макросов, с подобным циклическим обращением ко всей процедуре?. Кроме прерывания.
Точнее даже так, если макрос который содержит подобную конструкцию вывести на кнопку, то чтобы его остановить, можно ли обойтись этой кнопкой.
Вообщем будьте добры для начала ответьте каким образом можно останавливать подобные процедуры.

P.S. Прошу прощения перед Админами и старожилами, за отсутствие файла примера. Файла пример не создал, поскольку нет понимания как его сделать. И заранее прошу прощения за название темы, лучше в голову не пришло. Я постараюсь насколько возможно оставаться в рамках темы.

Прошу помочь разобраться.

Благодарю Вас.
Изменено: IgorBoot - 11.01.2019 20:33:49
 
IgorBoot,  
Есть на мой взгляд два варианта
1. отменить
https://docs.microsoft.com/en-us/office/vba/api/excel.application.ontime
Schedule:=false отменит назначенную задачу, но для этого требуется знать время и процедуру, для этого их надо хранить например в глобальной переменной, а вызов этой команды сделать например по кнопке
2. не назначать
перед Application.OnTime Now() …. сделать проверку флага, который устанавливается по кнопке или …. и в случае его наличия не назначать следующий старт.

Так как у вас запуск каждую секунду, то предпочтительнее вариант 2, но и про 1 не следует забывать. Часто выполнятся ничего не должно после закрытия книги или активации другой. тогда можно или нужно отменять таймер.
По вопросам из тем форума, личку не читаю.
 
Уважаемый БМВ, Благодарю Вас за ответ и за подсказанные направления.

Подскажите, если идти по первому сценарию, т.е.:
Цитата
Schedule:=false отменит назначенную задачу, но для этого требуется знать время и процедуру
Возможно ли ввести в конструкцию текущее время? Я попробовал подобным образом:
Код
A = Now()
Application.OnTime TimeValue(CStr(A)), Procedure:="test_1", Schedule:=False
И у меня не получилось.

В принципе возможно ли конкретно для конструкции OnTime Schedule:=False взять текущее время для остановки?.
Благодарю еще раз.
 
Чуть иначе
Код
Public a As Date
Sub test_1()

'
Application.Calculation = xlCalculationManual

a = Now() + TimeSerial(0, 0, 1)
Application.OnTime a, "test_1"

Cells(8, 7) = Cells(8, 7) + 1

Application.Calculation = xlCalculationAutomatic
End Sub



Sub test_Stop()

Application.OnTime a, "test_1", , False

End Sub
По вопросам из тем форума, личку не читаю.
 
это:
Код
Option Explicit

Dim StartTime#

Sub test_1()
  Dim CTp
  CTp = Application.Calculation:   Application.Calculation = xlCalculationManual
  StartTime = Now() + TimeSerial(0, 0, 1)
  Application.OnTime StartTime, "test_1"
  Cells(8, 7) = Cells(8, 7) + 1
  Application.Calculation = CTp
End Sub

Sub Test_Stop()
  Application.OnTime StartTime, "test_1", , False
End Sub
в программный модуль
это:
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  If StartTime <> 0 Then Test_Stop
End Sub
в модуль книги
Останавливать процедуру постоянно запускаемую по OnTime следует при закрытии книги, чтобы после того, как книга закрылась, excel не упал на ошибку при попытке очередного запуска, который был намечен, когда книга была еще открыта
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Уважаемый Ігор Гончаренко, Уважаемый БМВ Признателен Вам за ответы.
Спасибо Вам.
Уважаемый Ігор Гончаренко будьте добры подскажите как следует понимать,
-эту строку:
Код
CTp = Application.Calculation:   Application.Calculation = xlCalculationManual
-и эту:
Код
Application.Calculation = CTp
Насколько я понимаю, первая строка говорит о том что все расчеты производятся только "вручную", ну или в данном случае по команде. А во втором случае активировать пересчет, притом пересчитан будет весь лист?
И правильно ли я понимаю что если мы хотим пересчитывать именно Cells(8, 7),  то вторую строку нужно чуть подредактировать:
Код
Cells(8, 7).Application.Calculation = CTp
Признаю в первом сообщении темы и в самом названии темы этого и близко не было. Но Вы конструкцию показали, о которой я даже и не догадывался, а как именно она работает, и как ее в дальнейшем можно применить понимания в принципе нет.

Еще раз Благодарю за ответы.
 
Цитата
IgorBoot написал: как следует понимать,
нет , не верно поняли.
Это предварительное сохранение текущего метода расчета, установка пересчета ручного, а потом возврата к прежнему, ранее сохраненному.

Цитата
IgorBoot написал: если мы хотим пересчитывать именно Cells(8, 7),  
и только её, то
Cells(8, 7).calculate
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх