Как более старшие и опытные товарищи помогите пожалуйста советом.
Для работы некоторых макросов, необходимо "Циклическое выполнение всей процедуры". Я имею ввиду прописанные в теле процедуры примерно такой конструкции:
Код
Application.OnTime Now() + TimeSerial(0, 0, 1), "Sub_Name" ' где Sub_Name - Имя процедуры
Подскажите пожалуйста, какие есть способы остановки макросов, с подобным циклическим обращением ко всей процедуре?. Кроме прерывания. Точнее даже так, если макрос который содержит подобную конструкцию вывести на кнопку, то чтобы его остановить, можно ли обойтись этой кнопкой. Вообщем будьте добры для начала ответьте каким образом можно останавливать подобные процедуры.
P.S. Прошу прощения перед Админами и старожилами, за отсутствие файла примера. Файла пример не создал, поскольку нет понимания как его сделать. И заранее прошу прощения за название темы, лучше в голову не пришло. Я постараюсь насколько возможно оставаться в рамках темы.
IgorBoot, Есть на мой взгляд два варианта 1. отменить https://docs.microsoft.com/en-us/office/vba/api/excel.application.ontime Schedule:=false отменит назначенную задачу, но для этого требуется знать время и процедуру, для этого их надо хранить например в глобальной переменной, а вызов этой команды сделать например по кнопке 2. не назначать перед Application.OnTime Now() …. сделать проверку флага, который устанавливается по кнопке или …. и в случае его наличия не назначать следующий старт.
Так как у вас запуск каждую секунду, то предпочтительнее вариант 2, но и про 1 не следует забывать. Часто выполнятся ничего не должно после закрытия книги или активации другой. тогда можно или нужно отменять таймер.
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 не упал на ошибку при попытке очередного запуска, который был намечен, когда книга была еще открыта
Уважаемый Ігор Гончаренко, Уважаемый БМВ Признателен Вам за ответы. Спасибо Вам. Уважаемый Ігор Гончаренко будьте добры подскажите как следует понимать, -эту строку:
Насколько я понимаю, первая строка говорит о том что все расчеты производятся только "вручную", ну или в данном случае по команде. А во втором случае активировать пересчет, притом пересчитан будет весь лист? И правильно ли я понимаю что если мы хотим пересчитывать именно Cells(8, 7), то вторую строку нужно чуть подредактировать:
Код
Cells(8, 7).Application.Calculation = CTp
Признаю в первом сообщении темы и в самом названии темы этого и близко не было. Но Вы конструкцию показали, о которой я даже и не догадывался, а как именно она работает, и как ее в дальнейшем можно применить понимания в принципе нет.
нет , не верно поняли. Это предварительное сохранение текущего метода расчета, установка пересчета ручного, а потом возврата к прежнему, ранее сохраненному.
Цитата
IgorBoot написал: если мы хотим пересчитывать именно Cells(8, 7),