Excel工作簿打开事件宏不总是运行

8
我有一个Workbook_Open事件宏(在ThisWorkbook中),但它并不总是运行。
  • 如果Excel已关闭,并且我从Windows资源管理器双击.xls文件,则会运行。
  • 如果我从“开始/程序”中启动Excel(没有.xls文件),然后打开该文件,它会运行。
  • 如果我已经在Excel中打开了文件,但是关闭了该文件(保留Excel打开状态),然后重新打开它,则该宏不会运行。
我将安全级别设置为中等,并且每次打开文件时都启用宏。
我需要做什么才能使宏在每次打开文件时运行,而不仅仅是在本次Excel会话的第一次打开时运行?
(顺便说一下,这是Excel 2003)

我只能告诉你的是它在Excel 2010中确实可以工作 :( - Tiago Cardoso
你有 Workbook_BeforeClose 事件吗? - Lance Roberts
在第3种情况下打开工作簿后,是否会运行其他宏? - Lance Roberts
我已经在Excel 2003中对您描述的三种情况进行了快速测试,所有三种情况都运行了打开事件。因此,您的文件和/或安装肯定还有其他问题。请发布文件中任何其他代码和您可能拥有的任何其他安装(例如任何已安装的Excel插件)的详细信息。 - chris neilsen
Workbook_BeforeClose:不,我不需要。 - ScottSM
显示剩余2条评论
10个回答

4

我认为这是关于这个问题最有说服力的文章(这是Excel表格一直存在的、从未完全解释过的错误)。(链接失效)

简而言之,在许多情况下,这是一个时间问题,因为工作簿在打开时尝试计算内容,这会干扰Workbook_Open事件。要测试你的文件是否是这种情况,请先重命名由单元格调用的任何UDF或宏,以免被调用,并查看是否改变了任何内容。


也许将计算方式改为手动也无法解决问题吗? - Tiago Cardoso
我刚刚尝试添加了你提到的那篇文章中的代码,但似乎没有帮助。:-( 还有很多选项卡和大量代码...重命名所有东西很困难...你有什么建议从哪里开始吗? - ScottSM
哦,非常感谢您发布那篇文章的链接!很高兴知道我不是唯一一个遇到这个问题的人! - ScottSM
@ScottSM,我会尝试找到一种方法,在工作表打开时完全禁用计算,看看是否有帮助。我不确定如何在工作簿打开时做到这一点,但也许通过一些研究可以找到一种方法。您可以逐个复制选项卡到一个空白工作簿中,看看是否有任何特定的选项卡导致Workbook_Open事件无法触发。当然,由于工作表之间的相互关系,这并不总是那么容易。 - Lance Roberts

2

我遇到了同样的问题。

在我的电脑上测试了一个工作簿没有任何问题。分发给客户后,有人告诉我,一些组合框保持为空白。这些通常是从 workbook_open 程序中填充的。 我尝试了不同的方法来启用 workbook_open 事件 -但均未成功。

最终,我发现禁用所有用户定义函数 (UDF) 可以正确执行 workbook_open

由于我的工作簿是从另一个文件中打开的,因此我将首先将计算设置为手动,然后手动运行 workbook_open。可以通过定义它来实现。

public sub workbook_open

替代

private sub workbook_open

奇怪的是,Excel本身没有计时功能...

2
我考虑了一个类似链接的答案,提出了一个解决方案。在工作簿中使用一个私有布尔变量来确定是否触发了workbook_open事件。如果没有,则添加处理程序到workbook_activate和workbook_sheet_change,并在变量未设置的情况下重新运行workbook_open事件。 - DrMarbuse

2

晚来的回答(总比没有好)。

我现在已经遇到了这个问题几次(使用Excel 2010)。 迄今为止一直有效的解决方案是:删除条件格式,特别是如果它包含UDF作为条件。 正如@LanceRoberts在上面的帖子中写道,这最终是由于UDF计算“覆盖”了打开事件,但我发现如果在条件格式中使用它们,则尤其有害。


非常准确 - 移除在条件格式中使用的UDF解决了我的问题。 - assylias

2
我曾经遇到过几乎相同的问题,后来发现这是由于条件格式规则出错导致的bug。原来如果条件格式规则基于宏的任何设置,并且导致条件格式出错,则Workbook_Open宏甚至不会尝试运行。
为了测试,复制你的文件并删除工作簿中所有的条件格式。保存并重新打开。如果问题解决了,那么重新设计条件格式规则,不要依赖于在Workbook_Open宏运行之前就已经损坏的函数/值。

但是我需要我的条件格式。如何在文件加载完成之后再执行它的操作? - Bigtree
似乎没有办法做到那一点。同样,如果您编写的条件规则不依赖于那些宏依赖值(通常可以通过仔细思考问题来完成,但具体情况因案而异),则可以解决此问题。删除条件格式只是一个测试步骤,以确定创建问题的特定格式规则。 - Ira Burton

0
我遇到了同样的问题,我使用安全设置来避免它。 我使用选项设置,然后是机密中心,然后是“机密中心参数”(抱歉,这是法语版本的翻译 :-p),然后是“已批准的文件”或类似的东西。 然后将包含Excel工作簿的文件添加进去。 最终,它终于起作用了。
我到处寻找解决方案,但从未找到过这个解决方案。
希望能帮助到某些人。

0
这种情况发生在关闭工作簿时,应用程序的EnableEvents设置为false,并且在同一实例中打开另一个工作簿。为避免此问题,请确保在终止之前重新启用所有禁用事件的进程。特别注意“End”命令、错误处理程序和程序中间的“exit sub”语句。

0
一些建议:
  1. 尝试使用数字证书对工作簿进行签名。将此证书添加到受信任的证书存储中,然后再次尝试。
  2. 如果这是特定于机器的问题,请尝试重新安装 Office。

确保已应用最新的服务包。


0

这也发生在我身上,花了我几个小时才找出问题所在。

原来是 Excel 中的 TODAY() 函数导致了问题。一旦从我的工作表中删除,一切又恢复正常了。非常奇怪的错误。


0
造成这种情况的原因是,您打开的另一个档案中有一个 Workbook_Open 程序;Excel 不会再次执行它。

0

补充Arturo Llano的帖子:以下代码用于监视Workbook_Open事件,每次打开工作簿时运行ProcessX。

ProcessX包含一个End语句。结果是它只在第一次工作。End清除了AppX,因此不再监视事件。删除End解决了问题。(使用End是不好的做法,因为它会停止所有操作而没有任何清理或终止其他资源的方式)。

'代码位于:Personal.xlsb ThisWorkbook

Public WithEvents AppX As Application

Private Sub Workbook_Open()

   Set AppX = Application

End Sub

Private Sub AppX_WorkbookOpen(ByVal wb As Workbook)

  'A 1-second delay to allow opening to complete before ProcessX starts.

   Application.OnTime Now + TimeValue("00:00:01"), "ProcessX"

End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接