我有一个Workbook_Open事件宏(并且它在ThisWorkbook中)并不总是运行。
我已将安全性设置为中等,并且只要它打开就会启用宏。
每当我打开宏时,我需要做什么才能让宏运行,而不仅仅是第一次进行此Excel会话?
(顺便说一句,这是Excel 2003)
答案 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)
一些建议:
确保您已应用最新的服务包。
答案 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