Здравствуйте! Помогите, плз, решить такую задачу: Имеем три макроса. Первый запускается при открытии книги. Второй запускается кнопкой. Третий должен запуститься либо через 45 минут после Первого (после открытия), либо через 15 минут после Второго. Как такое провернуть?
PS: не могу никак разобраться с правилами использования Application.OnTime и TimeValue. Вроде как они должны бы помочь в этой задаче(?)
Здравствуйте! Помогите, плз, решить такую задачу: Имеем три макроса. Первый запускается при открытии книги. Второй запускается кнопкой. Третий должен запуститься либо через 45 минут после Первого (после открытия), либо через 15 минут после Второго. Как такое провернуть?
PS: не могу никак разобраться с правилами использования Application.OnTime и TimeValue. Вроде как они должны бы помочь в этой задаче(?)maverick_77
[p.s.]Только перед первым открытием файла разблокируйте его, а то будет ругаться. (правый клик мыши на файле, выбрать "Свойства" и на вкладке "Общие" нажать кнопку "Разблокировать", если она есть)[/p.s.]
UPD: А если после срабатывания Macros3 нужно оставить возможность его повторных запусков, после ручного запуска Macros2, то замените Macros2 на:
[vba]
Код
Public Sub Macros2() Dim nTime As Date nTime = Now + #12:15:00 AM# If nTime < NextTime Then Application.OnTime NextTime, "Macros3", , False: NextTime = 0 If NextTime < Now Then NextTime = nTime: Application.OnTime NextTime, "Macros3" MsgBox "Macros3 будет запущен " & NextTime, , "Macros2 (ручной запуск)" End Sub
[/vba]
(файл перезалил)
Добрый день! Так?
[p.s.]Только перед первым открытием файла разблокируйте его, а то будет ругаться. (правый клик мыши на файле, выбрать "Свойства" и на вкладке "Общие" нажать кнопку "Разблокировать", если она есть)[/p.s.]
UPD: А если после срабатывания Macros3 нужно оставить возможность его повторных запусков, после ручного запуска Macros2, то замените Macros2 на:
[vba]
Код
Public Sub Macros2() Dim nTime As Date nTime = Now + #12:15:00 AM# If nTime < NextTime Then Application.OnTime NextTime, "Macros3", , False: NextTime = 0 If NextTime < Now Then NextTime = nTime: Application.OnTime NextTime, "Macros3" MsgBox "Macros3 будет запущен " & NextTime, , "Macros2 (ручной запуск)" End Sub
Помогите, пожалуйста, разобраться... 1. Macros3 (в Вашем примере) запустился дважды: первый раз во время, полученное при нажатии кнопки, второй - во время, полученное при открытии файла. Можно ли этого избежать? 2. У Вас во втором макросе есть строки: [vba]
Код
If nTime < NextTime Then Application.OnTime NextTime, "Macros3", , False: NextTime = 0 If NextTime < Now Then NextTime = nTime: Application.OnTime NextTime, "Macros3"
[/vba] Никак не могу понять, что тут делается. 3. Что делает макрос при закрытии: [vba]
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean) On Error Resume Next Application.OnTime NextTime, "Macros3", , False End Sub
[/vba]
KSV, спасибо за вариант!
Помогите, пожалуйста, разобраться... 1. Macros3 (в Вашем примере) запустился дважды: первый раз во время, полученное при нажатии кнопки, второй - во время, полученное при открытии файла. Можно ли этого избежать? 2. У Вас во втором макросе есть строки: [vba]
Код
If nTime < NextTime Then Application.OnTime NextTime, "Macros3", , False: NextTime = 0 If NextTime < Now Then NextTime = nTime: Application.OnTime NextTime, "Macros3"
[/vba] Никак не могу понять, что тут делается. 3. Что делает макрос при закрытии: [vba]
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean) On Error Resume Next Application.OnTime NextTime, "Macros3", , False End Sub
если время запуска мак2 + 15 < мак1 +45, то отменить запуск в мак1+45 обнулить время запуска если время запуска прошло, устанавливаем время запуска мак2+15 запускаем таймер с NextTime
(Двоеточие – чтобы не прописывать каждый оператор в отдельной строке, их можно с помощью двоеточия прописать в одну строку, например: MsgBox "Строка1" : MsgBox "Строка2") [p.s.]что получится при nTime=NextTime не знаю. В случае nTime>NextTime, просто запускается 2-й таймер
На мой взгляд по 2п.
если время запуска мак2 + 15 < мак1 +45, то отменить запуск в мак1+45 обнулить время запуска если время запуска прошло, устанавливаем время запуска мак2+15 запускаем таймер с NextTime
(Двоеточие – чтобы не прописывать каждый оператор в отдельной строке, их можно с помощью двоеточия прописать в одну строку, например: MsgBox "Строка1" : MsgBox "Строка2") [p.s.]что получится при nTime=NextTime не знаю. В случае nTime>NextTime, просто запускается 2-й таймерUdik
вот вам барабан яд 41001231307558 wm R419131876897 udik1968@gmail.com
Сообщение отредактировал Udik - Понедельник, 20.07.2015, 11:56
1. Такого и не должно быть. Сейчас там заложена такая логика: При открытии файла планируется запуск Macros3 через 45 минут. Если запускается Macros2, то он проверяет, какое время наступит раньше - время открытия файла + 45 мин., или время запуска Macros2 + 15 мин. Если время запуска Macros2 + 15 мин. раньше, то отменяет запланированное ранее время (откр+45) и планирует новое время (М2+15). Если время М2+15 наступит позже запланированного ранее откр+45, то никакого перепланирования не происходит и М3 запустится по плану, т.е. во время откр+45.
2. В первой строке, как раз проверяется какое время наступит раньше (откр+45 или М2+15) и в случае необходимости отменяется ранее запланированный запуск М3. А во второй - проверяется прошло ли время запуска М3 или был ли запуск отменен в пред. строке. И если это так, то и в том, и в другом случае, назначает новое время запуска М2+15 мин.
3. При закрытии файла, отменяет запланированный запуск М3.
1. Такого и не должно быть. Сейчас там заложена такая логика: При открытии файла планируется запуск Macros3 через 45 минут. Если запускается Macros2, то он проверяет, какое время наступит раньше - время открытия файла + 45 мин., или время запуска Macros2 + 15 мин. Если время запуска Macros2 + 15 мин. раньше, то отменяет запланированное ранее время (откр+45) и планирует новое время (М2+15). Если время М2+15 наступит позже запланированного ранее откр+45, то никакого перепланирования не происходит и М3 запустится по плану, т.е. во время откр+45.
2. В первой строке, как раз проверяется какое время наступит раньше (откр+45 или М2+15) и в случае необходимости отменяется ранее запланированный запуск М3. А во второй - проверяется прошло ли время запуска М3 или был ли запуск отменен в пред. строке. И если это так, то и в том, и в другом случае, назначает новое время запуска М2+15 мин.
3. При закрытии файла, отменяет запланированный запуск М3.KSV