Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Ускорение работы макроса по вырезанию строк с листа на лист - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Ускорение работы макроса по вырезанию строк с листа на лист
Artem2292 Дата: Суббота, 31.10.2020, 21:52 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 34
Репутация: 0 ±
Замечаний: 0% ±

2010, 2019, 365
Всем привет!
Нужна Ваша помощь или совет. В работе использую макрос, который по условию определенного столбца вырезает строки с одного листа и вставляет их на другой. Понятно, что макрос далеко не идеальный, но вопрос заключается в том, что если выбрать одну-две, ну или 3 строки, то макрос работает относительно быстро, но если же взять большее количество строк, то макрос работает уж очень долго.. эксель даже подвисает... и выполнение макроса может занимать до 20-30 сек, а то и более. Можно ли как-нибудь ускорить работу? %)
ps лист, с которого вырезаю строки имеет большое кол-во формул и условного форматирования.. может быть с этим связана долгая работа?

Заранее спасибо.



Сообщение отредактировал Artem2292 - Суббота, 31.10.2020, 23:09
 
Ответить
СообщениеВсем привет!
Нужна Ваша помощь или совет. В работе использую макрос, который по условию определенного столбца вырезает строки с одного листа и вставляет их на другой. Понятно, что макрос далеко не идеальный, но вопрос заключается в том, что если выбрать одну-две, ну или 3 строки, то макрос работает относительно быстро, но если же взять большее количество строк, то макрос работает уж очень долго.. эксель даже подвисает... и выполнение макроса может занимать до 20-30 сек, а то и более. Можно ли как-нибудь ускорить работу? %)
ps лист, с которого вырезаю строки имеет большое кол-во формул и условного форматирования.. может быть с этим связана долгая работа?

Заранее спасибо.


Автор - Artem2292
Дата добавления - 31.10.2020 в 21:52
Hugo Дата: Суббота, 31.10.2020, 23:11 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
1. Нужно бы видеть пример кода в файле.
Потому что сейчас я вижу потенциальную ошибку, вернее вот тут ошибка:
[vba]
Код
Sheets(1).Range(Cells(i, 1), Cells(i, 31)).Copy
[/vba]
Или лишнее, судя по остальным строкам кода.
2. Если нужны только значения, то быстрее это делать через массив, не копируя сами строки.
3. Ну а удаление строк можно сделать позже, сразу всех одним действием. Думаю основные тормоза на этом.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
Сообщение1. Нужно бы видеть пример кода в файле.
Потому что сейчас я вижу потенциальную ошибку, вернее вот тут ошибка:
[vba]
Код
Sheets(1).Range(Cells(i, 1), Cells(i, 31)).Copy
[/vba]
Или лишнее, судя по остальным строкам кода.
2. Если нужны только значения, то быстрее это делать через массив, не копируя сами строки.
3. Ну а удаление строк можно сделать позже, сразу всех одним действием. Думаю основные тормоза на этом.

Автор - Hugo
Дата добавления - 31.10.2020 в 23:11
Artem2292 Дата: Воскресенье, 01.11.2020, 00:49 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 34
Репутация: 0 ±
Замечаний: 0% ±

2010, 2019, 365
1. Нужно бы видеть пример кода в файле.
Потому что сейчас я вижу потенциальную ошибку, вернее вот тут ошибка:

сделал максимально приближенный к рабочему файлу кусок.

Суть в том, что в рабочей таблице более 800 заполненных строк и ежедневно в столбце АЕ руками (из предложенного списка) проставляем статус "Не действует". Таких статусов может быть как 1, так и 20, 30, 100 и все они в разных местах таблицы, т.е. в середине, снизу и вверху, что в принципе логично yes Далее по кнопке выполняем макрос и тут начинаются проблемы.. чем больше строк со статусом "не действует", тем дольше отрабатывает макрос

