【问题标题】:Excel doesn't release memory on workbook closeExcel 不会在工作簿关闭时释放内存
【发布时间】:2014-11-24 18:42:29
【问题描述】:

我有一个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

【问题讨论】:

  • 关闭工作簿后是否释放对象?显示您的代码肯定会有所帮助:)
  • 我已经添加了代码。这似乎是脚本之外的问题,但我希望有办法用脚本解决它。
  • objxls.Close False in Sub ShowSubFolders(fFolder) 之后试试这个Set objxls = Nothing 现在试试吧
  • 已经试过了。没用。
  • 'Do stuff here 那里到底发生了什么?

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


【解决方案1】:

试试objxls.quit

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

【讨论】:

  • objxls 是一个工作簿,所以它没有 .Quit 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 2018-09-25
  • 2015-09-16
相关资源
最近更新 更多