Excel宏冻结Outlook

3

我有一个非常繁重的Excel宏,运行时会导致Outlook冻结。

我知道这并不是因为:
a)我有一台强大的多核机器
b)我所有其他程序(即使重型程序)都运行良好。

看起来Outlook和Excel共享Excel正在占用的进程。

我的宏与Outlook无关,至少不是有意的。它从Bloomberg获取数据并进行一些计算。


让我补充一下,我同时使用Bloomberg插件和xlwings,所以如果这两个插件/库存在已知问题,那么它们也可能会导致此问题。那么有人知道吗? - RAY
4个回答

3

我很欣赏这篇文章提到的内容,然而,我也曾经遇到过类似的问题,而我的代码中并没有任何与Outlook模型相关的引用。我还注意到,在另一个Excel实例中运行宏时,我的Excel会锁死。

为了解决这个问题,您需要添加一个

DOEVENTS

在您的代码中添加"line to your code",引用MSDN网站的话来说:

DoEvents将控制权传递给操作系统。在操作系统完成处理其队列中的事件后,将返回控制权。

放置DOEVENTS代码行的位置取决于您的代码,但在我比较繁重的宏中,我进行了多个SQL调用,在每个SQL调用之前加上了它,这似乎效果不错。这样我可以在一个Excel实例中愉快地工作,而后台实例则执行多个SQL数据提取操作。


2
当我将我的宏迁移到Office 2016时,我遇到了同样的问题。解决方法是取消选中"Microsoft Office 16.0 Object Library"库,该库在创建新的vba模块时默认包含。

1
请记住,对Outlook对象模型的所有调用都会被编组到Outlook的主线程中,因此,如果您的Excel宏正在使用Outlook对象模型,则Outlook可能会变得无响应。
扩展MAPI(C++或Delphi)可在多线程环境中使用。
你的宏是做什么的?请发布您代码的相关片段。

我在我的问题中添加了澄清,据我所知,我的宏根本不涉及Outlook。 - RAY

0

我有同样的问题。当我在一个工作簿中运行代码时,为了避免锁定其他Excel工作簿,我会将它们打开到新实例中。请注意,默认情况下,Excel现在会在同一实例中打开所有工作簿。对于我有VBA的工作簿和大型工作簿,我总是尝试在新实例中打开,以避免冻结和混淆VBA应该在哪里运行。如果已经打开了另一个实例,我会按住ALT键打开Excel,并验证我想要打开新实例。这对其他应用程序也适用。

然而,我不知道如何告诉Outlook在新实例中打开,因为它是唯一运行的Outlook实例。有时候,在Excel中运行代码时,Outlook会锁定,有时候不会(运行相同的代码)。我有些幸运的是,关闭Outlook并重新打开它,以便让它与我想运行长时间宏的Excel实例“分离”。


1
这只是描述问题,无法解决问题。 - NIMISHAN
我只能报告,对于我运行需要很长时间的Excel VBA(导致Outlook冻结)的问题,它似乎有效。就在今天,我打开了三个Excel实例和Outlook。我在其中一个Excel实例中运行了一些代码(需要超过10分钟才能运行完毕)。然后我去了Outlook,但它被锁定了。我随后进入任务管理器并结束了Outlook进程。重新打开Outlook(Excel宏仍在运行),我能够正常使用Outlook。 - diane gerencser

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