我有这个相当重的 Excel 宏。当它运行 Outlook 冻结。
我知道它没有使用所有的 CPU 能力,因为
a)我有一台强大的多核机器
b)我所有的其他程序(甚至是重型程序)都运行良好。
看起来 Outlook 和 Excel 正在共享一个 Excel 占用的进程。
我的宏不执行任何与 Outlook 相关的操作,至少在不知情的情况下如此。它从彭博社提取数据并进行一些计算。
我很欣赏这匹马已经离开了畜栏……但是,我也经历过这种情况,并且在我的代码中没有对 Outlook 模型的引用。我还注意到我的 Excel 锁定,而另一个 Excel 实例中的宏正在运行。
要解决此问题,您需要添加一个
DOEVENTS
行到你的代码,引用 MSDN 网站
DoEvents将控制权传递给操作系统。在操作系统完成处理其队列中的事件后返回控制权
DOEVENTS 行的放置位置很大程度上取决于您的代码,但在我的一个相当繁重的宏中,我进行了许多 SQL 调用,我将它放置在每个 SQL 调用之前,这似乎运行良好。允许我在一个 Excel 实例中非常愉快地工作,而后台实例执行许多 SQL 提取。
将宏迁移到 Office 2016 时,我也发生了同样的事情。解决方案:取消选中库“Microsoft Office 16.0 Object Library”,创建新的 vba 模块时默认包含该库。
请记住,对 Outlook 对象模型的所有调用都被编组到 Outlook 的主线程,因此如果您的 Excel 宏正在使用 Outlook 对象模型,Outlook 可以并且将会变得无响应。
扩展 MAPI(C++ 或 Delphi)可用于多线程环境。
你的宏是做什么的?请发布您的代码的相关片段。
我有同样的问题。当我在工作簿中运行代码时,我通过在新实例中打开它们来避免锁定其他 Excel 工作簿。请注意,默认情况下 Excel 现在会在同一实例中打开所有工作簿。对于我有 VBA 的工作簿和大型工作簿 - 我总是尝试在新实例中打开,以避免冻结和混淆 VBA 应该在哪里运行。我在打开 Excel 时按住 ALT 键(如果另一个实例已经打开)并验证我想打开一个新实例。这也适用于其他应用程序。
但是 - 我不知道如何告诉 Outlook 在新实例中打开,因为它是 Outlook 运行的唯一实例。有时,当我在 Excel 中运行代码时 Outlook 会锁定,有时则不会(运行相同的代码)。我在关闭 Outlook 并重新打开它以使其与我想在其中运行长时间运行的宏的 Excel 实例中“分离”时遇到了一些运气。