Как и говорил, в основной таблице полно формул, условного форматирования и тд, но при вырезании оно не нужно, нужны только значения. Все ломаю голову и не понимаю, как ускорить процесс выполнения макроса.. :(


Сообщение отредактировал Artem2292 - Воскресенье, 01.11.2020, 23:01
 
Ответить
Сообщение
1. Нужно бы видеть пример кода в файле.
Потому что сейчас я вижу потенциальную ошибку, вернее вот тут ошибка:

сделал максимально приближенный к рабочему файлу кусок.

Суть в том, что в рабочей таблице более 800 заполненных строк и ежедневно в столбце АЕ руками (из предложенного списка) проставляем статус "Не действует". Таких статусов может быть как 1, так и 20, 30, 100 и все они в разных местах таблицы, т.е. в середине, снизу и вверху, что в принципе логично yes Далее по кнопке выполняем макрос и тут начинаются проблемы.. чем больше строк со статусом "не действует", тем дольше отрабатывает макрос

Как и говорил, в основной таблице полно формул, условного форматирования и тд, но при вырезании оно не нужно, нужны только значения. Все ломаю голову и не понимаю, как ускорить процесс выполнения макроса.. :(

Автор - Artem2292
Дата добавления - 01.11.2020 в 00:49
anvg Дата: Воскресенье, 01.11.2020, 09:40 | Сообщение № 4
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Доброе время суток.
Сделайте сортировку по столбцу "Статус". Тогда "не действует" будет последовательной группой строк. Общим блоком копируете на нужный лист, а затем удаляете. Восстанавливаете исходное состояние по столбцу "№". Будет быстро.
 
Ответить
СообщениеДоброе время суток.
Сделайте сортировку по столбцу "Статус". Тогда "не действует" будет последовательной группой строк. Общим блоком копируете на нужный лист, а затем удаляете. Восстанавливаете исходное состояние по столбцу "№". Будет быстро.

Автор - anvg
Дата добавления - 01.11.2020 в 09:40
Artem2292 Дата: Воскресенье, 01.11.2020, 13:38 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 34
Репутация: 0 ±
Замечаний: 0% ±

2010, 2019, 365
Доброе время суток.
Сделайте сортировку по столбцу "Статус".

Приветствую. А без этого никак? Или в любом случае, если не группировать по признаку последнего столбца, макрос будет отрабатывать долго?
 
Ответить
Сообщение
Доброе время суток.
Сделайте сортировку по столбцу "Статус".

Приветствую. А без этого никак? Или в любом случае, если не группировать по признаку последнего столбца, макрос будет отрабатывать долго?

Автор - Artem2292
Дата добавления - 01.11.2020 в 13:38
Hugo Дата: Воскресенье, 01.11.2020, 20:17 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
100 строк можно и в union собрать. чтоб не усложнять код.
Просматривать 5000 стро тоже лишнее, если их реально другое количество.
Сравнивать LCase(Cells(i, 31)) Like LCase(zn) тоже лишнее, ведь там только равно или нет может быть.
Да и LCase можно исключить хотя бы на одной половине, да и вообще т.к. вариаций быть не может.
А если бы даже и были - Option Compare Text решает проблемы регистра.
И звёздочки зачем?
Убираем звёздочки, Like и LCase - уже экономия :)
P.S. Вот изменил по минимуму что было, проверьте.
К сообщению приложен файл: 8826566H.xlsb (82.7 Kb)


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD


Сообщение отредактировал Hugo - Воскресенье, 01.11.2020, 20:46
 
Ответить
Сообщение100 строк можно и в union собрать. чтоб не усложнять код.
Просматривать 5000 стро тоже лишнее, если их реально другое количество.
Сравнивать LCase(Cells(i, 31)) Like LCase(zn) тоже лишнее, ведь там только равно или нет может быть.
Да и LCase можно исключить хотя бы на одной половине, да и вообще т.к. вариаций быть не может.
А если бы даже и были - Option Compare Text решает проблемы регистра.
И звёздочки зачем?
Убираем звёздочки, Like и LCase - уже экономия :)
P.S. Вот изменил по минимуму что было, проверьте.

Автор - Hugo
Дата добавления - 01.11.2020 в 20:17
Artem2292 Дата: Понедельник, 02.11.2020, 10:50 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 34
Репутация: 0 ±
Замечаний: 0% ±

2010, 2019, 365
P.S. Вот изменил по минимуму что было, проверьте.

Приветствую
В файлике-примере и в рабочем файле все работает замечательно до момента, если строк со статусом "не действует" всего 3. Если строк уже больше, сразу выходит ошибка сразу ошибка runtime error 9 subscript out of range
Покопался в макросе, понял, что проблема выходит на строке
[vba]
Код
ReDim out(1 To 3, 1 To 31)
[/vba]
поменял 3 на большую цифру и все заработало. Спасибо за помощь B) . Буду дальше разбирать и изучать этот макрос
 
