Страницы: 1 2 След.
RSS
Запись с разными разделителями разделить по столбцам, признак разделителя - "тире" или "точка"
 
Добрый вечер,
Помогите запись типа RR-111.222.333.444 разделить на группы:
RR-111
222
333
444
 
.
 
У меня для таких случаев припасен макрос приблизительно следующего содержания:
Код
sub autoSplitter()
dim cell as range
dim arr
dim sep

if typename(selection) <> "Range" then exit sub
sep = inputbox("Введите разделитель:", "Разделитель", " ")

for each cell in selection
  if len(cell.value) > 0 then
    arr = split(cell.value, sep)
    cell(1,2).resize(,ubound(arr) - lbound(arr)+1) = arr
  end if
next cell
end sub
Для применения нужно выделить искомый диапазон и запустить предложенный макрос. По умолчанию разделитель соответствует пробелу: " ". Также можно воспользоваться любым валидным строковым сочетанием, в том числе длиной больше 1 знака, чего добиться (насколько я помню) с помощью способа, предложенного ранее нельзя.
Изменено: Все_просто - 16.06.2016 22:24:01
С уважением,
Федор/Все_просто
 
Формулой. По столбцам:
=СЖПРОБЕЛЫ(ПСТР(ПОДСТАВИТЬ("."&$A1;".";ПОВТОР(" ";50));СТОЛБЕЦ(A1)*50;50))
По строкам:
=СЖПРОБЕЛЫ(ПСТР(ПОДСТАВИТЬ("."&A$1;".";ПОВТОР(" ";50));СТРОКА(A1)*50;50))
 
ни фига себе.... вариантов... как говорится "ныряй - там не глыбоко"))))

Спасибо, огромное.
 
Цитата
vikttur написал: Формулой
такое впечатление, что это работает только если исходная запись в находится в ячейке A1
так ли?
Изменено: Николаевич - 16.06.2016 23:35:09
 
В моем сообщении две формулы. Смотрите закрепление ссылки А1
 
вариант с функцией,i=1,2,3,4 для D1,E1,F1,G1 соответственно
Код
Function uuu$(t$, i%)
 With CreateObject("VBScript.RegExp"): .Pattern = "[-\w]+": .Global = True
    uuu = .Execute(t)(i - 1)
 End With
End Function
Изменено: sv2013 - 16.06.2016 23:46:57
 
vikttur, а возможно ли такие варианты записи расчленить?
важно использовать формулы, т.к. в них я еще смогу разобраться,
а в макросах и функциях типа Function, и т.д.....(((( не смогу.
Изменено: Николаевич - 19.06.2016 11:50:17
 
Николаевич, возможно всё... Только Вы уже сами дали ответ в своей картинке (какой вопрос, такой и ответ). )))
Если Вам нужен ответ не картинкой, то, желательно, и пример приложить не картинкой... ;)
Успехов. И мне того же. Благодарю. :)
 
Николаевич, не совсем корректное разделение (не пойму правила), т.к. в случае ab-123 вы переносите слитно, а cde-54321 разделяете… И ещё я понял, что у вас 5 групп, но обязательно пропускать четвёртый, если данных не хватает???
Короче, как уже сказал Ренат, ждём файл-пример СО ВСЕМИ НЮАНСАМИ

P.S.: посмотрите ТУТ - в принципе, в 2 этапа решает вашу проблему
Изменено: Jack Famous - 19.06.2016 13:13:18
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Ренат, прикрепил книгу Excel c исходником (то же, что и на картинке).
Jack Famous, исходная запись состоит из групп (число знаков в группе - произвольное), группы надо представить в отдельных ячейках. В исходной записи, группы (все, кроме последней) разделяются точками.  Последняя группа отделяется знаком "тире".
Т.е. первое "тире" является не разделителем, а частью группы. последнее "тире" является разделителем.
Вообще, последнее "тире" можно заменить на другой знак (кроме "точки" пример в прикрепленном файле).
Изменено: Николаевич - 19.06.2016 15:51:00
 
Обязательно пропускать, если блоков меньше пяти? А если их три или два?
Если без пропусков, то та же формула. но с доработкой:
=СЖПРОБЕЛЫ(ПСТР(ПОДСТАВИТЬ("."&ПОДСТАВИТЬ(ПОДСТАВИТЬ($A2;":";".");"-";".";2);".";ПОВТОР(" ";50));СТОЛБЕЦ(A2)*50;50))
 
vikttur, спасибо за редакцию,
на всякий случай по другому сформулирую...
В качестве исходника - запись с группами знаков. Группы могут иметь разное количество знаков (до 10) и разделяются следующим образом:
  • последняя группа отделяется знаком "тире" (или другой знак кроме "точки")
  • остальные группы разделяются "точками"
  • количество групп от 1 до 5
При этом, первая группа включает знак "тире", который не является разделителем.
пример на картинке и в прикрепленном файле.
Изменено: Николаевич - 19.06.2016 16:02:24
 
