我有一个启用宏的工作簿,它使用代码来设置计时器 - 这是一本共享的书,人们通常会在书中并离开办公桌等。它设置为在 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 事件处理程序。

简而言之,您可以执行以下操作:

  1. 添加一个新例程来保存并退出工作簿,我们将其命名为: SaveWorkbookAndExit. 。这将被称为 OnTime 之后。
  2. 替换你的内容 Workbook_SheetChange 事件处理程序如下:

    Application.OnTime Now + TimeValue("00:30:00"), _
                       "SaveWorkbookAndExit", _
                       Schedule:=False
    

    这基本上安排了例行公事 SaveWorkbookAndExit 从现在起 30 分钟后会接到电话。注意 Schedule:=False ——表示之前设定的程序应该被清除/取消,这一点非常重要。

  3. 还将与上面相同的代码添加到您的 Workbook_Open 事件处理程序。 但与上面不同的是,请注意您应该设置 Schedule:=True 在这里!

就是这样。当工作簿打开时,会出现一个新的 SaveWorkbookAndExit 操作已安排。然后,每次你进入 Workbook_SheetChange, ,先前安排的操作将被取消,并安排新的操作来代替。

我还没有测试过这些,但我希望你能明白。如果您需要我进一步解释,请告诉我。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top