我有一个包含多个宏的电子表格。通常,以前使用 Excel 2007 时,用户单击按钮,一切工作都按预期进行(计算、发送一些电子邮件和文件 I/O)。通常,预期运行时间约为 90 秒。电子表格是使用 Excel 2007 创建的 xlsm 文件。
然而,使用 Excel 2010,相同的用户进程会导致 Excel 无响应,并迫使我们从任务管理器中终止 Excel。
我在尝试调试此问题时收集了一些注释:
- 监控 CPU 使用率时,似乎 Excel 确实启动了宏。CPU 使用率按预期增加到大约 47%,持续了几秒钟。Excel.exe 的使用率随后降至 0%,现在我的 Excel 没有任何响应(即使过了 1 小时)。
- 如果我跨模块和不同函数设置调试断点并逐步执行代码(单击按钮后),则该过程将按预期进行,尽管速度要慢得多。此外,没有例外。
我完全不知道问题出在哪里。我最初以为可能是正在使用的插件,但第 2 点推翻了这一结论。
这似乎是一个非常奇怪的情况。如果需要,我可以提供更多信息,但我不知道根本原因是什么。我需要帮助来诊断和解决这个问题。
答案1
这可能不是您的答案,但这是我所见过的产生您所描述的结果的情况。
在宏中查找以下语句:
Application.ScreenUpdating = False
这会告诉 Excel GUI 界面不显示任何更改/更新/正在进行的任何内容。在宏运行时,这可能是理想的情况。但是,您必须确保宏在某个时候将其重新设置为 true,如下所示:
Application.ScreenUpdating = True
如果从未将其设置回 True,则会产生如您所描述的情况。
首先搜索正在设置的“ScreenUpdating”属性的代码,将其删除,然后查看是否能解决问题。
如果您在代码中的任何地方都找不到“ScreenUpdating”,那么您就遇到了其他问题。
编辑:看起来有人已经在上面的评论中提到了屏幕更新。
答案2
谢谢你的帮助。
我在开发和实时运行一个宏。我在开发中没有遇到任何问题,但在实时中它挂了。它在服务器上运行,而不是在本地 PC 上运行。我记得当我们第一次在实时中尝试它时,我们必须终止任务,它在随后的重试中挂了。我一添加行 application.screenupdating = TRUE doevents() doevents()
紧接在 application.screenupdating = FALSE 之前
宏已按预期发挥作用。
答案3
除了前面提到的答案之外,如果您的 Excel 表包含相当大量的数据,请尝试将其保存为 Excel 二进制工作簿 (*.xlsb)
二进制格式比 Excel 的标准 xml 格式快得多。希望您的宏也能运行得更快。