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

时间:2019-01-04 00:29:45

标签: excel vba excel-vba

我有一个奇怪的现象。打开工作表时,我将创建当前工作簿的备份文件。这几乎没有延迟地发生。当我关闭文件时,将创建工作簿的另一个副本,并且几乎没有任何延迟。但是当保存主文件时,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时,我让它自己处理了所有保存操作。但是即使那样,保存文档还是非常缓慢的。为了更准确,excel似乎要等待很长时间才能开始保存文档。

工作簿及其副本通过1Gb网络存储在文件服务器上。网络不是问题,因为副本保存得非常快。只是保存的主文件(非常)缓慢。这可能是我的想象力,但是当我在工作簿上工作更长的时间时,它似乎甚至变得更慢。

甚至陌生人...我最近从Office 2007切换到Office 2016(= 365)。切换之前?没问题。

我无法理解。也许你们可以之一?

3 个答案:

答案 0 :(得分:0)

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

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

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

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

将“取消”设置为True不会停止事件在其轨迹中的运行,它只是使Excel在子例程完成后再次停止保存工作簿。如果您的目的是在没有任何更改(由SaveAsUI = True检测到)时不手动处理保存,那么也许应该在那一点退出子程序:

If SaveAsUI Then Exit Sub

子例程将在不调用save方法的情况下停止,但是工作簿仍将在子例程完成后保存,从而结束递归循环。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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