Страницы: 1
RSS
Range.Address. Зачем собирать адреса, Области применения
 
Приветствую!

Дядя Миша при поддержке пользователей и полном попустительстве со стороны модерации, бессовестно надругались над моей бережно созданной темой в основной ветке, что и побудило меня создать это обсуждение в ветке, гораздо более подходящей для тестов :D

Итак, кто собирает адреса диапазонов и для чего?
Обсуждаются конкретные примеры и возможные альтернативные варианты каждой задачи, способа или метода, а также выявляются плюсы и минусы каждого из них
Просто поболтать тут уже не получится - все методы должны проверяться/подтверждаться тестами  :idea:
Изменено: Jack Famous - 05.03.2021 12:40:33
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Дано: диапазон rng (1 область «E3:R24») внутри UsedRange «D2:S25» (нет смысла искать пересечение)
Задача: "обрезать" rng до значащих (НЕпустых с формулами или значениями) ячеек. Диапазон должен остаться прямоугольным (1 область)
Скрины
Коды

1. методы SpecialCells позволили нам только убрать пустые ячейки, оставив нужные, поэтому искать крайние ячейки нужно всё-равно перебором
2. В переборе ВСЕГДА выигрывает функция на основе адреса — от 26% до 60% прироста скорости в примере
3. Размер диапазона (2 ячейки или 200 ячеек) не влияет на скорость определения крайних ячеек в нём, но одиночные ячейки обрабатываются почти в 2 раза быстрее
Изменено: Jack Famous - 05.03.2021 12:39:03
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Re: Кто собирает адреса диапазонов и для чего?

В самом деле - а для чего это нужно? Есть пример необходимости применения в какой то рабочей программе?
Изменено: Marat Ta - 05.03.2021 12:45:47
 
Цитата
Marat Ta: Кто собирает адреса диапазонов и для чего?
ок, более простой и очевидный пример — цветовая карта (ColorMap) видимых ячеек активного листа. Пользователь нажимает кнопку и создаётся копия листа, где каждый тип данных (текст/число/дата и т.д.) подсвечен своим цветом.
Я эту задачу решаю циклом по областям НЕпустых ячеек с проверкой данных и, если нужно, формата (для выявления времени, например), создавая на ходу словари "тип-массив адресов" для каждого из типов закрашивания и потом во втором цикле закрашиваю диапазоны ячеек по типам столько раз, сколько типов

А как ВЫ решили бы эту задачу на рабочих объёмах?
Предупреждаю, метод "нашёл ячейку-покрасил ячейку" можно смело оставлять на ночь, а собирать группы в Union хоть и будет сильно быстрее, но всё-равно безбожно долго на десятках тысяч данных
Без рабочего кода с примером хотя бы на 10 тыс ячеек для закраски хотя бы 5 типами (ошибка, формула, текст, число, дата), не пишите ничего, пожалуйста - мне здесь пустые разговоры не нужны  ;)
Чистая правда
Изменено: Jack Famous - 05.03.2021 14:20:07
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Union на десятках тысяч данных это секунды, главное уметь ей пользоваться)
Обработка 250 тыс. ячеек с выделением 60 тыс. отдельных ячеек - 5сек.,
Изменено: bedvit - 05.03.2021 13:51:38
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: главное уметь ей  пользоваться
о чём и речь - просто ты невнимательно читаешь, ведь я говорил про сбор подходящих ячеек "в лоб", а ты, судя по всему, про создание диапазона из длинной строки - мне помогли тут. Без этого преобразования, в котором Union также участвует, разумеется, не вышло бы работать с диапазонами одним махом, что критически важно для скорости

UPD: Блин - да о чём тут вообще говорить, если такой мэтр как ZVI, по ссылке внутри твоей же ссылки подробно объясняет, зачем нужно собирать адреса и какие проблемы нужно при этом решить - а именно:
    • создание диапазона из длинной строки (только что описал выше)
    • сбор адресов не "втупую" tx=tx & adr, а с помощью своих хитростей с перестановкой частей строки (я "решил" с помощью Join(arr,",") и, если честно, так и не понял, чем он ему не угодил)
