![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Участник клуба
Регистрация: 28.06.2009
Сообщений: 1,950
|
![]()
Привет всем.
Мне нужно ускорить обработку текстовой строки, я сделал один вариант кода, но он долго работает, если строка около 200 кБ. Поэтому надо переделать код без использования Split, а использовать InStr и Mid, т.е. посимвольную обработку (что может помочь). Строка имеет вид: Код:
И так далее до разделителя между листами ":::". Если лист один, то такого разделителя не будет, соответственно. Код обрабатывает эту строку и помещает результат value в соотв. ячейку на листе, например для ячейки B2 на Листе1 будет значение value и т.п. для других ячеек. Сейчас у меня такой код: Код:
Последний раз редактировалось motorway; 06.04.2010 в 18:01. |
![]() |
![]() |
![]() |
#2 | |
Старожил
Регистрация: 05.12.2007
Сообщений: 4,180
|
![]() Цитата:
Ну, и по коду: с какой целью выполняется проверка If (Len(Z)) Then ? Что, 2 разделителя значений подряд, это возможный вариант? Также, можно убрать лишние присваивания значений переменным. Т.е., примерно так: Код:
Чем шире угол зрения, тем он тупее.
|
|
![]() |
![]() |
![]() |
#3 |
Участник клуба
Регистрация: 28.06.2009
Сообщений: 1,950
|
![]()
Насколько я помню, эту проверку я сделал, т.к. иногда возникали ошибки, если строка имела определенный вид (пустое значение или что-то подобное).
Пример строки прикрепил. Да, вот в случае исп. вашего кода выдает ошибку Subscript out of range - видимо, там остается пустая строка. Последний раз редактировалось motorway; 06.04.2010 в 20:19. Причина: добавка после тестирования кода |
![]() |
![]() |
![]() |
#4 | |
Старожил
Регистрация: 05.12.2007
Сообщений: 4,180
|
![]() Цитата:
Ваш код, практически, оптимален. Но, как я уже говорил, основное время макрос затрачивает на непосредственное обращение к ячейкам рабочего листа Excel. Поэтому, целесообразно лишний раз этого не делать. Тем более, что в исходной строке присутствует очень большое количество пустых значений. Существенно ускорить работу макроса можно, вставив такую проверку. Также, лучше запретить обновление экрана, т.к. при вставке данных на активный лист Excel будет отображать (прорисовывать) этот процесс. Попробуйте выполнить макрос с этими добавлениями. Сравните время выполнения. С Вашего позволения, добавил процедуру выбора txt-файла для обработки. Код:
Чем шире угол зрения, тем он тупее.
Последний раз редактировалось SAS888; 07.04.2010 в 05:29. |
|
![]() |
![]() |
![]() |
#5 |
Участник клуба
Регистрация: 28.06.2009
Сообщений: 1,950
|
![]()
Код скоро попробую. В данном случае строка была такой, но может быть и совершенно другой, где значений много, а пустых мало. Но в любом случае, если значение пустое, то его надо присвоить ячейке - там же может быть непустое.
Что-то мне кажется, что ускорить не получится просто так. Нужно менять сам принцип. Что-нибудь вроде вставки из csv файла. |
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 02.05.2009
Сообщений: 3,907
|
![]()
Я думаю уважаемый SAS888 не обидится за то,что я взял его макрос за основу,но добавил свою обработку данных.Работает практически мнговенно.Но справедлив по столбец Z включительно
Если диапазон больше,надо немного доработать получение адреса самого последнего столбца Код:
Анализ,обработка данных Недорого
|
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 05.12.2007
Сообщений: 4,180
|
![]()
О какой обиде Вы говорите? Мы делаем общее дело. Но...
1. Ваш вариант ограничен столбцом из 1-й буквы "A:Z" (оговорено). 2. Ваш вариант будет корректно работать только тогда, когда в строке для обработки адреса ячеек отсортированы по возрастанию? 3. При вставке значений массива на рабочий лист (обязательное условие - непрерывный диапазон), исходные значения в ячейках, адреса которых отсутствуют в текстовой строке будут утеряны. Всвязи с этим, вопросы автору темы: 1. Какой максимально возможный диапазон рабочего листа может быть использован (макс. № строки и столбца)? 2. Могут ли адреса ячеек в строке следовать не по порядку, либо не подряд? Например: "...Лист1~B2|11`M123|16`C2|22.. ." или "...Лист1~B2|11`E2|16`H2|22..." Т.е. есть ли какая-либо закономерность в очереди адресов ячеек текстовой строки для каждого листа? 3. Данные из текстовой строки вставляются на пустой лист? Т.е. можно ли очищать уже имеющиеся на листе значения ячеек, отсутствующих в текстовой строке?
Чем шире угол зрения, тем он тупее.
Последний раз редактировалось SAS888; 08.04.2010 в 06:57. |
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 14.02.2009
Сообщений: 753
|
![]()
Попадалось заметка, что значительная потеря времени идёт при обращении к Range. Уберите из процедуры так же и названия листов - тоже тормозят.
Бастрее, говорят, будет обращение: Лист1.Cells(5,2) |
![]() |
![]() |
![]() |
#9 |
Старожил
Регистрация: 02.05.2009
Сообщений: 3,907
|
![]()
ТО SAS888 Полностью с Вами согласен,
чтобы выработать оптимальный алгоритм, надо полностью знать условия и принцип организации обмена информацией.Программно всегда решить можно любую практически,задачу
Анализ,обработка данных Недорого
|
![]() |
![]() |
![]() |
#10 |
Форумчанин
Регистрация: 02.07.2009
Сообщений: 122
|
![]()
Да, спецы правы, в таком варианте все тормозит запись на лист!
Несколько изменил макрос - вначале формирую полный массив данных, потом уже запись его на лист, процесс разделил месиджами. Все хорошо видно (заодно и сбои с пустыми данными убрал) |
![]() |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
задачи: на двумерные массивы,обработку строк,обработку текстовых файлов. (Паскаль) | Yaro | Помощь студентам | 2 | 12.11.2009 12:55 |
Как ускорить попиксельную обработку изображения | Дамир | Общие вопросы .NET | 1 | 02.11.2009 12:40 |
Сравнение текста InStr() | SoFuWa | Microsoft Office Excel | 7 | 22.07.2009 14:38 |
Сравнение Instr(), Строчине и прописные буквы | SoFuWa | Microsoft Office Excel | 2 | 30.05.2009 16:20 |