Я использую Application.Ontime
для запуска 3 процедур в рабочей книге, которые будут действовать как таймеры. Первый - просто напоминание о том, что у пользователя заблокирована книга для редактирования через 10 минут. Два других проверяют отсутствие активности на основе событий Workbook (SheetCalculate
, SheetSelectionChange
и т. Д.). После 10 минут бездействия вызывается пользовательская форма, чтобы предупредить их, что они простаивают в течение 10 минут, и что через 15 минут форма автоматически сохранится и закроется.
Я хотел изменитьпервое событие в режиме повторять каждые 10 минут, просто чтобы сообщить им, что они все еще работают в сеансе без чтения. Достаточно просто, я просто перенесу процедуру в конце вызываемой процедуры.
Проблема, с которой я столкнулся, заключается в том, что она будет повторяться каждые 10 минут, как и предполагалось, но две другие (запланированные проверки), которые запланированы, не будут выполняться, пока повторяющаяся проверка не будет отменена. И , даже если они запланированы на Now
+ x минут при открытии рабочей книги, таймеры не запускаются до завершения первой запланированной процедуры (EditTimeCheck). Таким образом, даже если у меня не будет повторения, если рабочая книга была открыта и неактивна с самого начала, первое предупреждение появится через 10 минут, затем предупреждение сработает через 10 минут, затем процедура сохранения и закрытия через 15 минут. после того. То есть вместо закрытия через 15 минут он закрывается через 35. Возможно, я не совсем понимаю Application.Ontime
Полагаю.
Я понимаю, что могу запланировать несколько одновременно, но возможно ли, чтобы они действовали так, как я думал? Я подтвердил, что так они себя ведут, закомментировав код каждой процедуры и добавив Debug.Print
с названием процедуры и отметкой времени.
Public IdleTimeClose As Double
Public IdleTime As Double
Public TimeOpen As Double
Private Sub Workbook_Open()
TimeOpen = Now + TimeValue("00:10:00")
IdleTime = Now + TimeValue("00:15:00")
IdleTimeClose = Now + TimeValue("00:15:00")
If Not ThisWorkbook.ReadOnly Then
Application.OnTime TimeOpen, "EditTimeCheck"
Application.OnTime IdleTimeClose, "CloseWB"
End If
End Sub
Sub EditTimeCheck()
MsgBox "You've had the Workbook open for editing for x minutes"
TimeOpen = Now + TimeValue("00:10:00")
Application.OnTime TimeOpen, "EditTimeCheck"
End Sub
Sub IdleWarning()
With inactiveUF
.StartUpPosition = 0
.Left = Application.Left + (0.5 * Application.Width) - (0.5 * .Width)
.Top = Application.Top + (0.55 * Application.Height) - (0.5 * .Height)
.Show False
End With
End Sub
Sub CloseWB()
Dim wb As Workbook
Set wb = Workbooks("Copy of Requests Tracker.xlsm")
With wb
.Save
.Close True
'End With
End Sub
Sub StartIdle()
IdleTime = Now + TimeValue("00:00:10")
IdleTimeClose = Now + TimeValue("00:00:15")
Application.OnTime IdleTime, "IdleWarning"
Application.OnTime IdleTimeClose, "CloseWB"
End Sub
Sub StopIdle()
On Error Resume Next
Application.OnTime IdleTime, "IdleWarning", , False
Application.OnTime IdleTimeClose, "CloseWB", , False
End Sub
Пример одного из событий рабочей книги для сброса таймера в режиме ожидания
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Call StopIdle
Call StartIdle
End Sub
Спасибо за понимание, я не смог найти четкого ответа в своих поисках.