打开宏启用的工作簿时无法选择其他工作簿

时间:2014-08-01 00:40:45

标签: excel vba excel-vba

我有一个启用宏的工作簿,它使用代码来设置一个计时器 - 这是一本共享的书,通常人们会在书中并离开他们的桌子等。它被设置为保存& 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 个答案:

答案 0 :(得分:1)

首先,我不完全确定你为什么会这样做,但请继续阅读。我怀疑它与您的 busy-wait 循环(DoEvents的循环)有关,但这只是一种预感。其他人可能有更好的解释。

无论如何,使用Application.OnTime或许是一种更好的方法。您可以安排在特定时间或间隔进行操作,并且可以选择取消和替换先前安排的操作。您需要在Workbook_SheetChange事件处理程序中使用该工具。

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

  1. 添加一个新例程以保存并退出工作簿,让我们调用它:SaveWorkbookAndExit。这将在OnTime稍后调用。
  2. 替换Workbook_SheetChange事件处理程序的内容,如下所示:

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

    这基本上安排了从现在起30分钟内调用的例程SaveWorkbookAndExit。请注意Schedule:=False - 它表示应该清除/取消先前设置的程序,这非常重要。

  3. 还要将上述代码添加到Workbook_Open事件处理程序中。 与上述不同,请注意您应在此处设置Schedule:=True
  4. 就是这样。打开工作簿时,将安排新的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;模块 - 这段代码可能有点过分,但似乎有效。感谢您抽出宝贵时间帮助我,让我走上正轨!