VBA子程序在第一次执行后变慢了很多

我有一个子程序,生成5个家庭内不同投资组合的业绩报告。 问题在于所涉及的投资组合从来都不一样,每个家庭的投资额也不相同。 所以,我复制粘贴一个模板(这是格式化的…),并在报告中为每个投资组合添加合适的行(包含公式和…)。 一切工作正常,代码是不是最佳和完美的,当然,但它适用于我们所需要的。 问题不是代码本身,它是当我第一次执行代码时,它会非常快(如1秒)…但是从第二次,代码显着减慢(基本为30秒任务与第一个相同)。 我尝试了所有的手动计算,而不是刷新屏幕,…但它并不是问题的来源。 它看起来像是一个内存泄漏给我,但我找不到问题在哪里! 为什么代码运行速度非常快,但是后来呢太慢了……无论报告的长度和文件的内容如何,​​我都需要closuresexcel并重新打开每个报告。

**不知道我是否清楚,但这不是因为代码使Excel文件变大或什么,因为在第一个(快速)执行后,如果我保存工作簿,closures并重新打开它,(新)第一次执行将再次变得非常快,但是如果我能够在不closures和重新打开的情况下完成同样的动作,那将会非常缓慢…… ^!^

Dim Family As String Dim FamilyN As String Dim FamilyP As String Dim NumberOfFamily As Integer Dim i As Integer Dim zone As Integer Sheets("RapportTemplate").Cells.Copy Destination:=Sheets("Rapport").Cells Sheets("Rapport").Activate i = 3 NumberOfFamily = 0 FamilyP = Sheets("RawDataMV").Cells(i, 4) While (Sheets("RawDataMV").Cells(i, 3) <> "") And (i < 100) Family = Sheets("RawDataMV").Cells(i, 4) FamilyN = Sheets("RawDataMV").Cells(i + 1, 4) If (Sheets("RawDataMV").Cells(i, 3) <> "TOTAL") And _ (Sheets("RawDataMV").Cells(i, 2) <> "Total") Then If (Family <> FamilyP) Then NumberOfFamily = NumberOfFamily + 1 End If With Sheets("Rapport") .Rows(i + 8 + (NumberOfFamily * 3)).EntireRow.Insert .Rows(1).Copy Destination:=Sheets("Rapport").Rows(i + 8 + (NumberOfFamily * 3)) .Cells(i + 8 + (NumberOfFamily * 3), 6).Value = Sheets("RawDataMV").Cells(i, 2).Value .Cells(i + 8 + (NumberOfFamily * 3), 7).Value = Sheets("RawDataMV").Cells(i, 3).Value End With End If i = i + 1 FamilyP = Family Wend For i = 2 To 10 If Sheets("Controle").Cells(16, i).Value = "" Then Sheets("Rapport").Cells(1, i + 11).EntireColumn.Hidden = True Else Sheets("Rapport").Cells(1, i + 11).EntireColumn.Hidden = False End If Next i Sheets("Rapport").Cells(1, 1).EntireRow.Hidden = True 'Define printing area zone = Sheets("Rapport").Cells(4, 3).End(xlDown).Row Sheets("Rapport").PageSetup.PrintArea = "$D$4:$Y$" & zone Sheets("Rapport").Calculate Sheets("RANK").Calculate Sheets("SommaireGroupeMV").Calculate Sheets("SommaireGroupeAlpha").Calculate Application.CutCopyMode = False 

结束小组

我目前没有笔记本电脑,但是您可以尝试几件事情:

  1. 显式使用选项以确保在使用它们之前声明所有variables;
  2. 从我记得原生的vbatypes中为数字不是整数而是整数转换为long,为了节省计算时间而用long而不是整数;
  3. 你的Familyvariables被定义为string,但是你在其中存储完整的单元格,而不是它们的值,ie =cells()而不是=cells().value
  4. 拇指规则是使用cells(rows.count, 4).end(xlup).row而不是cells(3, 4).end(xldown).row. ;
  5. 条件格式化可能会使事情变得很慢;
  6. 如果可能,而不是while ,则使用范围上的每个循环,甚至将范围复制到variables数组并迭代(最快的解决scheme);
  7. 尽早使用早期绑定的绑定方式,即尽可能快地定义合适的对象;
  8. 不显示打印区域(分页符等);
  9. 尝试做一些打击和寻找瓶颈 – 查看excel vba瓶颈 ;
  10. 如果你不需要格式,只粘贴值;
  11. 每次复制/粘贴后清除剪贴板;
  12. 在完成使用后将对象设置为Nothing ;
  13. 使用Value2而不是Value – 这将忽略格式,只取数值而不是格式化值;
  14. 例如,使用表单对象并引用它们

    Dim sh_raw As Sheet,sh_rap As Sheet set sh_raw = Sheets(“RawDataMV”)set sh_rap = Sheets(“Rapport”)

然后到处使用sh_raw而不是Sheets("RawDataMV") ;

我有同样的问题。 我远离专家的程序员。 以上答案帮助我的程序,但没有解决问题。 我在一个5岁的膝上型计算机上运行Excel 2013。 打开程序而不运行它,进入文件>选项高级,向下滚动到数据,并取消选中“禁用撤消大数据透视表刷新….”和“禁止撤消大数据模型操作”。 你也可以尝试让他们检查,但降低他们的价值。 其中一个或两个似乎正在创造一个不断增加的文件,减慢macros观,最终磨碎停止。 我认为closuresexcel会清除它们创build的文件,这就是为什么当excelclosures并重新打开至less一段时间后它运行的很快。 有更多知识的人将不得不解释这些变化将会做什么以及取消这些变化的后果是什么。 看来这些更改将应用​​于您创build的任何新的电子表格。 如果我有一个更新的更强大的电脑,也许这些改变是没有必要的。

我有同样的问题,但我终于明白了。 这听起来很可笑,但它与打印页面设置有关。 显然,每次更新单元格时,Excel都会重新计算它,这就是导致放缓的原因。

尝试使用

 Sheets("Rapport").DisplayPageBreaks = False 

在例行的开始,在任何计算之前

 Sheets("Rapport").DisplayPageBreaks = True 

在它的结尾。