vikttur, нужно с пропусками, т.е. если отсутствует 4-я группа, то в ее ячейке - "пусто" и 5-я группа остается в 5-ой ячейке.
может отдельную формулу для каждой группы? "тире" в последней группе можно заменить на другой знак, кроме "точки".
хотя конечно Ваш вариант - лаконичен.
Изменено: Николаевич - 19.06.2016 21:15:06
 
Николаевич, ну вот зачем цитировать целиком? Кнопка цитирования не для ответа!
 
Вариант с применением "Текст по столбцам".
 
gling, Спасибо, но я думал найти формулу, которая в  этап выбирает нужную группу, опираясь на знаки разделения.
 
Если знать все разделители отличные от тире, можно использовать формулу предложенную Виктором (vikttur), в сообщении #13 с вкладками ПОДСТАВИТЬ, меняя эти разделители на две точки. Сложнее будет с тире, при этом разделителе не всегда будет отображаться в нужном столбце. Но если это всегда в конце текст "cde", то тогда можно что то придумать, типа этого
Код
=СЖПРОБЕЛЫ(ПСТР(ПОДСТАВИТЬ("."&ПОДСТАВИТЬ(ПОДСТАВИТЬ(ПОДСТАВИТЬ($A2;"-cde";"..cde");":cde";"..cde");"-";".";2);".";ПОВТОР(" ";50));СТОЛБЕЦ(A2)*50;50))
Изменено: gling - 19.06.2016 18:34:04
 
gling, cde будет не всегда(((, но можно последнее "тире" заменить на другой знак, если это поможет...
 
Проблема в том, что если разделитель перед cde или другим текстом, то ячейка должна быть пустой, если разделитель после текста, то текст должен остаться в сцепке с значением после разделителя. Как это определить, до текста или после?
 
gling, …и что-то мне подсказывает, что проблему можно решить, изменив условие и\или подход к ней целиком.
Николаевич, например, если это "разовое", то можно руками "допилить" после текста по столбцам или UDF Павлова из моей ссылки.
А если постоянно, то, как по мне, 2 пути:
1. От обратного — сцеплять текст из ячеек пол условию
2. Сформулировать ЕДИНОЕ правило для ВСЕХ ВОЗМОЖНЫХ вариантов, чтобы можно было использовать регулярные выражения. В этом случае добавьте больше примеров (1 ячейка, 2, 3, 4 и 5 и как по ним разделяется источник).
Лично мне непонятно - почему во 2 и 3 примерах значения 4 группы идут в 5, а 4 остаётся пустой и что будет при другом количестве и типе групп.
Также поясните типы разделителей и когда они используются (или это любые НЕтекстовые знаки и точка) так как ВСЁ это нужно "объяснить" Excel для автоматизации
Изменено: Jack Famous - 19.06.2016 20:27:18
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
и что-то мне подсказывает
что можно мяукнуть  :D
Код
Function Мяу(a As String)
    Dim ar(), aa$, i&
    ar = Array("-", ";", ":")
    aa = Replace(a, "-", "@", , 1)
    For i = LBound(ar) To UBound(ar)
        aa = IIf(UBound(Split(aa, ".")) = 3, Replace(aa, ar(i), "."), Replace(aa, ar(i), ".."))
    Next
    aa = Replace(aa, "@", "_")
    Мяу = Split(aa, ".")
End Function
 
думаю "как можно изменить условие",
что то упростить в задаче
RAN, спасибо но это для меня сложно, не смогу контролировать. Разбираться в этом - буду по возможности, но возможность ни как не наступает))))
Изменено: Николаевич - 19.06.2016 20:10:34
 
Сложно что? Ввести формулу на листе?  8-0
 
RAN, сложно использовать Function, язык этот не знаком.

По поводу упрощения задачи..
можно было-бы использовать формулы предложенные vikttur в постах 4 или 13.
Но в этом случае, как сделать, что бы игнорировались знаки после последнего "тире" (вместе с тире)
т.е. что бы запись
ab-123000.456999.789.cde-54321
рассматривалась как
ab-123000.456999.789.cde
и разбивалась на группы (по столбцам) :
Изменено: Николаевич - 19.06.2016 21:13:22
 
Цитата
Николаевич написал: после последнего "тире"
более 2-х может быть?
 
Catboyun, тире более 2-х не будет
групп может быть от 1 до 5

добавил скрин в пос № 27 для наглядности
Изменено: Николаевич - 19.06.2016 21:17:06
 
=СЖПРОБЕЛЫ(ПСТР(ПОДСТАВИТЬ(ЛЕВБ(ПОДСТАВИТЬ($A1;"-";ПОВТОР(" ";99);2);99);".";ПОВТОР(" ";99));СТОЛБЕЦ(A1)*99-98;99))
 
Цитата
последняя группа отделяется знаком "тире" (или другой знак кроме "точки")
Вместо второго тире - двоеточие:
=СЖПРОБЕЛЫ(ПСТР(ПОДСТАВИТЬ("."&ЛЕВБ($A2;ПОИСК(":";$A2)-1);".";ПОВТОР(" ";50));СТОЛБЕЦ(A2)*50;50))
Пятая группа:
=ПСТР(A2;ПОИСК(":";A2)+1;20)
Страницы: 1 2 След.
Наверх