为什么我的Excel与VBA很慢?

时间:2018-01-13 04:18:11

标签: excel vba excel-vba

我知道这篇文章会引起很多仇恨和沮丧,但我不知道还有什么地方可以让别人知道为什么我的excel按照它的方式行事。如果有一个论坛,请告诉我,以便我将来不会发布“非正统”的帖子。

我的问题详情: 我创建了一个几乎完全自动化的工资单excel文件,其中包含在Worksheet deactivate事件上激活的公式和VBA代码。但是,我没有cell change events,但即便如此,如果我输入一个单元格,即使它没有公式或VBA脚本,我的excel也将进入处理模式并完全挂起我的PC 10-15分钟。当脚本激活时,它们有时可能会在接下来的10-15分钟内冻结我的PC,有时它会在几秒钟内完成。我不能alt + tab,我不能破坏脚本,我无法退出excel文件,而且我无法打开任务管理器。我不能在这里粘贴我的代码,因为它似乎不是代码问题而且它太长了。

我的代码中有70%位于Worksheets("DTR")对象中 我的代码中有20%位于Worksheets("Payroll Update")对象中 我的代码的10%位于Worksheets("DTR Summary")Worksheets("Payroll Summary")ThisWorkbook

有人可以评论这些代码吗?我没有要求崩溃文件的极其苛刻的脚本。我不明白为什么会这样。请参考下面的文件我真的很感激任何建议让事情运行得更快。

1 个答案:

答案 0 :(得分:2)

=SUMIFS(DTR!$AB$2:$AB$1048576,DTR!$C$2:$C$**1048576**,">="&$A6,DTR!$C$2:$C$1048576,"<="&$B6,DTR!$B$2:$B$1048576,'Payroll - Extra'!Q$1)
  1. 1048576太大了。你必须调整它的大小。
  2. 因为SUMIFS是一个数组公式,所以您只需要在单元格中输入值,而不是公式。
    • 对于数组公式,每次单元格值更改时,都会重新计算工作表中的所有公式,这会在消耗系统资源的同时降低系统速度。
  3. 3.使用变体数组更快。 test()是将结果一对一地分配给单元格,代码很慢。 这段代码在我的电脑上耗时5.33秒。

    Sub test()
        Dim i As Long, j As Long
        Dim s, e, t
        Cells.Clear
        s = Timer
        For i = 1 To 10000
            For j = 1 To 20
                Cells(i, j) = i
            Next j
        Next i
        e = Timer
        t = e - s
        Range("v1") = t
    End Sub
    

    以下代码(test2())使用数组变量,只需0.5秒。

    Sub test2()
        Dim i As Long, j As Long
        Dim vArray(1 To 10000, 1 To 20)
        Dim s, e, t
        Cells.Clear
        s = Timer
        For i = 1 To 10000
            For j = 1 To 20
                vArray(i, j) = i
            Next j
        Next i
        Range("a1").Resize(10000, 20) = vArray
        e = Timer
        t = e - s
        Range("v1") = t
    End Sub