多次使用 SaveAs 会冻结 Excel

Posted

技术标签:

【中文标题】多次使用 SaveAs 会冻结 Excel【英文标题】:Multiple uses of SaveAs freezes Excel 【发布时间】:2016-01-04 16:51:15 【问题描述】:

我正在处理一个包含多个 (100 多个) 客户端数据的大文件。

需求:

每月生成客户活动摘要。 必须采用 Excel 可操作格式。 必须是特定于客户的。无权访问他人的信息。

我的流程有效,但它挂起,可能需要 10 到 45 分钟。

故障排除后,我知道问题出在 SaveAs 方法上。注释掉所述行并仍然允许生成和关闭文件不会导致挂断。

For i = 1 to Number_of_clients

    'Data is sorted and placed in report tab (not shown)

    'Code ensures only report tab is saved with no access to other data
    ActiveSheet.Copy
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:=Filename
    ActiveWorkbook.Close
    Application.DisplayAlerts = True

Next i

我目前缓解此问题的尝试是暂停应用程序,以便后台进程可以做他们的事情。我在 SaveAs 行之后添加了以下代码。

Application.Wait (Now + Timevalue("0:00:05"))

【问题讨论】:

如果您尽可能直接引用工作簿/工作表并避免使用ActiveSheet property,您可能能够避免“拖延”循环。 ActiveWorkbook property 可能需要引用在将工作表复制到任何位置时创建的新工作簿。 【参考方案1】:

“...暂停应用程序,以便后台进程可以做他们的事情。”

你试过DoEvents吗?

这会将控制权交还给操作系统,并允许它在代码执行恢复之前完成任何未决事件。如果您处于锁定的循环中,您绝对应该使用它,以便您可以手动中断代码执行。


ActiveWorkbook.SaveAs Filename:=Filename
DoEvents
ActiveWorkbook.Close False

更多信息:DoEvents in VBA

【讨论】:

我欠你一杯啤酒。这正是需要的。没有冻结,没有挂起,运行平稳。 不用担心。如果通过勾选帖子左侧的绿色勾号有效,请不要忘记接受作为答案:)

以上是关于多次使用 SaveAs 会冻结 Excel的主要内容,如果未能解决你的问题,请参考以下文章

Kivy:为长功能加载动画(避免冻结)

在 Swift 中重写 CIImage 最终会导致处理器下降到 0% 并冻结

冻结的 Python 二进制文件会访问本地解释器和全局解释器锁(GIL)吗?

对冻结的 php 脚本进行故障排除

SaveAs 不提示保存

HomeScreen 重新启动后小部件冻结