![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 03.05.2012
Сообщений: 10
|
![]()
Добрый день. Искал на разных форумах, но не нашел (либо не понял, что это оно).
Требуется большой объем данных записать в двухмерных массив, поработать с ним, и результат выгрузить на другой лист. Сейчас делаю в лоб - обращаясь к каждой ячейке через Cells либо Range. И если скорость чтения из ячеек и запись в массив проходит достаточно быстро, то вот запись из массива в ячейки - недопустимо долго. Application.ScreenUpdating отключаю. Какие есть быстрые способы копирования? Самый маленький блок данных - 1500 строк на 15 столбцов, максимальный - в пределах 220 тыс. строк. Код:
|
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,170
|
![]()
быстрее
Код:
Код:
webmoney: E265281470651 Z422237915069 R418926282008
Последний раз редактировалось Hugo121; 03.05.2012 в 10:32. |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 03.05.2012
Сообщений: 10
|
![]()
Спасибо большое. Одно уточнение - возможно из приведенного дин. массива записать только определенный столбец? Например, в Range("B1:B1500") записать, столбец 5 массива f?
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,170
|
![]()
Первый (или сколько нужно с начала) можно, отрубив лишнее с помощью Resize (указать, сколько столбцов выгружаете).
Ну а если нужно только пятый - так делайте из пятого отдельный параллельный массив, его и выгружайте. ну или перебором переложите нужные данные в другой созданный массив размером на один столбец, его и выгружайте - не бойтесь, в массивах перебор быстрый.
webmoney: E265281470651 Z422237915069 R418926282008
|
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 03.05.2012
Сообщений: 10
|
![]()
Спасибо, про отдельный массив была мысль, но связываться с дополнительными массивами без нужды не хотелось.
Разрешите последний вопрос, правда не по массивам. Из примерно десятка разных макросов, что пользуюсь в данный момент, только у одного есть проблема повторного запуска - с каждым запуском все медленнее и медленнее работает. После 5-6 запуска скорость падает с 5-6 сек. до двух-трех минут. Erase для массивов стоит (хотя массивы не слишком большие). По диспетчеру задач память не забивается. Существует какая-нибудь функция полной очистки памяти по завершению макроса? |
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,170
|
![]()
По окончании кода переменные должны умирать, если они не публичные. Спецкоманды я не знаю (erase или set объект=nothing это само собой, можно ещё текстовые переменные очищать s = Empty).
Посмотрите - в том коде не используются публичные переменные? Что в переменных накапливается, если код прогонять пошагово? Может быть там нарастает диапазон, а он перебирается в union, часто добавляя части диапазона? (union с каждым шагом заполняется всё медленнее и медленнее).
webmoney: E265281470651 Z422237915069 R418926282008
|
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 03.05.2012
Сообщений: 10
|
![]()
Из публичных только имена листов книг Dim NameSheets(10) As String
Range на накапливается нигде. Прогонял с включенным автообновлением - тормозит на участке кода удаления строк: Код:
|
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,170
|
![]()
Может быть пишется история изменений файла - а там при удалении строк ещё и куча формул может быть корректируется.
И я бы удалял циклом снизу вверх. Но вообще нужно видеть пример в файле - кажется, тут можно сделать быстро на словаре и массиве. Зачем вообще УДАЛЯТЬ строки?
webmoney: E265281470651 Z422237915069 R418926282008
|
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 03.05.2012
Сообщений: 10
|
![]()
Про словарь - тут на форуме видел темы про него, но пока не разбирался, что это такое и как работает. Формул на листе нет вообще. История изменений - вполне возможно, не сталкивался раньше.
На массиве точно можно сделать. Просто сам факт замедления работы подозрителен. Заинтересовал прямо. А почему удаление строк - в далеком 2009 я не придумал ничего более простого в написании кода, чем приплюсовывать строки одна к другой и удалять их. А нет ничего постоянней временного ![]() Спасибо за помощь, не смею больше надоедать. |
![]() |
![]() |
![]() |
#10 | |
Старожил
Регистрация: 05.12.2007
Сообщений: 4,180
|
![]() Цитата:
Код:
Чем шире угол зрения, тем он тупее.
|
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Запись в Excel даты из набора данных | VHomer | БД в Delphi | 1 | 06.03.2012 13:44 |
Delphi + Excel, запись данных в ось Х chart-та | funball | БД в Delphi | 0 | 11.01.2011 10:16 |
Запись в массив данных бинарного дерева | m9yt | Общие вопросы C/C++ | 2 | 14.03.2010 12:49 |
Запись массива данных из Excel в файл txt | Maxx | Microsoft Office Excel | 5 | 11.12.2009 14:00 |
Запись в Excel данных таблицы Word | Диагностик | Microsoft Office Excel | 7 | 02.04.2009 20:55 |