Нужен конкатенирующий код VBA для предотвращения проблемы с памятью. - PullRequest
0 голосов
/ 07 декабря 2009

Мои настройки: Иметь 50000 строк данных. (В будущем мое количество строк увеличится. Поэтому можно сказать, что у меня есть полный рабочий лист из 64 000+ строк.) Все данные в текстовом формате, без формул и т. Д.

Колонка А открыта Столбцы от B до AC содержат данные, которые необходимо объединить Данные в строках после объединения со столбцом A будут содержать 60000 цифр или 6 КБ в размере файла. После дополнительной манипуляции каждая ячейка станет файлом.

Я попытался объединить в Excel и столкнулся с проблемами с памятью. Проблема с памятью возникает, когда я выбираю и заполняю объединяющую функцию на листе. Вылетает в строке 8200 +/-. Моя система имеет 2 ГБ оперативной памяти, Windows XP Professional и Excel 2003. 4 ГБ дискового пространства

Надеясь найти код VBA, который сохранит память, а не аварийно завершит работу, как в Excel.

Спасибо

1 Ответ

0 голосов
/ 07 декабря 2009

Несмотря на то, что это необычное использование для Excel, при условии, что каждая операция конкатенации требует памяти, просто освободите часть памяти перед тем, как закончится.

Не так уж и элегантно, хотя вы могли бы скопировать и вставить 2000 строк в себя в качестве значений. При желании также можно удалить A2: AC2002 (использованные данные, которые могут не понадобиться). Отключение автоматического расчета также может помочь.

С помощью Macro из устройства записи макросов просто запишите макрос, в котором вы делаете это [относительно расположено]. Начните с выбора формулы, которую вы сделали.

Очень сырой код:

Sub Macro5()

With Application
  .EnableEvents = False
  .ScreenUpdating = False
End With

Dim i As Long

For i = 0 To 32
    Selection.Copy
    ActiveCell.Offset(1, 0).Range("A1:A2000").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    ActiveCell.Offset(-1, 0).Range("A1:A2000").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    ActiveCell.Offset(2000, 0).Range("A1").Select
Next i

With Application
  .EnableEvents = True
  .ScreenUpdating = True
End With
End Sub
...