如何改善大型数据库循环的运行时间?

时间:2019-09-03 14:56:34

标签: vba

对于我数据库中的每个ID,我必须总结与它们链接的所有概念。例如,ID 2354具有3个概念,每个概念在不同的行上,我必须将这3个概念的总和加起来,然后将该总和粘贴到该概念的第一个数量最初所在的单元格上,然后消除整行第二和第三个概念。

我的宏已经做到了,但是运行时间非常长,而且我的数据库很大,大约有100,000行,我需要一种方法来改善运行时间。这是我的代码:

Sub Macro1()

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False

Dim t As Long
Dim a As Integer
Dim i As Integer

lastt = Cells(Rows.Count, "A").End(xlUp).Row  vacía
For i = 1 To 30
    If Cells(1, i).Text = "Report Legacy Key" Then
        For t = 2 To lastt 
            For a = 1 To 40
                primera = Cells(t, i).Value
                ultima = Cells(t + a, i).Value
                repetidas = Range(Cells(t, i + 1), Cells(t + a, i + 1))
                If primera = ultima Then
                    c = Application.WorksheetFunction.Sum(repetidas)
                    Cells(t, i + 1).Activate
                    ActiveCell.Value = c
                    Range(Cells(t + 1, "A"), Cells(t + a, "AB")).Select
                    Selection.Delete Shift:=xlUp
                End If


            Next a

            If IsEmpty(Cells(t + 1, "A").Value) = True Then
                Exit For
            End If
        Next t
    End If
Next i

Application.ScreenUpdating = True
Range("M1").Select

Application.CutCopyMode = False

End Sub

此代码允许在大约15秒内完成1000行的处理,这非常慢,因为它必须完成大约100,000行。

1 个答案:

答案 0 :(得分:-1)

您可以做一些事情来缩短执行时间:

  • 使用arrays甚至最好使用Scripting.Dictionary而不是使用单元。单独使用此选项将大大提高速度。
  • 有时我们倾向于直接在工作表上处理数据,但是许多基本操作可以直接在SQL中完成,例如求和。
  • 请尝试避免重复操作,例如选择Range,然后使用Selection。直接在Range上进行操作。

例如,您可以更改此:

Range(Cells(t + 1, "A"), Cells(t + a, "AB")).Select
Selection.Delete Shift:=xlUp

对此:

Range(Cells(t + 1, "A"), Cells(t + a, "AB")).Delete Shift:=xlUp

遵循这些建议应该可以大大加快速度。

希望这会有所帮助。