如何防止在大型文件上运行宏时excel崩溃?

时间:2018-12-04 13:20:40

标签: excel vba crash large-files

下午好,

我正在运行一个宏,该宏将数据复制到另一个工作簿并自动保存该工作簿。问题在于每一行都包含一张图片,这使它成为一个很大的文件,最大为30mb。因此,代码需要一段时间才能完成,并且当我尝试再次运行它时,Excel会完全冻结,因此我必须强制关闭它。当我复制较少的行时,它保持稳定。我想知道这是否是剪贴板问题,但事实并非如此。我怎么只能运行一次?是缓存问题还是什么?我已经在使用压缩图片和application.screenupdating&enablevents = false。

预先感谢

下面的代码导致冻结,基本上需要调整第6行之后的每张图片。

    For Each pic In Ws3.Pictures
pic.Select
 If Selection.TopLeftCell.Row > 6 Then
 With Selection
.Height = .TopLeftCell.RowHeight * 0.9
.Width = .Height * PicWtoHRatio
.Top = .TopLeftCell.Top + (.TopLeftCell.RowHeight - .Height) / 2
.Left = .TopLeftCell.Left + (.TopLeftCell.Width - .Width) / 2
End With
End If
Next pic
End Sub

每当我尝试复制粘贴> 100行时,该问题也会在代码的另一部分出现,excel似乎冻结了。我正在使用cutcopy = False。

3 个答案:

答案 0 :(得分:1)

如果使用循环,则可以在每次迭代的开始处添加DoEvents。它使Excel有时间处理用户事件,而不是冻结。

While condition
    DoEvents
    ...
Wend

答案 1 :(得分:1)

当我在一个文件中有20个数据透视表并引用其他20个文件并需要更新时,我遇到了类似的问题。我无法避免崩溃,因为excel达到1.3GB左右的内存使用量时将冻结。

  1. 如果您真的没有任何计算功能,请关闭自动计算功能

  2. 在循环中执行类似activeworkbook的操作。保存每次迭代。保存文件将有助于清除一些内存,但是由于您的文件为30MB,因此可能无法解决很多问题。

因此,您还需要执行以下操作:

  1. 使用一个单元格来跟踪上一次成功的迭代,这样,如果文件再次崩溃,您可以终止并从上一次成功的迭代重新开始。而且由于您已经在每个循环中保存了文件,所以您无需重新开始

但是,如果您的代码在每个循环中都达到极限(每次迭代都崩溃),那么我的答案也将无效,需要优化代码。

答案 2 :(得分:0)

您也可以禁用自动计算。

Application.Calculation = xlCalculationManual
...
...
...
Application.Calculation = xlCalculationAutomatic

这可能会有所帮助!

如果要处理大型Excel文件,则应该具有功能强大的硬件和软件。

64位版本的Excel与大型文件配合使用效果更好。