Можно ли запустить несколько событий времени, когда первое повторяется? - PullRequest
0 голосов
/ 22 октября 2019

Я использую 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

Спасибо за понимание, я не смог найти четкого ответа в своих поисках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...