Страницы: 1
RSS
Как надежно отключить таймер в макросе
 
Доброго вечера всем.
Помогите решить непростой вопрос.

Вопрос касается операции со временем.
Макрос устанавливает таймер на 7 секунд.
Я делаю следующие операции - жму на кнопку "включить таймер", затем выжидаю пару секунд и жму на кнопку "выключить таймер".
Затем закрываю рабочую книгу.
Но тут происходит следующее:
Через 5 секунд эта закрытая книга - сама собой открывается и макрос в нем - продолжает работать по таймеру.
Такое ощущение, что после нажатия на кнопку отключения и закрытия книги - таймер каким-то образом продолжил свою работу.

Как надежно отключить таймер, чтобы он намертво вырубался и начинал работать только тогда - когда я вновь нажму на кнопку "включить таймер" ?

То есть если запустить таймер, выждать секунду, отключить таймер и закрыть книгу - чтобы эта книга не открывалась бы сама по себе.
Причем не нужно ставить каких-то скриптов на событие "закрытия книги".
Таймер должен надежно отключатся именно кнопкой.

Макрос выглядит так:
Код
Option Explicit

Private boolStop As Boolean

Sub Включить_таймер()
    boolStop = False
    Вставить_данные
End Sub

Private Sub Вставить_данные()
    
    Dim lr As Long
    
    If boolStop = True Then
        Exit Sub
    End If
    
    lr = Cells(Rows.Count, "C").End(xlUp).Row
    If lr = 1 Then
        If Range("C1").Value <> "" Then
            lr = lr + 1
        End If
    Else
        lr = lr + 1
    End If
    
    Cells(lr, "C").Value = Range("A1").Value + (Range("B1").Value * lr - Range("B1").Value)
    
    Application.OnTime Now + TimeValue("00:00:05"), "Вставить_данные"
Макрос7
End Sub

Sub Выключить_таймер()
    boolStop = True
End Sub
Изменено: OlegSmirnov - 16.03.2019 00:22:30
 
запомнить назначенное время и Application.OnTime EarliestTime:=TimeValue("17:00:00"), _
Procedure:="my_Procedure", Schedule:=False
Изменено: БМВ - 15.03.2019 21:34:40
По вопросам из тем форума, личку не читаю.
 
БМВ, что-то не работает.
Выдает ошибку:
Runtime error 1004: Method OnTime of object _Application failed

Подсвечивает строку :
Код
Application.OnTime EarliestTime:=TimeValue("00:00:07"), _
Procedure:="Вставить_данные", Schedule:=False
Изменено: OlegSmirnov - 15.03.2019 21:50:23
 
ну нельзя ж  просто бездумно копировать

Скрытый текст
По вопросам из тем форума, личку не читаю.
 
БМВ, так... ну вроде теперь книга повторно не открывается.
Спасибо за помощь.
 
в программировании не бывает "надежно отключить таймер"
бывает отключить или не оключить, т.е. это сделано или это не сделано
случай, когда пытались сделать, но не получилось - относиться к варианту "не сделано"
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
OlegSmirnov написал:
Как надежно отключить таймер, чтобы он намертво вырубался и начинал работать только тогда - когда я вновь нажму на кнопку "включить таймер" ?
- кстати это довольно надёжно описано как ни странно в описании этого "таймера" и в справке, и на MSDN :)
 
Нет, все равно что-то не работает.
Вот такой макрос даже с использованием строчки
Код
Application.OnTime NextStart, "Вставить_данные", Schedule:=False
Все равно отказывается работать.

Выдает ту же самую ошибку : Runtime error 1004: Method OnTime of object _Application failed
И подсвечивает данную строку.

Макрос выглядит так:
Код
Option Explicit
Public NextStart As Date
Private boolStop As Boolean

Sub Включить_таймер()

'Выключить_таймер

    boolStop = False
    Вставить_данные

End Sub

Sub Вставить_данные()
     
   
    If boolStop = True Then
        Exit Sub
    End If

[A2] = [A2] + 1
   NextStart = Now + [E10]
   Application.OnTime Now + [E10], "Вставить_данные"

End Sub
Sub Выключить_таймер()

    boolStop = True
    'MsgBox "Таймер отключен.", vbInformation
End Sub

Sub Выключить_таймер_надежно()

Application.OnTime NextStart, "Вставить_данные", Schedule:=False

End Sub


Почему в одном случае данная строчка работает, а в другом случае - выдает ошибку ?
Изменено: OlegSmirnov - 16.03.2019 00:46:48
 
Потому что NextStart - совершенно ничего не означает, не нужно это слово переводить :)
Прочитайте уже хелп...
Логика такая - когда запускаете таймер, то указываете ТОЧНОЕ время срабатывания. Точное, а не какое-то там текущее плюс пара минут.
Если нужно выключить - используете это значение времени. Удобнее в переменной, и не важно как она называется.
Изменено: Hugo - 16.03.2019 00:26:55
 
Цитата
Hugo написал:
Логика такая - когда запускаете таймер, то указываете ТОЧНОЕ время срабатывания. Точное, а не какое-то там текущее плюс пара минут.
Ничего не понимаю.
А в этой строчке из сообщения 4  - не точное время что ли было указано ?
Код
NextStart = Now + TimeValue("00:00:07")
 
OlegSmirnov, посмотрите внимательно тот код что я написал выше, я специально менял его минимально, только дополнил необходимым и закомментил ненужное.
Ну наверно не просто так там вот так сделано
Код
    NextStart = Now + TimeValue("00:00:07")
    Application.OnTime NextStart, "Вставить_данные"
нужно ж запомнить как-то это точное время.
По вопросам из тем форума, личку не читаю.
 
БМВ, у вас там в начале кода - не хватало строки пропуска ошибок On Error Resume Next
И поэтому при повторном нажатии у меня выдавало ошибку, а при одиночном нажатии - все работало.
 
БМВ, в общем все теперь работает.
Спасибо за уточнение.
 
OlegSmirnov, не у меня а у Вас, и это не заблокирует  повторные клацания по кнопке старт. А так как каждый раз будет переписано значение NextStart, то стоп отключит только последнее. Ну тут уже надо понимать что нужно и по факту или кнопки блокировать или алгоритм менять. А так просто можно , да и правильнее, чтоб не плодить ошибок , обнулять и проверять
Код
If NextStart = 0 Then Exit Sub
Application.OnTime NextStart, "вставить_данные", Schedule:=False
NextStart = 0
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх