Вопрос касается операции со временем. Макрос устанавливает таймер на 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
Option Explicit
Public NextStart As DatePrivate boolStop As BooleanSub Включить_таймер()
' boolStop = False
Вставить_данные
End SubPrivate 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)
NextStart = Now + TimeValue("00:00:07")
Application.OnTime NextStart, "Вставить_данные"
Макрос7
End SubSub Выключить_таймер()
boolStop = True
'MsgBox "Таймер отключен.", vbInformation
End SubSub Выключить_таймер_надежно()Application.OnTime NextStart, "Вставить_данные", Schedule:=FalseEnd Sub
в программировании не бывает "надежно отключить таймер" бывает отключить или не оключить, т.е. это сделано или это не сделано случай, когда пытались сделать, но не получилось - относиться к варианту "не сделано"
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
OlegSmirnov написал: Как надежно отключить таймер, чтобы он намертво вырубался и начинал работать только тогда - когда я вновь нажму на кнопку "включить таймер" ?
- кстати это довольно надёжно описано как ни странно в описании этого "таймера" и в справке, и на MSDN
Выдает ту же самую ошибку : 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
Почему в одном случае данная строчка работает, а в другом случае - выдает ошибку ?
Потому что NextStart - совершенно ничего не означает, не нужно это слово переводить Прочитайте уже хелп... Логика такая - когда запускаете таймер, то указываете ТОЧНОЕ время срабатывания. Точное, а не какое-то там текущее плюс пара минут. Если нужно выключить - используете это значение времени. Удобнее в переменной, и не важно как она называется.
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