Excel 等待很长时间才能开始保存文档

Posted

技术标签:

【中文标题】Excel 等待很长时间才能开始保存文档【英文标题】:Excel waits a long time to start saving the document 【发布时间】:2019-01-04 00:29:44 【问题描述】:

打开工作表时,我几乎没有任何延迟地创建当前工作簿的备份文件。

当我关闭文件时,工作簿的另一个副本也几乎没有任何延迟地创建。

保存主文件时,Excel 会等待很长时间(有时需要几分钟)才能保存。

主文件不大,只有1.05Mb。我尝试了网上可用的加速解决方案。甚至尝试重新安装 Excel。

这是编码。

Private Sub Workbook_Open()
  ... ' perform some actions like setting NewName and ext
  ActiveWorkbook.SaveCopyAs (NewName & " (backup)." & ext)
  ....
End Sub

Private Sub Workbook_Deactivate()
  ... ' perform some actions like setting NewName and ext
  ActiveWorkbook.SaveCopyAs (NewName & " (backup)." & ext)
  ....
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
  If SaveAsUI Then Cancel = True 'Excel will close and handle saving itself.
  If ActiveWorkbook.Saved Then Cancel = True ' Cancel saving when no changes were made
  ...
  Application.EnableEvents = False
  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual
  Application.DisplayAlerts = False  ' Make sure no close message pops up from the application
  ActiveWorkbook.Save
  Application.DisplayAlerts = True
  ActiveWorkbook.Saved = True
  .... ' Processing stuff amongst with resetting ScreenUpdating, EnableEvents and Calculation 
  Cancel = True ' Or it will fire twice for some reason
End Sub

关闭 Excel 后,我让它自己处理所有保存。

工作簿和副本通过 1Gb 网络存储在文件服务器上。网络不是问题,因为副本保存得非常快。它是保存缓慢的主文件。当我使用工作簿的时间更长时,它似乎更慢。

我最近从 Office 2007 切换到 Office 2016 (=365)。切换之前没有问题。

【问题讨论】:

我感觉 Excel 365 在 VBA 上速度非常慢。我们最近还在工作中使用了 Office 365,一些过去需要一分钟才能完成的 VBA 代码使用相同的代码需要一个小时。我已经在某种程度上将它本地化为application.calculation,它被设置为自动然后它会很慢手动并在代码结束时切换到自动。 【参考方案1】:

每次保存当前工作簿时都会运行 Workbook_BeforeSave 事件。完成后,将保存工作簿,除非 Cancel 已设置为 True(在子例程中的任何位置)。设置 Cancel = True 会在子例程完成时停止保存工作簿。

问题是当您在 Workbook_BeforeSave 事件中调用Save 方法时,它会立即再次触发相同的事件,然后再次尝试保存工作簿,然后再次触发该事件。重复此过程,直到达到可以同时运行的嵌套子例程的数量限制。

SaveCopyAs 保存工作簿的副本,它不会触发 BeforeSave 事件,因此它只是快速保存工作簿的副本。

也许 2007 年不允许对 Workbook_BeforeSave 事件进行递归调用,或者嵌套子例程的数量限制较小。

将 Cancel 设置为 True 不会停止事件,它只是阻止 Excel 在子例程完成后再次保存工作簿。如果您的意图是在没有更改时不手动处理保存(由 SaveAsUI = True 检测到),那么也许您应该在此时退出子:

If SaveAsUI Then Exit Sub

然后子程序将停止而不调用 save 方法,但是当子程序完成时工作簿仍将被保存,从而结束递归循环。

【讨论】:

感谢清晰的解释,结果我看到我的例子不完整,所以我已经更正了。我已经将 EventsEnabled 设置为 False 以防止无限循环,但它没有显示在我的编码中。对不起。 是的,这有很大的不同。在单步执行代码时,您是否能够准确确定长时间停顿的位置? 是的。它实际上适用于保存命令。好像 excel 无法检测到服务器正在响应或类似的东西。它没有显示在编码示例中,但实际上我在保存命令之后显示了一个消息框。在 Cancel = True... 上,它实际上可以在没有 Exit Sub 的情况下完美运行。我已经尝试过在 If SaveUI Then Cancel = True 之后直接显示一个消息框。当我关闭 Excel 时,它从不显示。 如果您禁用所有事件并在更改后手动保存文件,它会快速保存吗? 只是在尝试。没什么区别。副本比主文件本身保存得更快。即使我让 Excel 自己完成所有工作。这就是为什么我无法弄清楚。即使我只是打开和关闭工作簿,副本的保存速度也比主文件快得多。【参考方案2】:

您可以在触发保存事件之前测试文件是否已经保存:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    If SaveAsUI Then Cancel = True 'Excel will close and handle saving itself.

    If ActiveWorkbook.Saved = False Then
        Application.DisplayAlerts = False
        Application.EnableEvents = False
        ActiveWorkbook.Save
        Application.DisplayAlerts = True
        Application.EnableEvents = True
        'Debug.Print "Fired"
    End If
End Sub

【讨论】:

我按照建议尝试了,但无济于事。此外,这不是问题。文件保存时,无论是否必须保存,都需要很长时间才能完成。 顺便说一句,我更改了我的示例编码以反映它。【参考方案3】:

经过大量测试,我得出这个结论:保存副本或主文件的区别在于,在保存主文件时,还会处理临时文件和现金(?)。这会在保存文件之前导致额外的延迟。这是我能找到的唯一原因,它解释了保存副本或主文件之间的行为差​​异。

【讨论】:

以上是关于Excel 等待很长时间才能开始保存文档的主要内容,如果未能解决你的问题,请参考以下文章

应用内购买“等待审核”很长时间[关闭]

Android Chrome:音频对象需要很长时间才能开始流式传输 mp3

查询需要很长时间才能执行 laravel

如何阻止用户等待很长时间才能获得位置修复?

为啥添加单个实体后我的核心数据需要很长时间才能保存?

Selenium等待下载?