Excel不会在工作簿关闭时释放内存

时间:2014-11-24 18:42:29

标签: excel excel-vba memory-leaks vbscript excel-2013 vba

我有一个VBScript,可以逐个打开文件夹中的所有excel文件,并将特定范围复制到摘要文件中。摘要文件在整个操作过程中保持打开状态,但复制范围后其他文件将关闭。这意味着Excel应用程序始终保持打开状态。

问题是Windows即使在关闭并且内存使用率稳步攀升之后也会持有每个工作簿。我试图通过禁用所有加载项并删除personal.xlsb工作表来隔离问题。然后我手动打开了几个工作簿(没有涉及脚本)并逐个关闭它们。每次打开文件时内存使用量都会增加,但是当我开始关闭它们时没有减少。

我已经搜索了几个小时,我找到的唯一答案是退出并重新启动应用程序。这是一个可悲的解决方法(以及我的脚本的痛苦) - 必须有一种更好的方式来释放已关闭的工作簿内存。

我正在运行Excel 2013。

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("Shell.Application")

'Get summary folder location
Set StartFolder = objShell.BrowseForFolder(0, "Select the folder to summarize", 0, 5)
If StartFolder Is Nothing Then
    Wscript.Quit
End If
StartFolderName = StartFolder.self.path
Set SuperFolder = objFSO.GetFolder(StartFolderName)

'Open Excel
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = False

Set objWorkbook = objExcel.Workbooks.Add()
NewExcelName = StartFolderName & "\Summary.xlsx"
objWorkbook.SaveAs(NewExcelName)

Call ShowSubfolders (SuperFolder)

'------------------------------------------------------------------------------
'Save and quit
objWorkbook.Save
objExcel.Quit
Wscript.echo "Done"

'------------------------------------------------------------------------------

Sub ShowSubFolders(fFolder)
    Set objFolder = objFSO.GetFolder(fFolder.Path)
    Set colFiles = objFolder.Files
    For Each objFile in colFiles

        'Open document
        Set objxls = objExcel.Workbooks.Open(objFile.path)

        'Do stuff here

        'Close Document
        objxls.Close False

    Next

    For Each Subfolder in fFolder.SubFolders
        ShowSubFolders(Subfolder)
    Next
End Sub

1 个答案:

答案 0 :(得分:0)

尝试objxls.quit

Set objxls = Nothing只会破坏对象引用。 .quit方法会破坏对象本身。