Скрин
Изменено: Jack Famous - 05.03.2021 14:27:01
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
В той
Цитата
Jack Famous написал:
моей бережно созданной
теме ты хотел собрать адреса более 255 знаков, т.е. строку в несколько сот символов. Я тебе написал, что это ненужно, можно обойтись другими решениями, в т.ч. скинул тебе решение выше. Сейчас ты пишешь, уже о чем-то другом, я честно, не понял даже, что ты хочешь получить.
Отвечая по теме: Range.Address пользуюсь, но более 255 символов в строке не использую (использую другие подходы, которые выше и выложил).
ZVI, кстати тоже использует только 255 символов, далее их обрабатывает (я делаю так же).
Или давай на какой либо задаче обсудим, зачем тебе строка в сотни символов адресов.
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
Или давай на какой либо задаче обсудим, зачем тебе строка в сотни символов адресов.
ДА, а то я вторые сутки не сплю.
По вопросам из тем форума, личку не читаю.
 
bedvit, БМВ, мужики, хорош прикалываться — не смешно

Чтобы максимально быстро собрать диапазон по какому-либо признаку, я собираю одномерный массив адресов, который потом леплю в строку с помощью Join() и потом саму строку пилю на строки не более 255 символов, сохраняя целостность адресов, чтобы сделать диапазоны. Диапазоны эти собираю в один с помощью Union() — это ВСЁ

Да - можно не собирать длинную строку, а разбираться с этим при сборе, используя тот же Union() при превышении длины строки ,но заметно быстрее НЕ БУДЕТ. Тот способ я использую 3 года и не ручаюсь за топ скорости, но и медленным я его точно  не назову

В чём проблема или вопрос - я не понимаю… Миша убил предыдущую тему, потому что "не понимал, зачем нужно собирать адреса". Тут я, как мне кажется, показал, зачемColorMap - самый очевидный пример) + привёл пример от Владимира ZVI, который более подробно и профессионально рассказывает, почему он использует сбор строк

Вроде бы, вопросы должны закончится, но нет — что ещё я могу вам объяснить?
Вы считаете, что собирать адреса НИКОГДА не бывает нужно - я с этим не согласен и, в отличие от вас привёл конкретные примеры с тестами, поэтому, чтобы не быть голословными, предлагаю вам сделать примеры для аналогичных ситуаций, БЕЗ использования адресов и сравним скорости (особенно интересно потестить метод от Бахтиёра, к которому так аппелировал Миша)
Изменено: Jack Famous - 05.03.2021 17:13:19
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
И Владимир и я загоняем строки по 255 символов в массивы и потом эффективно их используем. Ты же загоняешь в строку, потом парсишь. Чувствуешь разницу?
Изменено: bedvit - 05.03.2021 17:26:25
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: загоняем строки по 255 символов в массивы
значит всё-таки собираешь адреса?  :D Донеси тогда медведю, а то он не вкуривает  ;)
Цитата
bedvit: Чувствуешь разницу?
чувствую и написал про это  :D
А ты чувствуешь, что я подкрепляю свои слова тестами и примерами, в отличие от тебя?  :)
К функции разделения строк я давно хочу подобраться самостоятельно, чтобы ускорить, но в любом случае интересна разница в скоростях с вашим методом — с удовольствием возьму на вооружение, если игра стоит свеч — сделай пример  ;)

Цитата
bedvit: эффективно их используем
слушай, не знаю, что там со строками в C++, но строковые функции в VBA очень шустрые - ты и так говорил ,в предыдущей теме, что "парсинг" строки это долго, а я на тестах показал, что он быстрее штатных методов получения строки/столбца при грамотном подходе (и это я ещё регулярки не подключал через раннее связывание)…
Изменено: Jack Famous - 05.03.2021 18:09:05
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
мужики, хорош прикалываться
Алексей, я правда не могу придумать применение.
По вопросам из тем форума, личку не читаю.
 
