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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2012, 02:33   #1
V@lentin
Пользователь
 
Регистрация: 26.01.2011
Сообщений: 17
По умолчанию Быстрое удаление строк

Добрый день!
EXCEL 2003
Есть таблица с данными, которая стостоит из нескольких тысяч строк.
Проблема в том, что когда я удаляю около тысячи выделенных строк, то даный процес занимает несколько минут времени, т.е. довольно долго.
Скажите, можно ли написать макрос для мгновенного удаления выделенных строк?
Заранее благодарен.
V@lentin вне форума Ответить с цитированием
Старый 17.03.2012, 06:02   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Так вы макросом ищете подходящие строки (судя по предыдущей теме), и потом по одной из удаляете?

Этот макрос пробовали?
http://excelvba.ru/code/ConditionalRowsDeleting
EducatedFool вне форума Ответить с цитированием
Старый 17.03.2012, 11:52   #3
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Тысячу несколько минут? Отключите пересчёт.
Ну и кроме Union можно ещё адреса собирать в строку и удалять полученный диапазон.
Только длину строки нужно контролировать.
Ссылка на тему: http://www.planetaexcel.ru/forum.php...llnum_forum=52
Ещё вариант - создать массив с пометками (параллельно в основном процессе), выгрузить массив в свободный столбец, фильтр по столбцу, видимые удалить. Будет "мгновенно".
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 17.03.2012 в 11:56.
Hugo121 вне форума Ответить с цитированием
Старый 17.03.2012, 18:01   #4
V@lentin
Пользователь
 
Регистрация: 26.01.2011
Сообщений: 17
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Так вы макросом ищете подходящие строки (судя по предыдущей теме), и потом по одной из удаляете?

Этот макрос пробовали?
http://excelvba.ru/code/ConditionalRowsDeleting
Предыдущий мой вопрос никак не связан с данной темой. Для меня главное быстрота удаления строк. К примеру, из 5-ти тысяч строк, мне нужно выделить много строк (1000-1500) и удалить их все сразу. Этот процесс занимает у меня на компьютере (работаю в ЕКСЕЛЬ 2003) приблизительно 3-5 минут. Пробовал удалять макросом с отключением обновления экрана - выходит все равно долго.
V@lentin вне форума Ответить с цитированием
Старый 17.03.2012, 18:31   #5
V@lentin
Пользователь
 
Регистрация: 26.01.2011
Сообщений: 17
По умолчанию

Отключил автоматические вычисления - помоглось, удаляются практически мгновенно. У меня в каждой строке очень большие формулы, скорее всего это и не давало быстро удалить большое количество строк.
Всем спасибо, особенно Hugo121!

Как думаете, можно создать такой макрос, чтоб отключал автоматический пересчет, затем удалял выделенные строки, затем обратно его включал?
V@lentin вне форума Ответить с цитированием
Старый 17.03.2012, 19:04   #6
Djeki
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 136
По умолчанию

Цитата:
Сообщение от V@lentin Посмотреть сообщение
Как думаете, можно создать такой макрос, чтоб отключал автоматический пересчет, затем удалял выделенные строки, затем обратно его включал?
Включите запись макроса и запишите. Получите готовый код.
Djeki вне форума Ответить с цитированием
Старый 17.03.2012, 19:14   #7
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Обычно делают так:
Код:
    With Application
        lCalc = .Calculation
        .ScreenUpdating = False: .Calculation = xlManual
    End With

  'работа

    With Application
         .ScreenUpdating = True: .Calculation = lCalc
    End With
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 17.03.2012, 21:26   #8
V@lentin
Пользователь
 
Регистрация: 26.01.2011
Сообщений: 17
По умолчанию

Всем спасибо! Все работает, удаляет быстро.

Код:
Sub удаление()
With Application
        lCalc = .Calculation
        .ScreenUpdating = False: .Calculation = xlManual
    End With

Selection.Delete

    With Application
         .ScreenUpdating = True: .Calculation = lCalc
    End With
End Sub
V@lentin вне форума Ответить с цитированием
Старый 17.03.2012, 21:48   #9
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Посмотрел критическим глазом - вероятно нужно сперва включить пересчёт (всё посчитается), потом сразу всё отобразить.
Можете замерить скорость одного и второго варианта:
Код:
Sub удаление()
    Dim tm!: tm = Timer
    Dim lCalc&

    With Application
        lCalc = .Calculation
        .ScreenUpdating = False: .Calculation = xlManual
    End With

    Selection.Delete

    With Application
       .Calculation = lCalc: .ScreenUpdating = True
    End With

    MsgBox "Удалено за " & Format((Timer - tm) / 24 / 60 / 60, "nn:ss") & " сек."

End Sub
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление из строк Михаил_444 Паскаль, Turbo Pascal, PascalABC.NET 1 14.11.2011 21:23
перенос строк удаление ненужных строк HelperAwM Microsoft Office Excel 5 26.06.2010 18:42
Удаление строк из БД Danilka БД в Delphi 12 14.04.2010 21:27
Быстрое удаление дублирующихся слов :). Utkin Общие вопросы Delphi 21 01.02.2010 08:25
Быстрое удаление содержимого ячеек gadspider Microsoft Office Excel 11 18.07.2009 12:08