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

时间:2011-03-25 21:56:34

标签: excel events vba excel-2003

我有一个Workbook_Open事件宏(并且它在ThisWorkbook中)并不总是运行。

  • 如果Excel已关闭,我从Windows资源管理器中双击.xls文件,它会运行。
  • 如果我从开始/程序启动Excel(没有.xls文件),然后打开文件,它就会运行。
  • 如果我已经在Excel中打开文件,但随后关闭文件(保持Excel打开状态)并重新打开它,则宏不会运行。

我已将安全性设置为中等,并且只要它打开就会启用宏。

每当我打开宏时,我需要做什么才能让宏运行,而不仅仅是第一次进行此Excel会话?

(顺便说一句,这是Excel 2003)

11 个答案:

答案 0 :(得分:4)

我认为这是the most cogent article这个问题(这是一个长期以来从未解释过Excel展示的完全不稳定的错误。)(死链接)

简而言之,在许多情况下,这是一个时间问题,因为工作簿在打开时会尝试计算内容,这会妨碍Workbook_Open事件。在这种情况下测试它的方法是首先重命名由单元格调用的任何UDF或宏,以便它们不会被调用,看看它是否会发生任何变化。

答案 1 :(得分:2)

我遇到了同样的问题。

我在计算机上测试了一本没有任何问题的工作簿。在告诉我的客户之后,我被告知,有些组合盒子一直空着。这些通常是从workbook_open例程中填充的。 我尝试了不同的事情来启用workbook_open - 事件 - 但没有成功。

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

当我的工作簿从另一个文件打开时,我将首先尝试将计算设置为手动,然后手动运行workbook_open。这可以通过定义来完成

public sub workbook_open

而不是

private sub workbook_open

奇怪的是,excel不会自己计时......

答案 2 :(得分:2)

迟到的答案(总比没有好。)

我现在有几次这个问题(使用Excel 2010)。 始终有效的解决方案(到目前为止)是:删除条件格式,特别是如果它包含UDF作为条件。正如@LanceRoberts在上面的帖子中所写的那样,它最终归因于UDF计算和#34;覆盖" Open事件,但我发现如果在条件格式中使用它们会特别有害。

答案 3 :(得分:2)

我遇到了几乎相同的行为,发现这是由于条件格式规则错误导致的错误。事实证明,如果条件格式设置规则基于宏的任何设置,并且导致条件格式设置错误,则Workbook_Open宏甚至不会尝试运行。

要进行测试,请复制文件,并从工作簿中删除所有条件格式。保存并重新打开。如果它修复了您的问题,那么重新处理条件格式设置规则,以便不依赖于在Workbook_Open宏运行之前将被破坏的函数/值。

答案 4 :(得分:0)

一些建议:

  1. 尝试使用数字证书签署工作簿。将此证书添加到“受信任的证书”存储中,然后重试。
  2. 如果这是特定于计算机的,请尝试重新安装Office。
  3. 确保您已应用最新的服务包。

答案 5 :(得分:0)

我遇到了同样的问题,我使用安全设置来避免它。 我使用选项设置然后保密中心,然后“保密中心”(抱歉,但它的法语版本的翻译:-p) 然后“文件approuved”或类似的东西。 并添加包含excel工作簿的文件。 在此之后它的终结工作。

到处看,从未找到解决方案。

希望它能帮助某人

答案 6 :(得分:0)

有同样的问题,我想我有。我必须放置一个Workbook_BeforeClose私有子,保存工作簿,如果它不是只读的;和一个确保Application.EnableEvents = True的Workbook_BeforeSave。这似乎允许Workbook_Open触发。不是100%肯定为什么但似乎可重复,包括在一个空白的新工作簿中。

答案 7 :(得分:0)

当Application.EnableEvents设置为false关闭工作簿,然后在打开的excel的同一实例中打开另一个工作簿时,会发生这种情况。要避免这种情况,请确保所有禁用事件的进程在终止之前重新启用它们。特别注意程序中间的“结束”命令,错误处理程序和“退出子”句子。

答案 8 :(得分:0)

是什么原因导致您的其他存档(首先打开的存档)具有Workbook_Open程序; Excel不会再次执行它。

答案 9 :(得分:0)

这也发生在我身上,花了我几个小时才弄明白。

原来Excel中的 TODAY()功能导致了问题。 从我的工作表中删除后,一切都恢复了。很奇怪的bug。

答案 10 :(得分: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