Страницы: 1
RSS
Быстродействие макросов - удаление скрытых строк, Скорость выполнения 3х макросов по удалению сткрытых строк
 
Написал 3 макроса по удалению пустых строк.
1. макрос собирает все строки через Union и удаляет их за 1 раз - МЕДЛЕННЫЙ почему?
2. макрос удаляет в цикле КАЖДУЮ строку снизу вверх - быстрее, чем первый. Почему это быстрее, чем Union? )
3. тот же макрос, что и второй, только если его запустить на НЕАКТИВНОМ листе - самый быстрый - почему? )
 
New, файл не смотрел
Ответ на 1 и 2: потому что при большом количестве диапазонов (уже после 1 тыс) Union начинает очень сильно тормозить. К тому же, никакого "удаления за 1 раз" не происходит (только для диапазонов в Union, чья суммарная длина адресов менее 255 символов) — проверено многократно. Забудь про Union.
Вывести новый "отфильтрованный" массив быстрее всего. Если нужно прям удалять, то сортируй перед удалением или по одной, как обычно.
Моя функция нарезки адресов может помочь (это что-то Union только на порядки быстрее) - пробуй  ;)
Изменено: Jack Famous - 06.12.2022 18:37:43
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
да, вопрос был теоретический больше.
Про 255 символов помню
Про твою функцию помню
Меня больше удивляет, что построчное удаление скрытых строк на НЕактивном листе быстрее, чем на активном с отключённым обновлением экрана
 
Событийность отключена?
По вопросам из тем форума, личку не читаю.
 
Цитата
New: удаление скрытых строк на НЕактивном листе быстрее, чем на активном
попробуй ещё снять все фильтры на листе перед удалением (только для Union, разумеется) конечно, не только для него…  :sceptic:
Изменено: Jack Famous - 07.12.2022 14:41:48
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Выставлю свою лошадку на забег
Код
Sub Test1()
    Dim LastRow As Long, r As Long, Sht As Worksheet, lCounter As Long
    Dim t As Single, Rng As Range, cel As Range
    t = Timer
    Application.ScreenUpdating = False
    Set Sht = Worksheets("Test1")
    With Sht
        LastRow = .UsedRange.Rows.Count
        Set Rng = .Range("A2:A" & LastRow).Cells.SpecialCells(xlCellTypeVisible)
        For r = 1 To Rng.Areas.Count
            For Each cel In Rng.Areas(r).Cells
                cel.Offset(0, 1) = cel.Row
            Next

        Next

        If .FilterMode = True Then .ShowAllData
        .Range("A1:B" & LastRow).RemoveDuplicates Columns:=2, Header:=xlNo
        .Range("B1:B" & LastRow).ClearContents

    End With
    Application.ScreenUpdating = True

    MsgBox  "Время: " & Round(Timer - t, 2), , "Test1"
End Sub
 
Тест перенесён в свою тему
New, для твоего примера дам варианты завтра — есть как минимум, 2.
doober, что по времени?

Цитата
doober: cel.Row
(для получения уникальных номеров) всё ж заметно медленнее, чем счётчик  :)
Изменено: Jack Famous - 08.12.2022 14:56:12
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
doober , что по времени?
Я не замерял, секундомер в ремонте :)
 
Тут был тест, в котором я проиграл doober в 4 раза  :D
Результаты есть в финальной версии в моей теме
Изменено: Jack Famous - 08.12.2022 14:55:44
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Моя лошадка  молодец !!!
 
Улучшенное удаление строк (теперь уже выигрыш в 2 раза на основе инструмента «Удаление Дубликатов») перенесено в свою тему
Изменено: Jack Famous - 08.12.2022 14:50:26
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, doober, Вы не увлеклись? В гонке вы забыли о вопросах заданных, и если 1 однозначно ответ получил, второй 50:50,  а вот третий остался только в предположениях.
По вопросам из тем форума, личку не читаю.
 
По мотивам обсуждения. Так для посмеяться )
Код
Sub HiddenRowsDell() 'удаление скрытых строк
    Dim Rng As Range, hRng As Range, sRng As Range, t!
    Dim enEven As Boolean, scrUpd As Boolean, dispAl As Boolean
    t = Timer
    With Application
        scrUpd = .ScreenUpdating: .ScreenUpdating = False
        dispAl = .DisplayAlerts: .DisplayAlerts = False
        enEven = .EnableEvents: .EnableEvents = False
    End With
    
    Set sRng = Selection
    Set Rng = ActiveSheet.Cells
    Rng.Copy
    With Sheets.Add
        .Visible = False
        .Cells.PasteSpecial Paste:=xlPasteFormats             'бэкап форматов на скрытый лист
        Rng.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="0" 'создаем пустое правило
        Rng.SpecialCells(xlCellTypeVisible).ClearFormats
        Set hRng = Rng.SpecialCells(xlCellTypeAllFormatConditions) 'получаем скрытые строки
        .Cells.Copy
        Rng.PasteSpecial Paste:=xlPasteFormats                'восстановление форматов из скрытого листа
        hRng.Delete                                           'удаление скрытых строк
        Application.CutCopyMode = False
        .Visible = True
        .Delete
    End With
    sRng.Select
    
    With Application
        .EnableEvents = enEven
        .DisplayAlerts = dispAl
        .ScreenUpdating = scrUpd
    End With
    Debug.Print "Затрачено времени: "; Timer - t
End Sub

Бэкап  форматов 0,890625
Создание правила  0,921875
Очистка форматов  1,203125
Скрытые строки получены  1,375
Восстановление форматов  2,4375
Затрачено времени:  67,79688
На удаление неровного диапазона тратиться больше всего времени
Изменено: testuser - 11.12.2022 10:43:14
 
testuser, какая скорость на примере? Или вы хотите, чтобы мы сами заинтересовались вашим решением? Пока совсем не интересно и явно намного дольше…
Цитата
testuser: Затрачено времени:  67,79688
для удаления 2,5 тыс строк? В 60 раз дольше обычного построчного удаления без выкрутасов? Блестящий результат  :D

Цитата
БМВ:  Jack Famous ,  doober , Вы не увлеклись? В гонке вы забыли о вопросах заданных
а может New пусть сам ответит, что ему важнее — вопрос "почему быстрее так, а не эдак" решить или получить намного более быстрый макрос для удаления скрытых строк, который не ставит никаких вопросов…? А то он пока совсем ничего не говорит.
Ответы
Надеюсь, теперь вопросы исчерпаны  :)
Изменено: Jack Famous - 08.12.2022 13:41:30
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
New написал:
тот же макрос, что и второй, только если его запустить на НЕАКТИВНОМ листе - самый быстрый - почему? )
Такая мысль, что на активном листе задействованы механимы взаимодействия с пользователем, которые не очень эффективны и замедляют весь процесс. Я это заметил при пересчете нескольких десятков тысяч udf. Если инициировать пересчет "ручным" редактированием листа пересчет происходит в 3 раза дольше, чем после изменения макросом.
Цитата
Jack Famous написал:
Блестящий результат
"Блестящий результат", тоже результат )
Изменено: testuser - 08.12.2022 14:18:29
 
Цитата
Jack Famous написал: а может  New  пусть сам ответит, что ему важнее
Алексей, Паша задал конкретные вопросы. И в этой теме давайте будем отвечать на них. Если Паше нужны ответы на другие вопросы, то он читал правила и создасть соответствующие темы.
 
Юрий М, перенёс в свою, более соответствующую тему
Приглашаю заинтересованных продолжить тесты там…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
навеяло
Шумахер с Хакинненом поехали на сафари. Утром Хаккинен высовывается из палатки, а вокруг бегает Шумахер. За ним по пятам гонится огромный лев.
- Михаэль, он же тебя сейчас догонит!
-  Фиг ему, я его уже на два круга обошёл!
По вопросам из тем форума, личку не читаю.
 
БМВ, безусловно, в сравнении с нашей писаниной, анекдот намного ближе теме и уж точно наиболее полно отвечает на вопросы New  :idea:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Спасибо всем. Мне было интересно почитать и ответы на свои вопросы и предложенные варианты макросов. Тема в курилке же. Пойду осмысливать ваши ответы и тестировать коды.
 
Цитата
New: Тема в курилке же
ты что - если я в теме, то она будет под самым пристальным контролем бдительных модераторов — не замечал?  :D
Вообще, где это ещё и когда было, чтобы в теме Курилки сделали замечание за макрос по теме… С таким контролем Планета в полной безопасности, я считаю  8)

«Оффтопьте на здоровье», как говорится.
Изменено: Jack Famous - 08.12.2022 18:40:48
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, в теме были задан конкретныe вопросы. Косвенно все коды касаются процесса, но не отвечают на вопросы. В результате опять пошла гонка на время. Заметь, я достаточно мягко напомнил о вопросах и в целом я желею, что не перенес сразу в основную ветку.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ: в теме были задан конкретныe вопросы
а у нас на Планете, хочешь сказать, всегда отвечают ТОЧНО по вопросу? Или каждый раз такого отступления нарушителя одёргивают? Или ты сам никогда так не делаешь? Это не говоря о том, что дело происходит в Курилке…

На вопросы можешь не отвечать. Срача не будет - мне неохота из-за вашего (безусловно справедливого) бана опять время терять…
Я уже понял ваш праведный принцип работы с нарушителями и едиными для всех чёткими правилами. На этом закончим. Вы сказали — Я делаю. Устану — свалю.
Изменено: Jack Famous - 08.12.2022 19:21:25
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх