3

我有这个相当重的 Excel 宏。当它运行 Outlook 冻结。

我知道它没有使用所有的 CPU 能力,因为
a)我有一台强大的多核机器
b)我所有的其他程序(甚至是重型程序)都运行良好。

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

我的宏不执行任何与 Outlook 相关的操作,至少在不知情的情况下如此。它从彭博社提取数据并进行一些计算。

4

4 回答 4

3

我很欣赏这匹马已经离开了畜栏……但是,我也经历过这种情况,并且在我的代码中没有对 Outlook 模型的引用。我还注意到我的 Excel 锁定,而另一个 Excel 实例中的宏正在运行。

要解决此问题,您需要添加一个

DOEVENTS

行到你的代码,引用 MSDN 网站

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

DOEVENTS 行的放置位置很大程度上取决于您的代码,但在我的一个相当繁重的宏中,我进行了许多 SQL 调用,我将它放置在每个 SQL 调用之前,这似乎运行良好。允许我在一个 Excel 实例中非常愉快地工作,而后台实例执行许多 SQL 提取。

于 2017-06-07T17:23:57.593 回答
2

将宏迁移到 Office 2016 时,我也发生了同样的事情。解决方案:取消选中库“Microsoft Office 16.0 Object Library”,创建新的 vba 模块时默认包含该库。

于 2018-04-24T09:20:27.067 回答
1

请记住,对 Outlook 对象模型的所有调用都被编组到 Outlook 的主线程,因此如果您的 Excel 宏正在使用 Outlook 对象模型,Outlook 可以并且将会变得无响应。

扩展 MAPI(C++ 或 Delphi)可用于多线程环境。

你的宏是做什么的?请发布您的代码的相关片段。

于 2015-08-06T13:22:02.027 回答
0

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

但是 - 我不知道如何告诉 Outlook 在新实例中打开,因为它是 Outlook 运行的唯一实例。有时,当我在 Excel 中运行代码时 Outlook 会锁定,有时则不会(运行相同的代码)。我在关闭 Outlook 并重新打开它以使其与我想在其中运行长时间运行的宏的 Excel 实例中“分离”时遇到了一些运气。

于 2020-05-27T13:37:52.030 回答