Страницы: 1 2 След.
RSS
Range.Address. Как быстро получить длинный адрес диапазона, состоящего из множества областей
 
Приветствую!

Есть диапазон, состоящий из нескольких областей
Адрес диапазона (адреса всех областей через запятую) длиннее 255 символов (я так понял, что это и есть ограничение)

Вопрос: как получить этот длинный адрес без цикла по всем областям с накоплением адресов. То есть можно ли хоть как-то ускорить этот процесс?
Код
Скрины
файл большой, так что пока без него

Пока так: функция для получения ПОЛНОГО адреса переданного диапазона циклом по областям
получение адреса диапазона, состоящего из 400 тыс. отдельных ячеек занимает меньше 1 секунды (см. скрин выше)
Изменено: Jack Famous - 05.03.2021 11:35:11
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, Алексей, а можно цель упражнения озвучить, не промежуточную а финальную. Зачем это строка?
По вопросам из тем форума, личку не читаю.
 
БМВ, Миш, интересен сам подход, но цель тоже есть - потом можно быстро регулярками извлечь из этого адреса все номера строк и столбцов для дальнейших действий (например, определения координат крайних ячеек или получение полного списка задействованных строк и столбцов)
Изменено: Jack Famous - 04.03.2021 11:41:57
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Это можно сделать и без регулярок и адресов. По крайним адресам.
«Бритва Оккама» или «Принцип Калашникова»?
 
Есть ареал, в нем есть свойства, гугли.
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал:
По крайним адресам.
Привет. ну не все так просто, ибо  Selection выдает области в той последовательности в которой они выбирались.
По вопросам из тем форума, личку не читаю.
 
Цитата
bedvit: Это можно сделать и без регулярок и адресов
привет, Виталь  ;)
что "ЭТО"? Получить полный адрес без адресов??? Не буду же я перечислять ВСЕ задачи, где мне это может понадобиться  :)
Цитата
bedvit: Есть ареал, в нем есть свойства, гугли
Сам гугли - я его очень хорошо знаю  :D
Помимо комментария Миши, скажу, что работа с адресом (строкой) намного быстрее, чем с ячейками (особенно, если нужно получить список строк/столбцов), поэтому смысл в теме точно есть  ;)
Изменено: Jack Famous - 04.03.2021 13:52:01
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous:  получение полного списка задействованных строк и столбцов
при выделении нескольких несвязанных диапазонов:
Код
Msgbox Union(Selection.EntireColumn, ActiveCell).Address
Msgbox Union(Selection.EntireRow, ActiveCell).Address
Не?
 
Я извиняюсь что влез, но может решение подскажет реализация от ZVI. У меня файлик завалялся:)
Надстройка по выделению ячеек с заданым цветом или цветом шрифта на листе.
Если чё, в этом шаманстве ничего не понимаю.
Упс, даже зипованная версия 3 не лезет со всеми файлами
пароль 123

http://www.planetaexcel.ru/forum.php?thread_id=3350 - версия 1  (код рабочий, но не работало меню)

http://www.planetaexcel.ru/forum.php?thread_id=3369  - версия 2 (полностью рабочая)

http://www.planetaexcel.ru/forum.php?thread_id=3852 - версия 3  (быстрая)

 
Цитата
Бахтиёр: Не?
а сами как думаете? Мне нужен "полный адрес диапазона, состоящего из множества областей", а вы мне выводите в сообщение адрес объединения активной ячейки и её строки/столбца (что само по себе уже глупость, т.к. на выходе будет просто строка/столбец)

Igor67, спасибо. Если я правильно понял, то Владимир делает тоже самое, что и я - собирает в цикле адрес ,что и позволяет сильно ускориться, ТОЛЬКО:
    • вместо сбора в массив, собирает в строку (быстрее, чем обычно, но выигрыш с Join массива далеко не гарантирован)
    • получает диапазоны на определённой длине строки, чтобы не выпасть в ошибку - я решил эту проблему итоговой обработкой строки

Рад, что такой спец, как он, делал также  :D
Изменено: Jack Famous - 04.03.2021 14:24:17
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous:  интересен сам подход, но цель тоже есть - потом можно быстро регулярками извлечь из этого адреса все номера строк и столбцов для дальнейших действий (например, ... или получение полного списка задействованных строк и столбцов)
если выделить несмежные диапазоны A1:D9, E10:G10, K1:L1, мои коды выдадут A:G, K:L и 1:10 то есть, в выделенном несмежном диапазоне задействованы строки 1:10, и задействованы столбцы A:G, K:L
Union, как вы знаете, превратит 1:10, 1:10, 1:1 в 1:10

Может быть, я неправильно понял ваш вопрос, но поаккуратнее пожалуйста с:
Цитата
Jack Famous:  глупость
Изменено: Бахтиёр - 04.03.2021 14:49:18
 
