【发布时间】:2010-09-16 06:18:39
【问题描述】:
我有一个包含 VBA 应用程序的只读 Excel 工作簿。应用程序将需要保存在数据库中的所有数据保存在数据库中,并且工作簿始终关闭而不保存(通过在 BeforeClose 中设置 ThisWorkbook.Saved = True)。
我有以下问题:
用户在 Windows 资源管理器中双击工作簿,工作簿打开。
用户在 Windows 资源管理器中再次双击工作簿。
Excel 提示:“MyWorkbook.xls 已打开。重新打开会导致放弃您所做的任何更改。是否要重新打开 MyWorkbook.xls?”
如果用户单击“是”,则重新打开工作簿而不执行已打开实例的 BeforeClose 事件处理程序。
这是我的应用程序中的一个问题,因为这意味着 BeforeClose 事件处理程序中的一些重要清理代码没有被执行。
任何人都可以为此建议一个 VBA 解决方案。可能是:
抑制重新打开工作簿的提示。而是静默使用已经打开的实例。
以某种方式让 BeforeClose 或其他一些事件处理程序在原始实例关闭之前运行,这样我就可以运行我的清理代码了。
更新:
这是 Excel 2003。
我可以通过在 Workbook_SheetChanged 事件处理程序中设置“ThisWorkbook.Saved = True”来摆脱不需要的提示(VBA 应用程序负责保存任何需要保存在数据库中的数据,所以我不在乎关于让 Excel 保存更改)。
但这并不能解决我的问题:如果我这样做,则在资源管理器中双击工作簿会静默地重新打开工作簿,但仍会这样做,而无需通过“BeforeClose”事件处理程序调用。
所以换个说法:
- 是否有使用 VBA 来检测和拦截以这种方式重新打开的工作簿?
更新 2
接受 BKimmel 的回答 - 似乎没有 VBA 方法可以从工作簿中拦截此事件。
我将实施的解决方案是将应用程序代码移动到 XLA 加载项中,该加载项会在加载工作簿时自动加载(如果尚未加载)。加载项可以处理 Open 和 BeforeClose 事件,并存储进行清理所需的信息。
【问题讨论】:
-
@Joe,也许你可以告诉人们 Excel 的确切版本?这可能会改变人们可以给你的答案。 :-)