В производственной vba при открытии файла Excel в определенной папке в цикле я видел, как Excel пожирает память и, наконец, вызывает утечку памяти.Я написал короткие коды, чтобы выяснить его причину и столкнулся со следующими вопросами:
Question.1
В цикле он просто открывает и закрывает книгу, но использование памяти в Excel увеличивается.Кажется, что какой-то объект не выпущен, но я не понимаю (а) какой это и (б) в чем проблема этого кода.
Sub Test01()
Dim fso As FileSystemObject
Set fso = New FileSystemObject
Dim f As File
Dim wb As Workbook
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Dim Files As Variant
Set Files = fso.GetFolder("*****").Files
For Each f In Files
Set wb = Workbooks.Open(f.Path)
wb.Close savechanges:=False
Set wb = Nothing
Next
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Вопрос.2
Я обнаружил, что использование COM-объекта может быть решением.Действительно, он запускает другой процесс, и его использование памяти никогда не показывает странного увеличения, но я не понимаю его причины, потому что коды в цикле почти идентичны.Почему этот код не приводит к утечке памяти?
Sub Test02()
Dim fso As FileSystemObject
Set fso = New FileSystemObject
Dim f As File
Dim wb As Workbook
Dim oxl As Excel.Application
Set oxl = CreateObject("Excel.Application")
oxl.Visible = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Dim Files As Variant
Set Files = fso.GetFolder("*****").Files
For Each f In Files
Set wb = oxl.Workbooks.Open(f.Path)
wb.Close savechanges:=False
Set wb = Nothing
Next
oxl.Application.Quit
Set oxl = Nothing
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Обратите внимание, что папка
содержит 3000 файлов Excel, поэтому цикл выполняется 3000 раз
размер файла Excel составляет менее 15 КБ
Подробный ответ на @ braX
Я думаю, что вы ответили на вопрос 2 и намеревались подобный код.Я понимаю, что хранение oxl.Workbooks
повышает производительность по сравнению с вызовом oxl.Workbooks
каждый раз, но с точки зрения использования памяти это выглядит по-другому, потому что Workbooks
следует выпустить из цикла.
Dim wbs as Workbooks
Set wbs = oxl.Workbooks
Dim Files As Variant
Set Files = fso.GetFolder("*****").Files
For Each f In Files
Set wb = wbs.Open(f.Path)
wb.Close savechanges:=False
Set wb = Nothing
Next
Set wbs = Nothing
oxl.Application.Quit
Set oxl = Nothing