通过在64位Excel中使用VBA重复导出工作表来耗尽内存

问题描述 投票:-1回答:1

我需要将处理过的数据从主文件导出到大量的“.xlsx”输出文件中。在主文件中,我运行VBA代码重复以下操作:1)。插入新工作表。 2)。将处理后的输出数据放入新插入的工作表中。 3)。将工作表移动到新工作簿并保存该工作簿。

在以这种方式导出2400多个工作表之后,Excel会显示一条错误消息,提到“没有足够的内存来完成此操作”,并建议使用64位Excel。

我改为64位Excel。在生成或多或少相同数量的输出文件之后出现相同的消息。

由于64位软件允许更大的内存空间,如果64位版本和32位版本在同一进度点耗尽内存,在我看来问题可能不是由正常的内存使用造成的。

可能是因为重复调用fopen()而不调用C中的fclose()。

我的代码的骨架就像:

Cur_Path = ActiveWorkbook.Path    
Application.ScreenUpdating = False             
For r = 12 To 4653   

      ' Add Blank sheet
      Set ws = Sheets.Add(After:=Sheets(Sheets.Count))          

      ' Export Sheet
      Export_fname = Cur_Path & "\" & ws.Name & ".xlsx"
      ws.Move
      ActiveWorkbook.SaveAs Filename:=Export_fname, FileFormat _
          :=xlOpenXMLWorkbook, CreateBackup:=False
      ActiveWindow.Close

Next r    
Application.ScreenUpdating = True

调试器显示运行“ws.Move”行时出现问题。

有谁请让我知道我的代码有什么问题,或建议一个解决方案来解决(看似)2433工作表限制?

excel vba memory
1个回答
0
投票

这可能更好 - 每个工作簿只有1张,没有一个存储在原书中。 您还没有说过如何将处理后的数据放在工作表上,所以我只是用数据填充了一些单元格。

Sub Test1()

    Dim Cur_Path As String
    Dim r As Long
    Dim wrkBk As Workbook
    Dim wrkSht As Worksheet

    Cur_Path = ThisWorkbook.Path

    For r = 12 To 4653
        Set wrkBk = Workbooks.Add(xlWBATWorksheet) 'Create workbook with 1 sheet.
        Set wrkSht = wrkBk.Worksheets(1) 'Set reference to worksheet.
        With wrkSht
            .Name = wrkSht.Name & " - " & r 'Ensure a unique name.
            'Populate the sheet with some data.
            .Range("A1") = wrkSht.Name
            .Range("B1:D1") = Array(ThisWorkbook.Name, wrkBk.Name, Cur_Path)
        End With
        wrkBk.SaveAs Filename:=Cur_Path & "\" & wrkSht.Name & ".xlsx", _
                     FileFormat:=xlOpenXMLWorkbook
        wrkBk.Close
    Next r

End Sub
© www.soinside.com 2019 - 2024. All rights reserved.