Ответить
Сообщение
P.S. Вот изменил по минимуму что было, проверьте.

Приветствую
В файлике-примере и в рабочем файле все работает замечательно до момента, если строк со статусом "не действует" всего 3. Если строк уже больше, сразу выходит ошибка сразу ошибка runtime error 9 subscript out of range
Покопался в макросе, понял, что проблема выходит на строке
[vba]
Код
ReDim out(1 To 3, 1 To 31)
[/vba]
поменял 3 на большую цифру и все заработало. Спасибо за помощь B) . Буду дальше разбирать и изучать этот макрос

Автор - Artem2292
Дата добавления - 02.11.2020 в 10:50
Hugo Дата: Понедельник, 02.11.2020, 11:15 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Глупая моя ошибка, специально ведь чуть выше высчитывал :)
Поменяйте не на цифру, а на переменную:
[vba]
Код
ReDim out(1 To x, 1 To 31)
[/vba]
Т.е. логика такая - определили какой массив будет нужен (хотя можно конечно делать как Вы - на всю область с запасом), в цикле переложили в него данные, и сразу собрали объект для удаления.
Затем выгрузили массив, удалили объект.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD


Сообщение отредактировал Hugo - Понедельник, 02.11.2020, 11:19
 
Ответить
СообщениеГлупая моя ошибка, специально ведь чуть выше высчитывал :)
Поменяйте не на цифру, а на переменную:
[vba]
Код
ReDim out(1 To x, 1 To 31)
[/vba]
Т.е. логика такая - определили какой массив будет нужен (хотя можно конечно делать как Вы - на всю область с запасом), в цикле переложили в него данные, и сразу собрали объект для удаления.
Затем выгрузили массив, удалили объект.

Автор - Hugo
Дата добавления - 02.11.2020 в 11:15
Artem2292 Дата: Понедельник, 02.11.2020, 11:27 | Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 34
Репутация: 0 ±
Замечаний: 0% ±

2010, 2019, 365
Поменяйте не на цифру, а на переменную:

ну да yes
перед [vba]
Код
ReDim out(1 To x, 1 To 31)
[/vba] добавил еще [vba]
Код
On Error Resume Next
[/vba] иначе, если в таблице не было статуса "Не действует" и случайно нажать кнопку "убрать в архив", вылезала ошибка runtime error 9 subscript out of range
в общем спасибо! Буду дальше изучать для себя мир VBA
:)


Сообщение отредактировал Artem2292 - Понедельник, 02.11.2020, 13:47
 
Ответить
Сообщение
Поменяйте не на цифру, а на переменную:

ну да yes
перед [vba]
Код
ReDim out(1 To x, 1 To 31)
[/vba] добавил еще [vba]
Код
On Error Resume Next
[/vba] иначе, если в таблице не было статуса "Не действует" и случайно нажать кнопку "убрать в архив", вылезала ошибка runtime error 9 subscript out of range
в общем спасибо! Буду дальше изучать для себя мир VBA
:)

Автор - Artem2292
Дата добавления - 02.11.2020 в 11:27
Hugo Дата: Понедельник, 02.11.2020, 12:16 | Сообщение № 10
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3690
Репутация: 790 ±
Замечаний: 0% ±

365
Так можно просто посмотреть что в x - если x>0 то отбор и удаление, а если нет - то это всё пропускается и выполняем последние строки кода.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеТак можно просто посмотреть что в x - если x>0 то отбор и удаление, а если нет - то это всё пропускается и выполняем последние строки кода.

Автор - Hugo
Дата добавления - 02.11.2020 в 12:16
Artem2292 Дата: Понедельник, 02.11.2020, 13:01 | Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 34
Репутация: 0 ±
Замечаний: 0% ±

2010, 2019, 365
Так можно просто посмотреть что в x - если x>0 то отбор и удаление, а если нет - то это всё пропускается и выполняем последние строки кода.

Спасибо, буду пробовать! :)
 
Ответить
Сообщение
Так можно просто посмотреть что в x - если x>0 то отбор и удаление, а если нет - то это всё пропускается и выполняем последние строки кода.

Спасибо, буду пробовать! :)

Автор - Artem2292
Дата добавления - 02.11.2020 в 13:01
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!