我有一个启用宏的工作簿,它使用代码来设置一个计时器 - 这是一本共享的书,通常人们会在书中并离开他们的桌子等。它被设置为保存& 30分钟不活动后关闭。该功能似乎工作正常,但我遇到的问题是,当我打开其他工作簿时,我无法选择它们,无论是通过单击磁贴(Windows 7)还是通过alt + tab,移动的唯一方法是ctrl +偏移。如果只是我使用不会成为问题的工作簿 - 是否有人知道为什么会这样?代码发布如下:
Private Sub Workbook_Open()
StartTimer
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
StartTimer
End Sub
Const idleTime = 1800 'seconds
Dim Start
Sub StartTimer()
Start = Timer
Do While Timer < Start + idleTime
DoEvents
Loop
Application.DisplayAlerts = False
ActiveWorkbook.Close True
Application.DisplayAlerts = True
End Sub
答案 0 :(得分:1)
首先,我不完全确定你为什么会这样做,但请继续阅读。我怀疑它与您的 busy-wait 循环(DoEvents
的循环)有关,但这只是一种预感。其他人可能有更好的解释。
无论如何,使用Application.OnTime
或许是一种更好的方法。您可以安排在特定时间或间隔进行操作,并且可以选择取消和替换先前安排的操作。您需要在Workbook_SheetChange
事件处理程序中使用该工具。
简而言之,您可以执行以下操作:
SaveWorkbookAndExit
。这将在OnTime
稍后调用。替换Workbook_SheetChange
事件处理程序的内容,如下所示:
Application.OnTime Now + TimeValue("00:30:00"), _
"SaveWorkbookAndExit", _
Schedule:=False
这基本上安排了从现在起30分钟内调用的例程SaveWorkbookAndExit
。请注意Schedule:=False
- 它表示应该清除/取消先前设置的程序,这非常重要。
Workbook_Open
事件处理程序中。 与上述不同,请注意您应在此处设置Schedule:=True
! 就是这样。打开工作簿时,将安排新的SaveWorkbookAndExit
操作。然后,每次进入Workbook_SheetChange
时,先前安排的操作将被取消,并且将在其位置安排新的操作。
我还没有测试过这个,但我希望你明白这个想法。如果您需要我进一步解释,请告诉我。
答案 1 :(得分:0)
Thank you again for the reply, I couldn't quite figure you where I was supposed to put what as I am new to this as I had said. I did find a solution, or so it seems:
In the "This Workbook" module I put:
Option Explicit
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
ResetTimer
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
ResetTimer
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
ResetTimer
End Sub
and in the "user" module (i right click and add module), I used:
Public CloseDownTime As Variant
Public Sub ResetTimer()
On Error Resume Next
If Not IsEmpty(CloseDownTime) Then Application.OnTime EarliestTime:=CloseDownTime, Procedure:="CloseDownFile", Schedule:=False
CloseDownTime = Now + TimeValue("00:00:30") ' hh:mm:ss
Application.OnTime CloseDownTime, "CloseDownFile"
End Sub
Public Sub CloseDownFile()
On Error Resume Next
Application.StatusBar = "Inactive File Closed: " & ThisWorkbook.Name
ThisWorkbook.Close SaveChanges:=True
End Sub
我的一半战斗是意识到人们的意思&#34;这&#34;或&#34;那&#34;模块 - 这段代码可能有点过分,但似乎有效。感谢您抽出宝贵时间帮助我,让我走上正轨!