Jack Famous,  предложение Бахтиёр, решает вопрос
Цитата
Jack Famous написал:
определения координат крайних ячеек
По вопросам из тем форума, личку не читаю.
 
1.
Цитата
Бахтиёр: получение полного списка задействованных строк и столбцов
это ОДНО ИЗ ВОЗМОЖНЫХ ПРИМЕНЕНИЙ (медведь - подстава), а тема о СОВЕРШЕННО ДРУГОМ
2.
Цитата
Бахтиёр: если выделить несмежные диапазоны A1:D9, E10:G10, K1:L1, мои коды выдадут A:G, K:L и 1:10
ок - не глупость (сорян - потропился), да - выдают, но уже при тысячах отдельных ячеек Excel виснет навсегда, а моя функция получит адрес на 400 тыс меньше, чем за секунду + ещё одна секунда  нужна регуляркам, чтобы достать все номера строк или столбцов + ещё одна секунда нужна, чтобы преобразовать диапазоны типа "1:5" в списки 1, 2, 3, 4 и 5
И вот кому этот метод теперь нужен? Не мне …

Цитата
БМВ: предложение  Бахтиёр , решает вопрос определения крайних ячеек
вот ты сам начал спрашивать "истинные цели" и теперь всех запутал. Плохой медведь.  :D  Тема о чём? Все варианты тут будем обсуждать???
Это уже не говоря о том, что метод - долгий. Думаешь, я таким макаром не могу в цикле пройтись по всем ячейкам, определяя максимумы и минимумы среди строк и столбцов??? Мне нужно сделать это максимально быстро  ;)

ТЕМА О БЫСТРОМ СБОРЕ ПОЛНОГО АДРЕСА ДИАПАЗОНА (более 255 символов), СОСТОЯЩЕГО ИЗ МНОЖЕСТВА ОБЛАСТЕЙ
Изменено: Jack Famous - 04.03.2021 14:54:27
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
при тысячах отдельных ячеек Excel виснет навсегда, а моя функция получит адрес на 400 тыс меньше
поэтому я с самого начала написал, что от адресов надо отказатся. Зачем тебе строка в сотни знаков? парсить? бред.
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
БМВ написал:
Selection выдает области в той последовательности в которой они выбирались.
Это неверно, он выдает Areas слева-направо и далее сверху-вниз по рабочему листу. (частный случай, см. ниже обсуждения)
Изменено: bedvit - 04.03.2021 16:53:38
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit написал: Зачем тебе строка в сотни знаков?
вопрос не по теме  :)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
bedvit написал:
Это неверно, он выдает Areas слева-направо и далее сверху-вниз по рабочему листу.
Добрый день, коллеги! Ставим эксперимент:

Код
Sub test()
   Dim v As Range
   Range("A1, C1, B1").Select
   Debug.Print Selection.Address
   For Each v In Selection.Areas
     Debug.Print v.Address
   Next v
End Sub
Изменено: sokol92 - 04.03.2021 15:14:53
Владимир
 
Цитата
bedvit: Это неверно, он выдает Areas слева-направо и далее сверху-вниз по рабочему листу
смотри: если отдельные области получены из одной с помощью методов выделения типа "только видимые", "только значения/формулы", то да - полный порядок, но при реально ручном выделении будет ровно тот порядок, который был при выделении, в том числе диапазоны, выделенные несколько раз
Угадай порядок выделения, зная MsgBox Selection.Address(0, 0)
зачем так голословно и однозначно утверждать, если проверить можно за 5 сек…

sokol92, приветствую, Владимир! Дополнил  :)
Изменено: Jack Famous - 04.03.2021 15:21:43
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
зачем так голословно и однозначно утверждать, если проверить можно за 5 сек…
если это в мой адрес, то мимо. Обычно, я проверяю что пишу.
Реальный пример
Код
Sub test()
   Dim v As Range, s
   Range("a1, f3, d1").Select
   Selection = 1
   Set s = Intersect(ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants, 23), Selection)
   Debug.Print s.Address
   For Each v In s.Areas
     Debug.Print v.Address
   Next v
End Sub

Цитата
Jack Famous написал:
при реально ручном выделении
могут выделить весь лист, все строки, все колонки. Кто-то пользуется такими диапазонами? обрабатывая тысячи лишних строк? Лично я всегда обрабатываю выделенный пользователем диапазон, кодом описанным выше, там порядок, тот, который я описал.
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: мимо. Обычно, я проверяю что пишу
Говоришь про Selection В ЦЕЛОМ, а подразумеваешь предварительную обработку - очень удобно
как-то избирательно проверяешь - не кажется?  :D

Цитата
bedvit: Кто-то пользуется такими диапазонами?
представь себе, что иногда заранее неизвестно, какого рода диапазон выделит пользователь и/или его не нужно обрабатывать подобными методами
да и к тому же попробуй вот это (данные есть в диапазоне)
- адреса и их порядок не изменятся

Может хватит уже софистикой заниматься и игрой в "а что, если" - вопрос-то про получение адреса ;)
Изменено: Jack Famous - 04.03.2021 16:12:56
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
bedvit,
А, если взять пересекающиеся диапазоны
Код
Range("a1:a3, f3:g10, d1:f5").Select
 
Цитата
Jack Famous написал:
Говоришь в общем про области, а подразумеваешь предварительную обработку
здесь согласен. Если брать не обработанный диапазон, то БМВ, Михаил прав.
Цитата
Jack Famous написал:
заранее неизвестно, какого рода диапазон выделит пользователь
для этого есть разные SpecialCells, на любой вкус (обычно этого хватает).
Я написал из практики (поправлюсь: очередность при обработке диапазона через Intersect(SpecialCells, Selection))

Kuzmich, а если пересекающиеся, то вот:
Код
Sub test()
   Dim v As Range, s
   Range("a1:a3, f3:g10, d1:f5").Select
   Selection = 1
   Set s = Intersect(ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants, 23), Selection)
   For Each v In s.Areas
     Debug.Print v.Address
   Next v
End Sub


$D$1:$F$2
$A$1:$A$3
$D$3:$E$5
$F$3:$G$10

Видимо в соответствии с парадигмой, что сам лист рассчитывается (ячейки) с верхней левой и построчно, слава - направо, сверху-вниз.
Как видно, чем ниже строка, тем дальше диапазон (ареал) в списке.
Изменено: bedvit - 04.03.2021 16:26:27
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, я не знаю, зачем ты на медведя наехал  :D
А так, если в целом про тему, в которой по делу никому, видимо, нечего предложить, то, по-моему, проще написать функцию, которая максимально быстро обработает диапазон, как надо, чем надеяться, что нужды так обработать диапазон никогда не возникнет  :idea:

Адреса я много где использую и мне это точно нужно, а то, что привёл навскидку пример, который, ВОЗМОЖНО, можно решить проще/быстрее, так это медведя пинайте — он спросил и это НЕ ПО ТЕМЕ
Изменено: Jack Famous - 04.03.2021 17:17:14
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
это медведя пинайте — он спросил и это НЕ ПО ТЕМЕ
ну конечно, опять медведь виноват.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ: ну конечно, опять медведь виноват
«Только ситхи всё возводят в абсолют» Оби-Ван Кеноби
В этот раз точно ты, но это не страшно — тебе всё-равно замечания не делают  8)
Я-то бы сразу по шапке схлопотал, начни такой оффтоп, а тут больше 20ти сообщений, НИ ОДНОГО — по теме и ничья попа (даже мохнатая) ещё не в огне  :D
Изменено: Jack Famous - 04.03.2021 18:02:37
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Что, и поинтересоваться нельзя зачем все это, а то вдруг получится, а я не буду знать к чему применить  :-)
По вопросам из тем форума, личку не читаю.
 
Цитата
Jack Famous написал:
я не знаю, зачем ты на медведя наехал
даже и не думал, что знал - сказал, оказывается - это частность. Ну и ОК, новая инфа по теме всегда хорошо.
И вообще, сегодня крутой враппер напилил для работы с СОМ и API C в Excel, с авто управлением памятью и обработкой ошибок. Теперь вместо 5 строк, одна строка кода, почти как в VBA и синтаксис похож. Красота, а поделится не с кем. Может тему в курилке сделать, форум то по Excel :)
А по теме: ты бы написал конечную задачу, а то может мы изобретаем мега крутой ... Костыль! Строка в VBA - это медленно. Я в свое время наизобретал костылей, кто бы посоветовал...
Изменено: bedvit - 04.03.2021 19:09:17
«Бритва Оккама» или «Принцип Калашникова»?
 
А медведь все еще гадает для чего это нужно. Мне кажется что универсальность идет против производительности.Может Union и не быстр но  вариант Бахтиёр работает.  Зачем текстовый список - пока не придумал.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ: Зачем текстовый список - пока не придумал
что ж — давай тогда выяснять, но  в более подходящем месте  ;)
Изменено: Jack Famous - 05.03.2021 14:35:16
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Код
If RefStyle = 0 Then RefStyle = xlA1
    If RefStyle = xlR1C1 Then
        fRF1 = True: fRF2 = True
    ElseIf RefStyle <> xlA1 Then
        MsgBox "Bad RefStyle «" & RefStyle & "»", vbCritical, "RangeAddress"
        Err.Raise xlErrNA: Exit Function
    End If

Два дерева в три ряда?  :D
Страницы: 1 2 След.
Наверх