您可能已经发生了这种情况:打开工作簿,浏览一些工作表,然后关闭工作簿。作为结束的一部分,Excel询问您是否要保存更改,但是您没有进行任何更改-您只是环顾四周。是什么赋予了?

在内部,Excel维护通常称为“脏污标志”的东西。每当您对工作簿进行某种更改时,都会设置此标志。

每当您保存工作簿时,该标志都会被清除。如果在关闭工作簿时设置了该标志,则Excel会询问您是否要保存工作簿。

如果您对工作簿进行一些显式更改(例如,编辑单元格或以某种方式修改工作簿的结构),那么显然可以设置dirty标志。但是,即使您没有做任何明确的事情,也可以设置它。有时,Excel会由于您打开工作簿的事实而影响工作簿的内容。这将设置脏标志,从而触发有关保存的请求。

进行此类自动更改的两大罪魁祸首是TODAY和NOW工作表功能。它们分别返回系统日期和系统时间。首次打开工作簿时,它们会在正常的重新计算过程中进行更新。由于它们表示更改,因此Excel会设置脏标志。

如果您的工作簿中包含指向其他工作表上数据的链接,那么也可以自动设置dirty标志。 Excel检索数据,该数据表示您刚刚打开的工作簿的更改。如果您只是在工作簿中浏览,执行诸如选择单元格或更改为其他工作表之类的操作,则Excel不会设置脏标志。

解决该问题的一种方法是,当然,删除导致工作簿更改的所有内容。对于大多数人来说,这是不切实际的。您还可以添加一个自动宏,该宏将在工作簿关闭之前运行,例如以下内容,它应该是ThisWorkbook对象的一部分:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

ActiveWorkbook.Saved = True End Sub

此宏只不过清除脏标志(Saved属性)。尽管这种方法行之有效,但使用它存在巨大的固有风险。使用宏后,即使对工作簿进行了合法更改,Excel也不会询问您是否要在退出时保存更改。因此,每当进行更改时,您都需要记住要在工作簿中明确保存任何内容。如果您不这样做,则可能会失去一些工作。

这种方法的一种变体(一种不会遗忘被遗忘的更改的变体)是实际上使ThisWorkbook对象的Workbook_Open过程的宏部分:

Private Sub Workbook_Open()

ActiveWorkbook.Saved = True End Sub

现在,Excel打开工作簿,重新计算(包括基于TODAY和NOW等功能进行更改),然后清除脏标志。如果您立即关闭,则不会询问您是否要保存更改。系统将询问您是否要保存更改,但是,是否要在运行此宏后(即在完全打开工作表之后)进行更改。

除了自动重新计算设置脏标志的函数外,工作簿还可能包含一个或两个宏,当您打开该宏时它们会自动运行。如果宏在工作簿中进行了某种更改,则它自然会设置脏标志。您可以签出VBA编辑器以查看是否存在这种情况。

注意:

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

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

本技巧(2081)适用于Microsoft Excel 97、2000、2002和2003。可以在以下功能区中为Excel的功能区界面(Excel 2007及更高版本)找到本技巧的版本: