You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA创建大量工作簿未关闭致内存不足,求修改代码实现创建后关闭

解决VBA批量创建工作簿内存不足问题

现有VBA代码用于遍历源工作簿的所有工作表,在A1:O3区域查找单元格末尾括号内的单词,基于该单词创建新工作簿并将匹配的工作表复制到对应工作簿中。但当需要创建175个以上工作簿时,大量工作簿持续处于打开状态会耗尽RAM,导致内存不足。以下是修改后的代码,实现每个工作簿完成复制后立即保存并关闭,释放内存:

修改后的代码

Sub SaveSheetsToWorkbooks()
    Dim SourceWorkbook As Workbook
    Dim SourceWorksheet As Worksheet
    Dim SearchRange As Range
    Dim Cell As Range
    Dim TargetWorkbook As Workbook
    Dim regex As Object
    Dim match As Object
    Dim WordToPath As Object ' 存储单词对应的工作簿路径
    Dim TargetPath As String
    Dim BaseSavePath As String
    
    ' 设置源工作簿
    Set SourceWorkbook = ThisWorkbook
    ' 设置保存基础路径(根据实际情况修改)
    BaseSavePath = "C:\Users\JGuy\OneDrive - Redwood Living, Inc\Documents\Lender Reporting\Automation\Output Test\"
    
    ' 创建正则表达式对象,匹配单元格末尾括号内的单词
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = "\((\w+)\)$"
    
    ' 创建字典,存储单词对应的工作簿完整路径
    Set WordToPath = CreateObject("Scripting.Dictionary")
    
    ' 遍历源工作簿所有工作表
    For Each SourceWorksheet In SourceWorkbook.Sheets
        Dim FoundWords As Boolean
        FoundWords = False
        
        Set SearchRange = SourceWorksheet.Range("A1:O3")
        For Each Cell In SearchRange
            If regex.Test(Cell.Value) Then
                Set match = regex.Execute(Cell.Value)(0)
                Dim TargetWord As String
                TargetWord = match.SubMatches(0)
                FoundWords = True
                
                If WordToPath.Exists(TargetWord) Then
                    ' 已存在对应工作簿,打开它并复制工作表
                    TargetPath = WordToPath(TargetWord)
                    Set TargetWorkbook = Workbooks.Open(TargetPath)
                    SourceWorksheet.Copy After:=TargetWorkbook.Sheets(TargetWorkbook.Sheets.Count)
                Else
                    ' 创建新工作簿,复制当前工作表
                    Set TargetWorkbook = Workbooks.Add
                    SourceWorksheet.Copy Before:=TargetWorkbook.Sheets(1)
                    
                    ' 删除默认空白工作表
                    Application.DisplayAlerts = False
                    TargetWorkbook.Sheets(2).Delete
                    Application.DisplayAlerts = True
                    
                    ' 生成保存路径并保存
                    TargetPath = BaseSavePath & "NewWorkbook_" & TargetWord & ".xlsx"
                    TargetWorkbook.SaveAs TargetPath
                    ' 将路径存入字典
                    WordToPath.Add TargetWord, TargetPath
                End If
                
                ' 保存并关闭目标工作簿,释放内存
                TargetWorkbook.Save
                TargetWorkbook.Close SaveChanges:=False
                Set TargetWorkbook = Nothing
                
                ' 找到匹配后退出当前单元格循环
                Exit For
            End If
        Next Cell
        
        ' 未找到匹配时提示
        If Not FoundWords Then
            MsgBox "在工作表" & SourceWorksheet.Name & "的指定区域未找到目标单词", vbInformation
        End If
    Next SourceWorksheet
    
    ' 清理对象
    Set SourceWorksheet = Nothing
    Set SourceWorkbook = Nothing
    Set SearchRange = Nothing
    Set WordToPath = Nothing
    Set regex = Nothing
    Set match = Nothing
End Sub

关键改动说明

  • 字典存储逻辑调整:原代码字典存工作簿名称,改为存储工作簿的完整文件路径,方便后续需要追加工作表时直接定位打开
  • 即时关闭工作簿:无论是新建工作簿还是打开已有工作簿完成工作表复制后,立即保存并关闭,避免大量工作簿同时占用内存
  • 优化对象释放:每次操作完目标工作簿后,立即释放对象引用,进一步减少内存占用
  • 路径统一管理:将保存路径单独提取为变量,便于后续修改维护

内容的提问来源于stack exchange,提问作者jguy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 14:47:04