Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2015, 08:48   #1
27102014
Форумчанин
 
Регистрация: 27.10.2014
Сообщений: 248
По умолчанию Недостаток памяти

Доброго времени суток!
Столкнулся с проблемой при работе макроса - выходит ошибка "недостаточно оперативной памяти Excel". Пробовали запускать на трех ноутбуках - на двух подвисает, но все-таки работает (примерно 7 минут), на третьем, для которого написан макрос, и выходит эта ошибка. Установлен 10 офис, 32-разрядная версия, все лицензионное. Поискал в интернете - советуют поменять железо. Пробовал запустить макрос дома (комп мощный и 64-разрядная версия Excel), отчет формировался 20 минут.
Суть работы проблемной части макроса - имеется таблица с данными по ЗП сотрудников (4000 строк), эта таблица копируется и вставляется на 12 новых листов (12 филиалов) , далее с этих 12 листов удаляются лишние данные по другим филиалам.

Пробовал чистить буфер памяти - Application.CutCopyMode = False , не помогло

Возможно, кто-то уже сталкивался с такой проблемы и нашел решение, буду признателен за совет!
27102014 вне форума Ответить с цитированием
Старый 16.03.2015, 09:39   #2
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Цитата:
Сообщение от 27102014 Посмотреть сообщение
Суть работы проблемной части макроса - имеется таблица с данными по ЗП сотрудников (4000 строк), эта таблица копируется и вставляется на 12 новых листов (12 филиалов) , далее с этих 12 листов удаляются лишние данные по другим филиалам.
Возможно, следует для каждого листа копировать и вставлять только то, что нужно. Чтобы не удалять лишнее.
20 минут для 4000 строк - это ненормально, алгоритм нуждается в оптимизации. Почитайте например
http://www.planetaexcel.ru/forum/ind...ITLE_SEO=55705
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 16.03.2015, 10:00   #3
27102014
Форумчанин
 
Регистрация: 27.10.2014
Сообщений: 248
По умолчанию

Спасибо за ответ!
Буду пробовать оптимизировать - это уже 4 вариант макроса
27102014 вне форума Ответить с цитированием
Старый 16.03.2015, 10:53   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Вы бы выложили файл, - тогда и советы были бы более конкретные

PS: для обработки 4 тыс строк, обычно более чем достаточно 1-2 секунд.
(если макрос правильно написан)
EducatedFool вне форума Ответить с цитированием
Старый 16.03.2015, 11:09   #5
27102014
Форумчанин
 
Регистрация: 27.10.2014
Сообщений: 248
По умолчанию

Файл, к сожалению выложить не могу, т.к. он содержит конфеденциальную информацию. И вопрос был не по оптимизации кода VBA, а по настройкам Excel.
Вообще вроде бы решил вопрос копированием только нужной мне части листа
' копирование данных
lLastRow = Worksheets("Выгрузка").Cells(Rows.C ount, 1).End(xlUp).Row ' Счетчик номера последней строки
Sheets("Выгрузка").Select
Range(Cells(1, 1), Cells(lLastRow, 25)).Select
Selection.Copy
' вставка на листы
For i = 3 To ThisWorkbook.Sheets.Count 'номер последнего листа в книге
Sheets(i).Select
Range("A1").Select
ActiveSheet.Paste

Next
27102014 вне форума Ответить с цитированием
Старый 16.03.2015, 12:21   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
вопрос был не по оптимизации кода VBA, а по настройкам Excel
а причём тут настройки Excel ?

макрос тормозит по одной единственной причине, - он так написан
настройки Excel тут ни при чём
если нормально написать макрос (без использования слова Select, например), - макрос отработает за секунду, - и, разумеется, с нехваткой памяти никаких проблем не будет
(такому макросу надо очень мало памяти)

PS: проще переписать весь код «с нуля»
EducatedFool вне форума Ответить с цитированием
Старый 16.03.2015, 12:24   #7
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Осталось селекты убрать
Код:
With Worksheets("Выгрузка")
  lLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row ' Счетчик номера последней строки
  Set r = .Range(.Cells(1, 1), .Cells(lLastRow, 25))
End With
' вставка на листы
For i = 3 To ThisWorkbook.Sheets.Count 'номер последнего листа в книге
  r.Copy ThisWorkbook.Sheets(i).Range("A1")
Next
exceleved@yandex.ru Яндекс.Деньги: 410011500007619

Последний раз редактировалось Казанский; 16.03.2015 в 14:03. Причина: добавил точку перед Rows.Count
Казанский вне форума Ответить с цитированием
Старый 16.03.2015, 12:33   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

А Rows.Count то может быть как 65536, так и миллион, как повезёт... Что может дать ошибку.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 16.03.2015, 12:59   #9
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Rows.Count - это константа, которая хранится в модуле класса. В зависимости от версии Excel она различна, но ошибки не будет.
Чем шире угол зрения, тем он тупее.
SAS888 на форуме Ответить с цитированием
Старый 16.03.2015, 13:07   #10
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Я сейчас проверить не могу (но помню что проверял ранее), но думаю что эта константа берётся от активного файла (или листа с кодом), а обрабатывать в этот момент можно файл другой версии.
Т.е. если активный будет xlsx, а обрабатывается xls - будет ошибка. Если наоборот - можно "не заметить" что и в 70к строках есть данные.

В примере Казанского думаю будет ошибка, если код будет в модуле листа одной версии, а Worksheets("Выгрузка") будет другой версии. Конечно маловероятно, но возможно. Точки там не хватает.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найти ошибку ну или недостаток в программе Литвачок Visual C++ 0 07.11.2013 20:51
Видюха 6600gt и недостаток ее питания BlackOff_Max Компьютерное железо 11 27.02.2012 12:25
Недостаток в "Расчет средней оценки" roxy7 Microsoft Office Excel 3 12.12.2011 13:21
Кольцевая очередь на массиве в статической памяти с элементами в динамической памяти ]tach[ Общие вопросы C/C++ 1 19.01.2011 13:16
Недостаток информации Квэнди Свободное общение 1 03.04.2007 16:23