нехватка памяти путем многократного экспорта таблиц с использованием VBA в 64-разрядной версии Excel - PullRequest
0 голосов
/ 30 августа 2018

Мне нужно экспортировать обработанные данные из мастер-файла в большое количество выходных файлов ".xlsx". В мастер-файле я запускаю код VBA, чтобы повторить следующее: 1). вставить новый лист. 2). поместите обработанные выходные данные в этот недавно вставленный лист. 3). переместите рабочий лист в новую рабочую книгу и сохраните эту рабочую книгу.

После того, как таким образом было экспортировано чуть более 2400 листов, Excel отображает сообщение об ошибке, в котором говорится, что «не хватает памяти для выполнения этого действия», и предлагается использовать 64-разрядную версию Excel.

Я перешел на 64-битный Excel. Такое же сообщение появилось после того, как было произведено более или менее одинаковое количество выходных файлов.

Поскольку 64-разрядное программное обеспечение позволяет значительно увеличить объем памяти, если 64-разрядная версия и 32-разрядная версия исчерпывают память в одной точке прогресса, мне кажется, что проблема могла быть вызвана не нормальной использование памяти.

Может быть, это вызвано чем-то вроде повторного вызова fopen () без вызова fclose () в C.

Скелет моего кода выглядит так:

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 листа?

1 Ответ

0 голосов
/ 30 августа 2018

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