每次迭代后过程变得越来越慢

时间:2019-02-19 13:56:44

标签: excel vba

每次迭代后,过程变得越来越慢。

我试图打开保存在特定文件夹中的所有文件(作为临时文件),计算每个文件中三列的总和,将值分配给主工作表,然后关闭临时文件。

Sub Compute()

Dim File_Check As Date
Dim rcell As Range
Dim temp as Workbook

Set ws = ThisWorkbook.Sheets("DATA")

Application.ScreenUpdating = False

For dt = #6/5/2017# To now

' Name of the file is like data02052017.DAT
myFilenm = "D:\data" & Format(dt, "ddmmyyyy") & ".DAT"

If Dir(myFilenm) <> "" Then ' To exclude non-working days since data is not generated on those days
    ws.Range("A" & i).Value = myFilenm
    ws.Range("b" & i).Value = dt

    Set temp = Workbooks.Open(Filename:=myFilenm)
    Set ws2 = temp.ActiveSheet
    ws2.Range("A:A").Select


    ' replacing space from each cell in temp workbook
    Selection.Replace What:=" ", Replacement:="", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False


    ' text to column, seperating by comma
    Selection.TextToColumns Destination:=ActiveCell, DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
    Semicolon:=False, Comma:=True, Space:=False, Other:=False, OtherChar _
    :=":", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, _
    1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12 _
    , 1), Array(13, 1), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), _
    Array(19, 1), Array(20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array( _
    25, 1), Array(26, 1)), TrailingMinusNumbers:=True


    ' Some intendent Computions
    ws.Range("c" & i).Value = Application.WorksheetFunction.Sum(ws2.Range("P:P"))
    ws.Range("D" & i).Value = Application.WorksheetFunction.Sum(ws2.Range("Q:Q"))
    ws.Range("E" & i).Value = Application.WorksheetFunction.Sum(ws2.Range("W:W"))
    ws.Range("F" & i).Value = Format(Now, "HH:MM:SS")
    i = i + 1
    temp.Close SaveChanges:=False




End If


Next dt
Application.ScreenUpdating = True
End Sub

第一次迭代需要5秒钟,而第100次迭代需要25秒才能完成,最终每次迭代的处理时间为数分钟。我大约有500条记录,每条记录都有大约。相同的大小,所以我想了解为什么迭代时间呈指数增长,以及如何解决该问题。

1 个答案:

答案 0 :(得分:1)

Office在“内存管理”中是垃圾。或者,相反,它是“聪明”的,而不是按照所告知的去做。

在Excel和任务管理器中打开一个新工作簿,( Ctrl + Shift + Esc ),并观察Excel正在使用的内存。打开保存的文件,关闭文件。

Excel在打开文件时正在使用的内存会变高,在关闭文件时会处于关闭状态-但会恢复到打开文件之前的水平。这是因为Office将文件的“临时”版本存储在内存中,以便可以更快地重新打开它。

您可以通过将文件打开为只读(Set temp = Workbooks.Open(Filename:=myFilenm, ReadOnly:=True))来使“膨胀”稍微变小,但是我发现“重置”的唯一方法是完全重置关闭Excel,然后重新打开。

因此,通过文件100,您的Excel应用程序在内存中具有99个文档值的垃圾数据,使一切变慢。

(注:据我所知,此“功能”是在Office 2007中引入的,而在Office 2003中是完全不存在的)