Workbooks.Open вызывает утечку памяти - PullRequest
3 голосов
/ 21 сентября 2019

В производственной 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

Обратите внимание, что папка

  1. содержит 3000 файлов Excel, поэтому цикл выполняется 3000 раз

  2. размер файла 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...