我有一个非常繁重的Excel宏,运行时会导致Outlook冻结。
我知道这并不是因为:
a)我有一台强大的多核机器
b)我所有其他程序(即使重型程序)都运行良好。
看起来Outlook和Excel共享Excel正在占用的进程。
我的宏与Outlook无关,至少不是有意的。它从Bloomberg获取数据并进行一些计算。
我很欣赏这篇文章提到的内容,然而,我也曾经遇到过类似的问题,而我的代码中并没有任何与Outlook模型相关的引用。我还注意到,在另一个Excel实例中运行宏时,我的Excel会锁死。
为了解决这个问题,您需要添加一个
DOEVENTS
在您的代码中添加"line to your code",引用MSDN网站的话来说:
DoEvents将控制权传递给操作系统。在操作系统完成处理其队列中的事件后,将返回控制权。
放置DOEVENTS代码行的位置取决于您的代码,但在我比较繁重的宏中,我进行了多个SQL调用,在每个SQL调用之前加上了它,这似乎效果不错。这样我可以在一个Excel实例中愉快地工作,而后台实例则执行多个SQL数据提取操作。
我有同样的问题。当我在一个工作簿中运行代码时,为了避免锁定其他Excel工作簿,我会将它们打开到新实例中。请注意,默认情况下,Excel现在会在同一实例中打开所有工作簿。对于我有VBA的工作簿和大型工作簿,我总是尝试在新实例中打开,以避免冻结和混淆VBA应该在哪里运行。如果已经打开了另一个实例,我会按住ALT键打开Excel,并验证我想要打开新实例。这对其他应用程序也适用。
然而,我不知道如何告诉Outlook在新实例中打开,因为它是唯一运行的Outlook实例。有时候,在Excel中运行代码时,Outlook会锁定,有时候不会(运行相同的代码)。我有些幸运的是,关闭Outlook并重新打开它,以便让它与我想运行长时间宏的Excel实例“分离”。