题
我有一个启用宏的工作簿,它使用代码来设置计时器 - 这是一本共享的书,人们通常会在书中并离开办公桌等。它设置为在 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
解决方案 2
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
.
我的一半战斗是通过“这个”或“那个”模块来实现人们的意思 - 这段代码可能有点过多,但它似乎有效。我很感激你花时间帮助并让我在正确的轨道上!
其他提示
首先,我不完全确定您为什么会出现这种行为,但请继续阅读。我 怀疑 这与你有关 忙等待 循环(带有 DoEvents
),但这只是一种预感。其他人可能有(更好的)解释。
无论如何,也许使用 Application.OnTime
是一个更好的方法。您可以安排操作在特定时间或间隔发生,并且可以选择取消和替换先前安排的操作。您将需要该设施 Workbook_SheetChange
事件处理程序。
简而言之,您可以执行以下操作:
- 添加一个新例程来保存并退出工作簿,我们将其命名为:
SaveWorkbookAndExit
. 。这将被称为OnTime
之后。 替换你的内容
Workbook_SheetChange
事件处理程序如下:Application.OnTime Now + TimeValue("00:30:00"), _ "SaveWorkbookAndExit", _ Schedule:=False
这基本上安排了例行公事
SaveWorkbookAndExit
从现在起 30 分钟后会接到电话。注意Schedule:=False
——表示之前设定的程序应该被清除/取消,这一点非常重要。- 还将与上面相同的代码添加到您的
Workbook_Open
事件处理程序。 但与上面不同的是,请注意您应该设置Schedule:=True
在这里!
就是这样。当工作簿打开时,会出现一个新的 SaveWorkbookAndExit
操作已安排。然后,每次你进入 Workbook_SheetChange
, ,先前安排的操作将被取消,并安排新的操作来代替。
我还没有测试过这些,但我希望你能明白。如果您需要我进一步解释,请告诉我。