Собираю адреса, много собираю, но не сотнями знаков в одной строке)  Медведь про это говорит, насколько я понял. Про С++ вообще не упоминал, но если хочешь инфу, то строки в С/С++ - это массивы символов, работа с ними так же быстра как с массивом или куском памяти. Плюс мега чит - адресная арифметика с указателями. Сейчас часто пользуюсь, вещь! А строка в VBA - это BSTR строка - достаточно медленная реализация. Есть свои особенности. В XLL можно делать очень быстрый код. Не буду читерить, готов и на VBA написать. Давай че надо, только одна залача по теме, а не проект. Давай выделения 10 тыс отдельных ячеек по какому либо условию, к примеру цвет или формула, значения...
Изменено: bedvit - 05.03.2021 22:36:12
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, спасибо, Виталь, но пока рано говорить о переносе. Вот как разберусь с VBA, пойму, что да как – тогда и обсудим
Слишком много вариантов и идей пока что...
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Разобрался с ускорением через Union. Если коротко, то надо вызывать как можно реже, используя в аргументах все 30 диапазонов
Многократно ускорил код - в 100 раз уже на 10 тыс обрабатываемых ячеек
Изменено: Jack Famous - 09.03.2021 18:04:56
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Думаю, что можно сделать еще быстрее. Но ты потренеруйся)
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: Думаю, что можно сделать еще быстрее
ну наверное можно, но не шибко))) Union уже и так максимально эффективен, так что только, если адрес резать более эффективно (хотя какой смысл, если и так строку на 25 тыс адресов за 2 сотых секунды режет). Если разделить функцию AdressToRange на 2 логических этапа (на 100 тыс ячеек диапазона с отбором 25 тыс): AddressToBlocks (~ 0,02 сек) и ArrayUnion(Blocks) (~ 1,8 сек), то сразу видно, что "парсинг" адресной строки в ~ 100 раз эффективнее. По сути, то же своего рода "объединение", что и Union, но ведь куда шустрее  :idea:

Так что ТЫ теперь потренируйся  :D
Изменено: Jack Famous - 10.03.2021 09:56:28
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Сделал отдельную тему
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Так что ТЫ теперь потренируйся  
Что мне тренировать (может Jack Famous? :) , если твой код медленнее моего и в два раза больше?
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: твой код медленнее моего
на 0,1 сек - что ж, успеешь насладиться своей победой как следует  :D  Не стыдно-то такое говорить вообще???
Цитата
bedvit: в два раза больше?
ну да - там целых 3 отдельные функции, которые можно вызывать, откуда угодно вместо того, чтобы при каждом чихе стэки считать в цикле и иметь одноразовый код - меня устраивает  :)
Изменено: Jack Famous - 10.03.2021 13:23:32
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Три функции, вместо одной, код длиннее в 2 раза, скорость ниже, но зато тебя это устраивает - это аргумент, согласен. На этом можем и остановится.
Изменено: bedvit - 10.03.2021 17:48:13
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: Три функции, вместо одной
у тебя НОЛЬ функции - ОДНА процедура для ОДНОЙ задачи; одноразовый труд
Цитата
bedvit: код длиннее в 2 раза
каждую функцию можно вызывать тогда, когда она нужна - самостоятельный инструмент без потери скорости. Это просто удобно, чем переписывать весь твой код, когда что-то чуть-чуть изменится — тебе не понять  :)
Цитата
bedvit:скорость ниже
у тебя нет прироста в скорости - перестань уже цепляться за воздух: 0,1 сек разницы на 7 сек общей работы это 1,5%, что является не более чем погрешностью, к тому же мой более гибкий аналог твоего "стэка" ещё на 1,5% быстрее ТВОЕГО, а вот это уже целых 3%  :D
Цитата
bedvit: На этом можем и остановится
не договоримся  :)
Изменено: Jack Famous - 10.03.2021 18:03:02
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Функциональность кода рассудит народ. Что им будет удобне. Универсальная одна функция или твоих три под нужную задачу.
Цитата
Jack Famous написал:
тебе не понять
так и есть, не понимаю. Что поделать.
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: 1
Наверх