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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 14.04.2008, 14:12   #1
jungo
Форумчанин Подтвердите свой е-майл
 
Аватар для jungo
 
Регистрация: 14.11.2007
Сообщений: 163
По умолчанию Как сократить время? МАКРОС!

Привет!

Очень большой список где-то 61000 строк. нужно стереть полностью строки где во второй строке (В) есть цифра 2 (их большинство). Использую код:

Код:
Set ws = ActiveSheet
    For i = ws.UsedRange.Rows.Count To 1 Step -1
        If Cells(i, "B") = "2" Then ws.Rows(i).Delete
    Next i
End Sub
Оооочень долго! Как сделать быстрей?
Jungo must die!!! (C) Bill Gates.
jungo вне форума
Старый 14.04.2008, 14:18   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

А перед Вашим кодом есть строка, запрещающая обновление экрана?
Код:
Application.ScreenUpdating = False
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 14.04.2008, 14:24   #3
jungo
Форумчанин Подтвердите свой е-майл
 
Аватар для jungo
 
Регистрация: 14.11.2007
Сообщений: 163
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
А перед Вашим кодом есть строка, запрещающая обновление экрана?
Нет. Я помню что это обсуждалось, но экономит ли это время?
Jungo must die!!! (C) Bill Gates.

Последний раз редактировалось jungo; 14.04.2008 в 14:27.
jungo вне форума
Старый 14.04.2008, 14:33   #4
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

В Вашем случае - значительно.
Можно еще попробовать "накопить" нужные строки при помощи оператора Union. Затем сделать Union.Delete. Но позволит ли данный оператор столько аргументов - не пробовал (хотя пишут, что не ограничено). Будет ли это быстрее - нужно пробовать. При таком подходе - нет непосредственной работы со строками листа в цикле.
Я так думаю, что результат будет таким же, как и при запрете на обновление.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 14.04.2008, 14:55   #5
jungo
Форумчанин Подтвердите свой е-майл
 
Аватар для jungo
 
Регистрация: 14.11.2007
Сообщений: 163
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
В Вашем случае - значительно.
Можно еще попробовать "накопить" нужные строки при помощи оператора Union. Затем сделать Union.Delete. Но позволит ли данный оператор столько аргументов - не пробовал (хотя пишут, что не ограничено). Будет ли это быстрее - нужно пробовать. При таком подходе - нет непосредственной работы со строками листа в цикле.
Я так думаю, что результат будет таким же, как и при запрете на обновление.

Вариант с запретом обновления экрана не удался...
6000 строк за 15 минут.
Можно поподробней о варианте "попробовать "накопить" нужные строки при помощи оператора Union"?
Jungo must die!!! (C) Bill Gates.
jungo вне форума
Старый 14.04.2008, 16:26   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Можно вручную отключить режим автоматического пересчета проверить эффект, а потом внедрить в процедуру.
Application.Calculation = xlManual.

Предлагаю попробовать такой вариант: строки не удалять, а очистить содержимое. Потом все отметить и отсортировать... Но это так - запасной вариант.

Отключение автопересчета и запрет на обновление экрана у меня всегда давали существенный прирост в скорости выполнения аналогичных процедур для больших массивов, когда данные правились непосредственно на листе. Все работало быстрее не на 20-30%, а в 10, 20, 50 раз быстрее.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 15.04.2008, 05:38   #7
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Предлагаю вариант (упомянутый выше), который на протяжении всей работы макроса вообще не "трогает" строки листа. Поиск и накопление номеров строк, удовлетворяющих заданному условию, происходит в памяти, а затем на листе выполняется единственная команда Delete.
Для теста, создал на листе два столбца значений в 6000 строк, где в столбце "B" было несколько тысяч значений "2". Время выполнения макроса составило менее 2 сек. Конечно, нужно заметить, что нет ни ссылок, ни формул, но попробуйте.
Код:
Sub Udalenie()

    Dim AllRows As Object, FirstCell As Object, FoundCell As Object
    Application.ScreenUpdating = False
    
    Set FirstCell = ActiveSheet.Columns("B").Find(What:=2, LookAt:=xlWhole)
    If FirstCell Is Nothing Then Exit Sub
    
    Set AllRows = Rows(FirstCell.Row)
    Set FoundCell = FirstCell
    
    Do
        Set FoundCell = ActiveSheet.Columns("B").FindNext(After:=FoundCell)
        Set AllRows = Union(Rows(FoundCell.Row), AllRows)
        If FoundCell.Address = FirstCell.Address Then Exit Do
    Loop

    AllRows.Delete

End Sub
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 15.04.2008, 12:58   #8
jungo
Форумчанин Подтвердите свой е-майл
 
Аватар для jungo
 
Регистрация: 14.11.2007
Сообщений: 163
По умолчанию

SAS888
Большое спасибо за помощь!
Протестировал, и что получилось:

61000 строк - Не дождался, больше 10-ти минут ждал.
40000 строк - Тоже не дожидался хотя не ждал больше 5-ти минут.
27000 строк - ЗАРАБОТАЛО!!! но только через 2-3 минуты.
2-3 минуты на пол массива значит 4-6 минут на массив, но этого не произошло что говорит о том, что на такое количество строк этот вариант не годен.
Ещё раз огромное спасибо!

IgorGO
Можешь подробней насчёт своей идеи?
Jungo must die!!! (C) Bill Gates.

Последний раз редактировалось jungo; 15.04.2008 в 13:32. Причина: 37000 - 27000
jungo вне форума
Старый 15.04.2008, 13:46   #9
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Странно! Протестировал на 65536 строк (у меня Excel 2003). Все работает. Время выполнения около 7 сек. (Зависит от быстродействия комп.). Посмотрите вложение. Здесь макрос "Zapolnenie" - вставляет значение 2 во все ячейки столбца "B". Макрос "Udalenie" - собственно, рабочий макрос.
Просьба к участникам форума: протестируйте, пожалуйста.
Вложения
Тип файла: rar Test.rar (276.2 Кб, 37 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 22.04.2008, 13:36   #10
jungo
Форумчанин Подтвердите свой е-майл
 
Аватар для jungo
 
Регистрация: 14.11.2007
Сообщений: 163
По умолчанию

Цитата:
Сообщение от SAS888 Посмотреть сообщение
Странно! Протестировал на 65536 строк (у меня Excel 2003). Все работает. Время выполнения около 7 сек. (Зависит от быстродействия комп.). Посмотрите вложение. Здесь макрос "Zapolnenie" - вставляет значение 2 во все ячейки столбца "B". Макрос "Udalenie" - собственно, рабочий макрос.
Просьба к участникам форума: протестируйте, пожалуйста.
Привет!

Извиняюсь что долго не отвечал, был на отдыхе.

Ты прав что-то в моём массиве тормозит... Но что???
Формул нет. Что может ещё тормозить?
Jungo must die!!! (C) Bill Gates.
jungo вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос для копирования knyz Microsoft Office Excel 28 11.01.2009 06:12
Макрос 2007 ditoch Microsoft Office Excel 6 24.06.2008 11:09
макрос VBA Excel Bor Microsoft Office Excel 5 25.01.2008 12:20
Макрос Мингиян Microsoft Office Access 1 24.01.2008 21:54
Макрос в Word Mictiann Microsoft Office Word 1 12.09.2007 09:35