Excel - таймер для закрытия книги - PullRequest
0 голосов
/ 20 января 2011

Некоторое время назад я набрал (или нашел) некоторый код для автоматического закрытия общей книги по истечении определенного периода, если пользователь оставил ее открытой (например, в течение ночи или весь день). Код работает хорошо, за исключением случаев, когда он закрывает рабочую книгу, в которой он находится; он также закрывает все рабочие книги и превосходит их (без Application.Quit). Это раздражает пользователей, кто-нибудь знает, как я могу заставить его закрыться (Thisbookbook), а не все остальные?

Спасибо.

Код ниже:

Option Explicit

' Declarations
Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Private mlngTimerID As Long

' start the timer
Public Sub StartTimer(lngInterval As Long)
   mlngTimerID = SetTimer(0, 0, lngInterval, AddressOf TimerCallBack)
End Sub

' when the timer goes off
Public Sub TimerCallBack(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)

 ' stop the timer
 StopTimer

  ' don't save if read only
 If ThisWorkbook.ReadOnly = False Then

  ' save
  ThisWorkbook.Save

 End If

 ' exit without saving
 ThisWorkbook.Activate
 ThisWorkbook.Close False

End Sub

Public Sub StopTimer()
   KillTimer 0, mlngTimerID
End Sub

'To use timer:
'To start the timer
'Call startTimer(1000)'1000 = 1 Second
'To stop timer
'Call stopTimer

Ответы [ 2 ]

2 голосов
/ 23 декабря 2014

Я знаю, что это старый вопрос, но я решил поделиться решением, которое мне подходит.После открытия рабочая книга сохраняется как переменная Public, так что по истечении таймера она будет единственной рабочей книгой, закрытой.Если рабочая книга закрыта до истечения времени, таймер отменяется.Если время таймера истекло, а рабочая книга все еще открыта, она будет автоматически сохранена и закрыта.

Вставьте приведенный ниже код в «ThisWorkbook»

'When the workbook is opened, call StartTimer()
Public Sub Workbook_Open()
    Run "StartTimer"
End Sub

'Detect if the workbook is closed
Public Sub Workbook_BeforeClose(Cancel As Boolean)
    'Cancel Saveclose
    Run "StopTimer"
End Sub

Вставьте приведенный ниже код в модуль

'Global variables
Public RunWhen As Double
Public Const cRunIntervalSeconds = 300 ' seconds (set to 5 minutes)
Public Const cRunWhat = "SaveClose"  ' the name of the procedure to run
Public GlobalBook As Workbook

'Start Timer using interval set in global variables
Sub StartTimer()
    Set GlobalBook = ActiveWorkbook
    RunWhen = Now + TimeSerial(0, 0, cRunIntervalSeconds)
    Application.OnTime EarliestTime:=RunWhen, Procedure:=cRunWhat, _
        Schedule:=True
End Sub

'Stop the Timer whenever the workbook is closed prematurely
Public Sub StopTimer()
    On Error Resume Next
    Application.OnTime EarliestTime:=RunWhen, Procedure:=cRunWhat, _
        Schedule:=False
End Sub

'Close the workbook automatically once the Timer has expired
Public Sub SaveClose()
    'Time is up, workbook will save and close automatically
    Dim wb As Workbook
    For Each wb In Workbooks
        'Check to see if workbook is still open
        If wb.Name = GlobalBook.Name Then
            Set wb = Application.Workbooks(GlobalBook.Name)
            'Close workbook and Save Changes
            wb.Close SaveChanges:=True
        End If
        Next
End Sub
1 голос
/ 21 января 2011

Вы пытались использовать вместо "OnTime" Excel?

http://msdn.microsoft.com/en-us/library/aa195809(v=office.11).aspx

Тим

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