Страницы: 1 2 3 4 След.
RSS
Range.Address / Union(Ranges). Как максимально быстро отобрать диапазон по критериям
 
Приветствую!

Данная тема плавно вытекает из обсуждения «Range.Address. Зачем собирать адреса, Области применения» и, собственно, отвечает на этот вопрос - то есть показывает пример успешного применения сбора адресов для решения конкретной задачи.
Кроме демонстрации эффективности работы с адресами, в методе использована универсальная функция для максимально эффективного объединения диапазонов
Итоги проделанной работы (+ метод быстрого удаления большого количества строк)

Функции сделаны достаточно универсальными без заметной потери в скорости - использование не должно вызвать проблем

ВАЖНО: перед тестированием функций, посмотрите хоть немного, с чем она работает и откуда берёт входящие данные — это всегда диапазон  листа и он должен быть заполнен. Не заполнил сам, чтобы не превысить размер файла
Принцип:
Модуль «TestDel» (удаление строк)
Модуль «TestInt» (заливка ячеек)
Модуль «PRDX» (мои функции для работы)


Предлагаю новое название для темы:
«Диапазоны (Ranges). Как быстро отобрать области и/или удалить строки по критериям»
Изменено: Jack Famous - 12.03.2021 10:00:54
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Алексей, уже третья тема на Range.Address, может просто нужно в первой все обосновать?
А по теме, уже была тема:
Максимальная производительность при поиске и выделении (Select) большого массива несвязанных ячеек по условию - VBA
Это не одно и тоже, зачем новая тема?
Изменено: bedvit - 10.03.2021 11:15:19
«Бритва Оккама» или «Принцип Калашникова»?
 
И пришел медведь.

Во время разработки космической программы, NASA столкнулась с проблемой: обыкновенные шариковые ручки не пишут в невесомости. И тогда агентство привлекло лучших учёных страны, и потратило несколько миллионов долларов налогоплательщиков для того, чтоб разработать специальную "космическую ручку". Это чудо техники могло писать в невесомости и вакууме, на жаре и на морозе, и вообще являлось лучшей ручкой времён и народов. А советское руководство тем временем снабдило своих космонавтов простыми и дешёвыми карандашами.
По вопросам из тем форума, личку не читаю.
 
Цитата
bedvit: уже третья тема на Range.Address, может просто нужно в первой все обосновать?
первая про то, как получить адрес диапазона, состоящего из множества областей (и её превратили в помойку - отдельное "спасибо"), вторая - в Курилке и про обсуждение "зачем", нежели про конкретные способы. Эта же тема — с готовыми решениями: "Бери и пользуйся", как говорит Николай Владимирович  :)  :idea:
Цитата
bedvit: по теме, уже была тема
ну да - тут без пузыря даже пытаться не надо разобраться
что-то мне подсказывает, что сразу использовать твои "наработки" в своих проектах не получиться (один Union Union'ов чего стоит) - всё равно надо писать функции и процедуры — у меня всё уже написано и это ДАЛЕКО не тоже самое, что у тебя (вообще подходы похожи только понимаем того, что Union нужно забивать под завязку), не говоря уже про шуструю "резку строк" (у тебя строка адреса "заполняется под завязку" в процессе отбора, что неудобно для работы с другими процедурами)

Цитата
БМВ: И пришел медведь
и пустил по миру очередную тему  :D
А если серьёзно — где твой "карандаш"? Наверное предложишь глазками искать, да ручками выделять  ;)  Я уже 3ю тему жду, а ты до сих пор не можешь понять, зачем собирать адреса и никаких альтернатив не предлагаешь…
Цитата
БМВ: Во время разработки космической программы
очередная байка пропаганды о том, какие мы умные, а пиндосы тупые — разумеется, фейк (1, 2)
Изменено: Jack Famous - 10.03.2021 14:08:56
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Я не могу предложить альтернативное решение применение которого мне не понятно. Я ж писал на полном серьезе. Метод ради метода - не поддерживаю. С областью по крайним точкам в первой теме разобрались - простое решение. Даже если оно окажется медленным, то предпочту 4 строки. Леш приведи пример реального использования на примере 2-3 областей. Заметь, я не критикую само решение, я применимость к чему либо невкуриваю.
Изменено: БМВ - 10.03.2021 11:37:03
По вопросам из тем форума, личку не читаю.
 
