戴夫(Dave)想知道,如果当前不使用工作簿,是否可以在一定时间后强制其关闭。人们在他的办公室中打开服务器上的工作簿,然后忘记它们是打开的。发生这种情况时,其他任何人都无法编辑它们,因此他希望在无人看管60分钟的情况下关闭工作簿。

可以使用宏来执行此操作,但是您可能真的不希望从业务或面向用户的角度执行此操作。例如,假设用户在其系统上打开了三个工作簿,因此可以在它们之间进行比较。可能会“绑起来”

其中有两本工作簿已经存在了相当长的一段时间,而第三本是触发关机的那本。如果您的VBA代码编写不正确,则最终可能会关闭当前工作重点所在的工作簿,这显然是您不希望发生的结果。

此外,关闭时如何处理未保存的更改?如果保存它们,则会遇到用户可能不打算保存它们的问题。如果不保存它们,则会出现相反的问题-也许有很多数据需要保存。您无法通过关闭程序询问是否应保存信息;这样可以确保将工作簿与打开(和未使用)一样牢牢地绑在一起。

一种可能的解决方案是简单地共享或共同创作(Excel 2019和Office 365中的Excel)工作簿。如果启用共享或共同创作(如其他_ExcelTips_中所述),那么多个人可以同时打开同一工作簿。如果其中一个人将其打开,那么不会给其他人带来不便,因为他们仍然可以打开它,并且可以选择在工作簿中进行更改。

如果您决定采用基于宏的路由,那么解决方案将非常简单。您需要某种计时器结构(可通过使用OnTime方法轻松实现)和某种检查是否有人在工作簿中进行操作的方法。

首先,将以下代码添加到标准宏模块中。注意,要添加三个例程:

Dim DownTime As Date

Sub SetTimer()

DownTime = Now + TimeValue("01:00:00")

Application.OnTime EarliestTime:=DownTime, _       Procedure: = "ShutDown", Schedule:=True End Sub
Sub StopTimer()

On Error Resume Next     Application.OnTime EarliestTime:=DownTime, _       Procedure:="ShutDown", Schedule:=False  End Sub
Sub ShutDown()

Application.DisplayAlerts = False     With ThisWorkbook         .Saved = True         .Close     End With End Sub

这三个例程非常简单。前两个分别打开和关闭计时器。请注意,这些例程使用DownTime变量,该变量在任何例程外部声明。这样,其内容可以在多个例程中使用。

第三个例程ShutDown是实际上关闭工作簿的例程。仅当OnTime方法在一个小时结束时过期时才调用它。它关闭工作簿,而不保存任何可能已进行的更改。

下一个例程(其中有四个)需要添加到ThisWorkbook对象。打开VBA编辑器,然后在项目资源管理器中双击ThisWorkbook对象。在Excel打开的代码窗口中,放置以下例程:

Private Sub Workbook_Open()

Call SetTimer End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)

Call StopTimer End Sub
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)

Call StopTimer     Call SetTimer End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, _   ByVal Target As Excel.Range)

Call StopTimer     Call SetTimer End Sub

打开和关闭工作簿时会触发前两个例程。他们启动计时器并将其关闭。每当重新计算工作表或有人在工作簿中进行选择时,就会自动执行其他两个例程。两者都是表明有人正在使用工作簿(它没有处于非活动状态)的良好指示。他们停止计时器,然后重新启动计时器,以便从一小时开始倒计时。

使用这样的一组宏有一个弊端:有效消除Excel的撤消功能。执行宏后,Excel会自动清除“撤消”堆栈。由于宏在工作簿中进行的所有更改都在运行,因此无法撤消该人的更改。 (无法解决此缺陷。)

另一个问题是宏只能存储在启用宏的工作簿中。因此,基于宏的解决方案不适用于常规XLSX文件,因为它们不允许其中包含宏。在这种情况下,您只能使用非宏解决方案,例如打开工作簿共享或共同创作。

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(8192)适用于Microsoft Excel 2007、2010、2013、2016、2019和Office 365中的Excel。您可以在此处为Excel的较早菜单界面找到此技巧的版本: