![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Участник клуба
Регистрация: 28.06.2009
Сообщений: 1,950
|
![]()
Это еще сейчас так получилось - раньше без оптимизации макросы некоторые работали от 20 секунд до 5 минут
![]() В основном, здесь из-за большого количества данных/операций (хотя ~20000 ячеек - еще не так много). Просто некоторые вещи относительно медленные - обращения к каждой ячейке и т.п. |
![]() |
![]() |
![]() |
#12 | |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
![]() Цитата:
1) Считываем ВСЕ данные с листа в массив 2) Работаем только с массивом исключительно средствами VBA (не затрагивая средства excel - чтобы никаких application, worksheets, cells, worksheetfunctions, и т.д. в коде не было) 3) Заносим данные из массива обратно на лист. Избавьтесь от всякого форматирования ячеек в коде (цвета, форматы, размеры) - по большому счёту, все эти украшательства нафиг не нужны. И будет ваш макрос выполняться за 1 секунду. PS: Кстати, очень сильно тормозит конкатенация длинных текстовых строк в VBA - чем длинее строка, тем больше тормозов. Если в вашем коде попадаются текстовые переменные, в которые записываются строки длиной в несколько десятков тысяч символов (и длиннее) - обратите на это особое внимание. Я тут как-то программно (в VBA) формировал файлы CSV - сначала формировал текстовую строку длиной около 500.000 символов, а потом записывал эту строку в файл .csv. Так вот пришлось немало помучиться, чтобы ускорить макрос - как только я перестал собирать все 500000 символов в цикле в одну текстовую переменную, скорость значительно увеличилась (с 30 секунд до 6 секунд) |
|
![]() |
![]() |
![]() |
#13 |
Участник клуба
Регистрация: 28.06.2009
Сообщений: 1,950
|
![]()
Да, конкатенацию у меня уже получилось ускорить. Но вот форматы - с ними проблема. Нужно делать, чтобы текст вида [10.11111,11.11111], к примеру, превращался в [10.1,11.1] для отображения, а исходное значение оставалось. Обычными средствами это не решишь. Поэтому приходится юзать свойство ID, куда и записывать данные. Но оно тоже не супербыстрое.
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Макрос обработки данных для Excel 2007 | Python | Фриланс | 1 | 16.02.2010 20:47 |
Не вставить рисунок в Word 2007-2010 | Tongo | Microsoft Office Word | 0 | 05.01.2010 20:24 |
Да тестостерона в 3 раза больше чем норма | HellMercenariess | Свободное общение | 3 | 25.08.2009 22:52 |