Мда... в моих 76 строках не разобраться, зато в твоих 192 строках - все понятно :)
Цитата
Jack Famous написал:
подходы похожи
это потому, что ты сделал свой подход на основании моего (только еще парсинг строки добавил.), а я свой сделал на основании алгоритма от ZVI. Не разобрал как тестировать твой код, думаю и по скорости из-за парсинга прогрывает.
Изменено: bedvit - 10.03.2021 11:40:30
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
БМВ: Я не могу предложить альтернативное решение применение которого мне не понятно
и что же тебе непонятно в этом примере "закрасить ячейки с двоечками"?
Цитата
БМВ: Даже если оно окажется медленным, то предпочту 4 строки
о - ну так у нас тогда разные задачи, т.к. я VBA деньги зарабатываю и все мои инструменты должны быть максимально быстрыми (особенно, если брать разницу в десятки-сотни раз, как тут)
Цитата
bedvit: ты сделал свой подход на основании моего
это просто смешно — я взял оттуда только забивку Union под завязку и, заметь, совершенно другая функция, то есть "взял" по факту просто понимание того, что Union нужно применять с 30ю диапазонами, потому что он медленный. Без твоего кода, сделал бы это "открытие" несколькими минутами/часами позднее при тестировании, т.к. и так было понятно, кто "тормоз"
Цитата
bedvit: думаю и по скорости из-за парсинга прогрывает
время "парсинга" собранных адресов с распилом на блоки и получением диапазонов составляет 0,02 секунды на 25 тысячах отдельных ячеек/адресов. Время сбора адресов должно быть меньше твоего, т.к. у тебя дополнительные проверки на длину стэка. То есть при +- одинаковом времени сбора, я трачу ЦЕЛЫХ ДВЕ СОТЫХ секунды на то, чтобы превратить переданный массив адресов в диапазоны максимально длинных адресов

Повторюсь, используя данный подход, я могу из любой процедуры насобирать массивы по критериям и ПРОСТО ПЕРЕДАТЬ ИХ, безо всяких контролей стэков и прочего
Изменено: Jack Famous - 10.03.2021 11:57:49
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Это все слова, в моем алгоритме, по ссылке (см.выше) от 2016 года, обработка 250 тыс. ячеек с выделением 60 тыс.-5сек.
Какое у тебя время?
Прикладывай пример, померяемся....
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: Прикладывай пример, померяемся
у тебя вылизанный код для одной единственной задачи, а у меня 3 функции для применения в любых условиях (на входе одномерный массив адресов, на выходе 1 диапазон) — и какой смысл в сравнении?
Ради интереса можно, конечно - сколько времени у тебя займёт получение диапазона (объект Range) из 25 тыс ячеек примера (каждая 4я ячейка, из диапазона "A2:A100000")?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Понятно, твой код медленнее, кол-во строк в 2 раза больше... я пошел..)
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: твой код медленнее
безосновательное суждение - я сделаю пример сам, раз ты так переживаешь  ;)
Цитата
bedvit: кол-во строк в 2 раза больш
Код
      If k > 256 Then If j + 1 > 30 Then i = i + 1: j = 1: k = L + 1 Else j = j + 1: k = L + 1 ' При переполнении текущего буфера
      If k = L + 1 Then s(i, j) = addr Else s(i, j) = s(i, j) & "," & addr 'первый без запятой
а чего ты вообще весь код в 1 строку не засунул - всех бы победил навсегда  :D  :D  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Тестовый стенд есть в той теме, которую я скинул выше.
Вот он
Код
Sub заполнить_лист()
    Dim i&, j&, t#, a&(1 To 10000, 1 To 25)
    t = Timer
    For i = 1 To 10000
        For j = 1 To 25
            a(i, j) = Int(Rnd * 2000)
        Next
    Next
    [a1].Resize(10000, 25) = a
    Debug.Print Timer - t
End Sub


