每次迭代后,过程变得越来越慢。
我试图打开保存在特定文件夹中的所有文件(作为临时文件),计算每个文件中三列的总和,将值分配给主工作表,然后关闭临时文件。
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条记录,每条记录都有大约。相同的大小,所以我想了解为什么迭代时间呈指数增长,以及如何解决该问题。
答案 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中是完全不存在的)