Application.OnTime повторно открывает книгу, когда открыта другая книга - PullRequest
0 голосов
/ 14 января 2019

У меня есть таймер, который закрывает мою книгу через 5 минут. Проблема в том, что когда я открываю другую рабочую книгу, она открывается, когда таймер снова открывается, когда я пытаюсь закрыть ее.

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

У меня есть это и в моем модуле, и в этой рабочей книге

Public gCount as Date

Эти два кода находятся в моем модуле. Таймер отображается в ячейке (Worksheets ("kode"). Range ("H3")) и обратный отсчет каждые 10 секунд

Sub Timer()
gCount = Now + TimeValue("00:00:10")
Application.OnTime gCount, "ResetTime"
End Sub

Sub ResetTime()
Dim xRng As Range
If ThisWorkbook.Worksheets("kode").Range("H3") = "" Then GoTo Endsub
Set xRng = Application.ThisWorkbook.Worksheets("kode").Range("H3")
xRng.Value = xRng.Value - TimeSerial(0, 0, 10)
If xRng.Value <= 1.15740740740741E-05 Then
Call SavedAndClose
Exit Sub
End If
Call Timer

Endsub:

End Sub

Этот код находится в ThisWorkbook

Private Sub Workbook_BeforeClose(Cancel As Boolean)

On Error Resume Next

gCount = Now + TimeValue("00:00:10")
Application.OnTime gCount, "ResetTime", Schedule:=False

ThisWorkbook.Worksheets("Interface").Select

'Hides all sheets but the interface sheet
Sheet2.Visible = False
Sheet3.Visible = False
Sheet6.Visible = False
Sheet7.Visible = False
Sheet8.Visible = False

End Sub

Там также есть место, где ячейка Worksheets ("kode"). Range ("H3") установлена ​​на 00:05:01 и Workbook_SheetSelectionChange, где она сбрасывает его на 00: 05: 01

Лист закрывается, когда Рабочие листы ("код"). Диапазон ("H3") в 00: 00: 01

Если я удаляю «При возобновлении ошибки далее», код делает ошибку 1004 во время выполнения, когда я пытаюсь закрыть книгу.

Надеюсь, что кто-то может помочь мне закрыть мою книгу

С уважением

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Я нашел ответ на свой комментарий к ответу GSergs:

Я создал Msgbox с параметрами vbYesNoCancel и отменил событие OnTime в ответах «Да» и «Нет» и обошел всеобщее приглашение «Сохранить изменения» в Excel. Если нажать Отмена, макрос отменится.

«If xRng.Value <= 1.15740740740741E-05 Then» в начале гарантирует, что, если таймер закончился, он пропускает MsgBox и просто сохраняет. </p>

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Set xRng = Application.ThisWorkbook.Worksheets("kode").Range("H3")
If xRng.Value <= 1.15740740740741E-05 Then
Application.ScreenUpdating = False

ThisWorkbook.Worksheets("Interface").Select

'Hides all sheets but the interface sheet
Sheet2.Visible = False
Sheet3.Visible = False
Sheet6.Visible = False
Sheet7.Visible = False
Sheet8.Visible = False

Application.OnTime gCount, "ResetTime", Schedule:=False
If ThisWorkbook.Saved = False Then
    ThisWorkbook.Save
End If
Application.ScreenUpdating = True
GoTo Endsub
Else
End If


Dim intValue As Integer
intValue = MsgBox("Do you want to save changes?", 3, "Save changes?")

If intValue = 6 Then

Application.ScreenUpdating = False

ThisWorkbook.Worksheets("Interface").Select

'Hides all sheets but the interface sheet
Sheet2.Visible = False
Sheet3.Visible = False
Sheet6.Visible = False
Sheet7.Visible = False
Sheet8.Visible = False

Application.OnTime gCount, "ResetTime", Schedule:=False
If ThisWorkbook.Saved = False Then
    ThisWorkbook.Save
End If
Application.ScreenUpdating = True

ElseIf intValue = 7 Then

Application.ScreenUpdating = False

ThisWorkbook.Worksheets("Interface").Select

'Hides all sheets but the interface sheet
Sheet2.Visible = False
Sheet3.Visible = False
Sheet6.Visible = False
Sheet7.Visible = False
Sheet8.Visible = False

Application.OnTime gCount, "ResetTime", Schedule:=False
ThisWorkbook.Saved = True
Application.ScreenUpdating = True

Else
Cancel = True

End If
End Sub

Надеюсь, что это может помочь кому-то с той же проблемой.

С наилучшими пожеланиями Сорен

0 голосов
/ 14 января 2019

Если я удаляю «Возобновить при следующей ошибке», при попытке закрыть рабочую книгу код выдаст ошибку 1004.

И именно поэтому вы не должны ставить On Error Resume Next везде, чтобы заглушать ошибки, а не исправлять их.

Application.OnTime может запланировать одну и ту же процедуру несколько раз на разное время дня. По этой причине он может не планировать ранее запланированную запись, только если вы укажете точное время, на которое она была запланирована - если вы укажете время, на которое нет запланированной записи, вы получите ошибку времени выполнения 1004.

Now + TimeValue("00:00:10") возвращает другое значение каждый раз, когда вы вызываете его.

Если вы хотите иметь возможность отменить ранее установленную запись, сохраните время в переменной уровня модуля и используйте эту переменную как для планирования, так и для планирования. Ваша переменная уровня модуля gCount подойдет, но:

  • У вас есть два из них («У меня есть это и в моем модуле, и в этой рабочей книге»)
  • Вы перезаписываете ранее сохраненное значение бесполезным новым прямо перед вызовом Schedule:=False.

Убедитесь, что у вас есть только один gCount, и назначьте его только перед планированием вызова, а не перед его планированием.

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