Задача: выделить в полученном стенде - вся ячейки , значением более 1500
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, хорошие новости - ты выиграл 0,1 сек (спишу для себя на вывод Debug'ов)  :D  :D  :D лол
Скрины
обновил СС

Отдельно прошу обратить внимание, насколько маленькая мне понадобилась процедура для теста (фактически, преобразование массива адресов в 1 диапазон занимает всего 1 строку)  — всё делают функции, просто передай им адреса  ;)   :idea:
Вот так стараешься-стараешься, а потом гораздо более удобный универсальный код твоему не проигрывает  :)
Изменено: Jack Famous - 10.03.2021 12:54:37
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
ты выиграл 0,1 сек
Вопрос-то не в том, что я выиграл на 0,1 сек., я это и ранее знал, что будет быстрее. Вопрос в том, что еще 4 марта, в твоей первой теме я тебе сказал, что парсить строку более 255 символов, дольше, чем сразу обрабатывать. Вот ответ к твоей первой теме (можно было там и продолжить, а не делать 3 штуки).
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: Вопрос в том, что еще 4 марта, в твоей  первой теме  я тебе сказал, что парсить строку более 255 символов, дольше, чем сразу обрабатывать
не мешки ворочать, как говориться - никаких сравнений ты не делал, да и сейчас это пустые слова, т.к. макрос состоит не только из сбора адресов с распилом — с одной стороны и сбора строк с контролем длины каждой — в другом. Нет так ли?
Там ты сказал, что это бред, однако разницы с твоим "комбайном" по скорости по сути НЕТ. Ты даже стесняешься это признать, т.к. не ожидал - не так ли?)))

Можно проверить вчистую, но теперь давай-ка уже сам - сам палец о палец не ударил. Мне в любом случае, контроль каждой строки при сборе — не нужен, потому что это неудобно. Если даже ты прав и вся разница в скорости это проигрыш "распила", то я готов "подождать" 0,1 сек в пользу гораздо большего удобства работы  ;)
Как бы тебе пришлось поменять своего монстрилу, чтобы "влезть" в мой пример? А в другой? То-то же — у меня это заняло пару минут   :)
Изменено: Jack Famous - 10.03.2021 13:03:24
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
никаких сравнений ты не делал
Цитата
Jack Famous написал:
сам палец о палец не ударил
Цитата
Jack Famous написал:
Если даже ты прав и вся разница в скорости это проигрыш "распила",
зачем этот распил, если можно сделать сразу всё, как нужно?
"Ёжики кололись и плакали, но продолжали жрать кактус..." Ладно, я пойду....
«Бритва Оккама» или «Принцип Калашникова»?
 
Fill data:    113 ms
Prepare:      66 ms
Get Address:  78 ms
AdrToBl:      31 ms
BlToRng:      2066 ms
Paint:        55 ms
Total time:   2434 ms

Скрытый текст


Fill data:    98 ms
Prepare:      39 ms
Paint:        449 ms
Total time:   555 ms
По вопросам из тем форума, личку не читаю.
 
БМВ, больше удивлён, что через расширенный делал, а не через обычный  :)
Что насчёт отбора по данным Витали или нескольких групп диапазонов по типу ColorMap или отбора значений по условию больше/меньше, по маске? Как сработает там? Если искать в умных таблицах?
Для наших с Виталей вариантов это не проблема, а вот расширенный фильтр, думаю, тут не поможет
Я бы сказал, что вариант отличный, но только для конкретного примера — не очень универсальный способ, зато, безусловно, быстрый (тут вопросов нет — добавлю в СС)
Уделывает (0,3 сек у дядь Миши против 2 у меня на 25 тыс выбранных)
Изменено: Jack Famous - 10.03.2021 15:33:38
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Алексей, в борьбе за универсальность мы получаем продукты раздутые и не оптимальные. Говноприложение на телефоне занимающее 100мб - это норма... зачем оптимизировать, лучше сказать что нужен телефон с большим объемом памяти .,....

Расширенный - да просто чтоб автофильтр не включать и не отключать :-). Да и делал то только для того чтоб показать что цель достигается другими средствами, хотя всегда может оказаться что фильтр установлен пользователем и решение его сбросит......
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ: зачем оптимизировать, лучше сказать что нужен телефон с большим объемом памяти
а ты с другой стороны посмотри — зачем "усираться" (платить более крутому программеру, например, или тратить больше времени) в борьбе за уменьшение размера на 20, скажем Мб (1/5 от общего размера твоего примера), если 1 фотка на современном телефоне "весит" 5 Мб??? Я, например, понимаю, разрабов: нет нескольких мегабайт на обновление, так используй старые приложения или не используй вообще и считай на калькуляторе - так и энергию сэкономишь  :D
Цитата
БМВ: цель достигается другими средствами
ненадёжно, а это тоже очень важно. В любом случае в тему (наконец-то) и лишним не будет, так что спасибо  :)
Изменено: Jack Famous - 10.03.2021 16:04:09
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
(наконец-то)
ты показал зачем это :-)
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
Расширенный - да просто чтоб автофильтр не включать и не отключать
не скажи. Тут есть и более грубокий смысл. В расширенном фильтре фильтровать даты(а так же отформатированные форматом числа) значительно удобнее. Плюс можно навороченные формулы использовать для отбора. Так что есть причины использовать его в определенных случаях.
Ну а меньше-больше, подстановка и прочее и в автофильтре доступны. А вот цвет - тут без авто или доп. столбцов не обойтись.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
не скажи.
Дмитрий, это для конкретного случая. я было хотел сперва в F2 загнать =R2С1=2 и оставить пустым F1 но потом оставил как есть. А так - инструмент очень мощьный.
По вопросам из тем форума, личку не читаю.
 
Цитата
Дмитрий(The_Prist) Щербаков: есть и более грубокий смысл.
он ещё и строки длиннее 255 символов фильтрует - я его как раз для этого в основном использую. Насчёт дат, времени и прочего - действительно намного проще, чем штатный вот только "посмотреть" фильтр в отличие от штатного нельзя. Если бы не этот минус, то про штатный в VBA бы забыл
Но это всё оффтоп - что насчёт использования его для отбора в диапазоне нескольких столбцов без шапки, как в примере у Витали?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
j
Цитата
Jack Famous написал:
без шапки,
вставить пустую строку и использовать формульный вариант расширенного.
Цитата
Jack Famous написал:
как в примере у Витали
это где?
По вопросам из тем форума, личку не читаю.
 
Собрал стэнд для теста «стэка» против «резки»
мой вариант чуть быстрее (0,15 сек при том, что это не 1 макрос, а передача параметров), чем у bedvit'а, но всё равно в пределах погрешности
Чуда не случилось - коль значимого выигрыша стэк (компоновка максимально длинных для создания адреса строк) не даёт, а проблем и неудобств больше (во всяком случае — для меня)

Выводы:
    • Повторюсь (bedvit также на это указывает), что резка одной огромной строки или компоновка в цикле (без разницы) — это всё ~ 1% от всего времени работы, а значит нет смысла что-то докручивать в этой части алгоритма. Основное время съедает Union — надо что-то ещё покрутить с ним
    • Расширенный фильтр
Есть сомнения, что лидерство сохранится при увеличении количества отобранных диапазонов и/или столбцов для поиска
В любом случае, специфика работы этого инструмента не позволяет его использовать настолько же свободно, как решения, не привязанные к инструментам Excel
Изменено: Jack Famous - 10.03.2021 17:03:38
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
БМВ: это где?
в СС - было, но обновил, добавив твой вариант и стэк
Цитата
БМВ: вставить пустую строку и использовать формульный вариант расширенного.
а остальное? Фильтр по нескольким столбцам попробуй, пожалуйста …
Изменено: Jack Famous - 10.03.2021 17:09:19
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Однажды Лебедь, Рак да Щука
Везти с поклажей воз взялись,
И вместе трое все в него впряглись;
Из кожи лезут вон, а возу всё нет ходу!
Поклажа бы для них казалась и легка:
Да Лебедь рвется в облака,
Рак пятится назад, а Щука тянет в воду.
Кто виноват из них, кто прав, – судить не нам;
Да только воз и ныне там
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: Да только воз и ныне там
ничего подобного — воз по всей поляне летает, припарковать не можем  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Летает, а толку нет. Все осталось на уровне темы 2016 года.
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: 1 2 3 4 След.
Наверх