процесс становится медленнее после каждой итерации - PullRequest
0 голосов
/ 19 февраля 2019

Процесс замедляется после каждой итерации.

Я пытаюсь открыть все файлы (как временные файлы), хранящиеся в определенной папке, вычислить сумму трех столбцов в каждом файле, присваивая значенияосновной лист, а затем закройте временный файл.

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

1-я итерация занимает 5 секунд, а 100-я итерация занимает 25 секунд, и в итоге время процесса уходит в минуты на итерацию.У меня есть около 500 записей, и каждая запись имеет ок.того же размера, поэтому я хотел понять, почему время итерации увеличивается в геометрической прогрессии и что можно сделать для решения проблемы.

1 Ответ

0 голосов
/ 19 февраля 2019

Офис - это чушь в управлении памятью.Или, скорее, он «умный», вместо того, чтобы делать то, что ему говорят.

Откройте новую книгу в Excel и диспетчере задач, ( Ctrl + Shift + Esc ) и наблюдайте за памятью, которую использует Excel.Откройте сохраненный файл, закройте файл.

Память, используемая Excel, увеличивается при открытии файла и уменьшается при закрытии файла - но не возвращается к уровню, на котором он находилсяпрежде чем открыть файл.Это связано с тем, что Office хранит «временную» версию файла в памяти, чтобы его можно было открыть быстрее.

Вы можете уменьшить размер этого «наворота» немного , открыв файлтолько для чтения (Set temp = Workbooks.Open(Filename:=myFilenm, ReadOnly:=True)), но единственный способ «перезагрузить», который я нашел, - это полностью закрыть Excel и снова открыть его.

Итак, к файлу 100 ваше приложение Excel имеет 99 документов на суммуненужных данных в памяти, замедляющих все.

(Примечание: эта «функция», насколько я могу судить, была введена в Office 2007 и полностью отсутствовала в Office 2003)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...