0

我有一个子程序,可以生成 5 个家庭中不同投资组合的业绩报告。问题是,有问题的投资组合从来都不相同,每个家庭的金额也不相同。因此,我复制粘贴一个模板(即格式化和...),并将格式化行(包含公式和...)添加到报告中每个投资组合的正确系列中。一切正常,代码当然不是最佳和完美的,但它可以很好地满足我们的需要。问题不在于代码本身,而是当我第一次执行代码时,它运行得非常快(比如 1 秒)......但是从第二次开始,代码速度显着变慢(基本的 30 秒任务与第一个相同)。我尝试了所有手动计算,没有刷新屏幕......但这确实不是问题所在。对我来说,这看起来像是内存泄漏,但我找不到问题出在哪里!为什么代码运行得非常快,但之后却慢得多……无论报告的长度和文件的内容如何,​​我都需要关闭 excel 并为每个报告重新打开它。

**不确定我是否清楚,但这不是因为代码使excel文件变大或什么,因为在第一次(快速)执行后,如果我保存工作簿,关闭并重新打开它,(新)第一次执行会再次非常快,但如果我会在不关闭和重新打开的情况下做同样的 excat 事情,那将会非常慢......^!^!

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

结束子

4

3 回答 3

3

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

  1. 使用选项显式确保在使用它们之前声明所有变量;
  2. 据我所知,数字的原生 vba 类型不是整数而是long,整数被转换为 long ,以节省计算时间,使用 long 而不是整数;
  3. 您的 Family 变量被定义为字符串,但您将整个单元格而不是它们的值存储在其中,=cells()而不是=cells().value;
  4. 一个经验法则是使用cells(rows.count, 4).end(xlup).row 而不是cells(3, 4).end(xldown).row.
  5. 条件格式可能会减慢很多速度;
  6. 如果可能的话,使用for 范围内的每个循环而不是while,甚至将范围复制到变量数组并对其进行迭代(这是最快的解决方案);
  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")到处使用;

于 2014-05-24T20:20:15.257 回答
1

我有同样的问题,但我终于想通了。这听起来很荒谬,但它与打印页面设置有关。显然,每次更新单元格时 Excel 都会重新计算它,这就是导致速度变慢的原因。

尝试使用

Sheets("Rapport").DisplayPageBreaks = False

在您的例行程序开始时,在任何计算和

Sheets("Rapport").DisplayPageBreaks = True

最后。

于 2016-09-12T19:45:39.133 回答
0

我有同样的问题。我远非专家级程序员。以上答案对我的程序有所帮​​助,但没有解决问题。我在 5 岁的笔记本电脑上运行 excel 2013。打开程序而不运行它,转到文件>选项高级,向下滚动到数据并取消选中“禁用撤消大型数据透视表刷新......”和“禁用撤消大型数据模型操作”。您也可以尝试让它们处于选中状态,但降低它们的价值。其中一个或两个似乎正在创建一个不断增加的文件,该文件会减慢宏并最终使其停止。我假设关闭 excel 会清除他们创建的文件,这就是为什么当 excel 关闭并重新打开至少一段时间时它运行速度快的原因。有更多知识的人将不得不解释这些更改将做什么以及取消选中它们的后果是什么。这些更改似乎将应用于您创建的任何新电子表格。如果我有一台更新更强大的计算机,也许这些更改就没有必要了。

于 2016-03-14T15:49:31.853 回答