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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2009, 21:14   #1
Lord-of-Hedgehogs
Пользователь
 
Аватар для Lord-of-Hedgehogs
 
Регистрация: 27.10.2009
Сообщений: 11
По умолчанию Проблема с низким быстродействием макроса.

Здравствуйте, товарищи.
Возник следующий вопрос, ответ на который, увы, не могу найти самостоятельно. Мной написан макрос, реализующий выбор необходимых значений из нескольких таблиц и запись этих значений в новую таблицу. Так как во входных таблицах нет единообразия ("кривые" они, короче говоря), максимальный диапазон, которым я могу оперировать - ячейка. А поскольку входные таблицы довольно большие (70000*100 ячеек), "поячеечная" вставка значений из одной таблицы в другую типа:
Код:
Workbooks(name1).worksheets(1).cells(i, j) = Workbooks(name2).worksheets(1).cells(m, k)
отнимает много времени.

Не подскажете, как можно ускорить передачу значений из одной ячейки в другю?

Последний раз редактировалось Lord-of-Hedgehogs; 27.10.2009 в 21:34.
Lord-of-Hedgehogs вне форума Ответить с цитированием
Старый 27.10.2009, 22:06   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

отключить обработку событий, автоматический пересчет формул и проросивку данных на экран. Не забудьте потом включить это все.
я для этого использую три переменных и две процедуры.

в результате все выглядит обычно так:
Код:
Dim apee as boolean, apsu as boolean, apcm as integer

Sub Main()
  ExlDead
  on error goto Live
...
тут тело макроса, который выполняет полезные действия.
...
Live:  exlLive
end sub

Sub ExlDead() 
  apee = Application.EnableEvents: Application.EnableEvents = False
  apcm = Application.Calculation: Application.Calculation = xlCalculationManual
  apsu = Application.ScreenUpdating: Application.ScreenUpdating = False
End Sub

Sub ExlLive() 
  Application.EnableEvents = apee
  Application.Calculation = apcm
  Application.ScreenUpdating = apsu
End Sub
on error goto Live - гарантирует, что даже если произошла исключительная ситуация, эксель продолжит работу в прежнем режиме.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 28.10.2009, 02:21   #3
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
"поячеечная" вставка значений из одной таблицы в другую отнимает много времени.
Есть несколько вариантов:

1) Скопировать лист с "кривой" таблицей, на копии листа выправить таблицу, и копировать данные уже с этого "исправленного" листа, причём не по одной ячейке, а блоками.

2) Заменить часть макроса формулами.
Пусть даже записать при помощи макроса в ячейки нужные формулы, а потом преобразовать формулы в значения.

3) (самый быстрый, но и наиболее трудоёмкий в плане кода, способ)
Считать диапазон 70000*100 ячеек в массив (одной строкой, типа arr=[a4:ab70000].value), поиск значений производить в массиве, программно сформировать новый массив, и записать этот массив на Workbooks(name1).worksheets(1)


Есть и другие способы оптимизации кода.
Не увидев код Вашего макроса полностью, сложно посоветовать что-то конкретное.
EducatedFool вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание макроса Ленусик777 Microsoft Office Excel 4 28.05.2010 14:49
Изменение макроса Vaniq Microsoft Office Excel 2 25.08.2009 13:45
Разблокировка макроса Deni55 Microsoft Office Excel 4 18.04.2009 17:58
Запуск макроса с параметрами из другого макроса Saladin Microsoft Office Excel 2 19.01.2009 09:43