Страницы: 1
RSS
Разбить строку на несколько строк внутри ячейки по условию
 
Добрый день. В ячейке есть данные записанные в одну строку через разделители.

CAS: CAL41106AS; Kia: 0K55818300, 0K55918300; KRAUF: ALA0016, ALA0016AW, ALA0016GB, ALA0016KR; Mando: AB111125, TA000A37301;

Названия, после них обязательно идет двоеточие
Далее перечисляются номера через запятую, номеров может быть один для каждого названия, а может быть несколько
Задача: чтобы каждое название и номер были  в отдельной строке внутри ячейки

CAS: CAL41106AS
Kia: 0K55818300
Kia: 0K55918300
KRAUF: ALA0016
KRAUF: ALA0016AW
KRAUF: ALA0016GB
KRAUF: ALA0016KR
Mando: AB111125
Mando: TA000A37301

В приложенном файле отобразил как есть и как нужно сделать

Прошу помощи с реализацией. Строк более 50.000
Заранее благодарю
 
Думаю практичнее/удобнее будет делать с помощью UDF в соседней ячейке. Реально. Но долго.
 
schulmin,

Вариант в Power Query:
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Номера"]}[Content],
    replace = Table.ReplaceValue(Source,"; ","#(lf)",Replacer.ReplaceText,{"Номера"})
in
    replace
 
schulmin, работает с выделенным диапазоном. Можно выделять строки или столбцы целиком.
Код
Sub Sc()
Dim v(), i&, j&, d$(), k&
  With Intersect(Selection.Areas(1), ActiveSheet.UsedRange)
    v = .Value
    For j = 1 To UBound(v, 2)
      For i = 1 To UBound(v)
        d = Split(v(i, j), "; ")
        For k = 0 To UBound(d)
          If InStr(d(k), ", ") Then d(k) = Replace(d(k), ", ", vbLf & Left$(d(k), InStr(d(k), ": ") + 1))
        Next
        v(i, j) = Join(d, vbLf)
      Next
    Next
    .Value = v
  End With
End Sub
Aleksei_Zhigulin, а по моделям внутри бренда разбить?
Изменено: Казанский - 17.01.2019 19:54:37
 
Ну и UDF. Как и говорил - долго :)
Изменено: Hugo - 17.01.2019 20:53:03 (Убил, ниже более оптимальная на коде Алексея.)
 
Всем большое спасибо! Попробовал  макрос от "Казанский", то что нужно. Очень круто!
Изменено: schulmin - 17.01.2019 21:20:30
 
Да, чот я загнул там с кодом, приходится тырить у Алексея, на всякий, чтоб если вдруг кому понадобится UDF:
Код
Function razbitj(s As String) As String
Dim d$(), k&
        d = Split(s, "; ")
        For k = 0 To UBound(d)
          If InStr(d(k), ", ") Then d(k) = Replace(d(k), ", ", vbLf & Left$(d(k), InStr(d(k), ": ") + 1))
        Next
        razbitj = Join(d, vbLf)
End Function

А файл с моим монстром удалю.
 
Код
Sub SplitRow()
  Dim a0, a, i&, j&, r&, n$: a0 = Split([b1], ";"):  r = 2
  For i = 0 To UBound(a0)
    n = Split(Trim(a0(i)), ":")(0): a = Split(Split(Trim(a0(i)), ":")(1), ",")
    For j = 0 To UBound(a)
      a(j) = n & ":" & Trim(a(j))
    Next
    Cells(r, 2).Resize(UBound(a) + 1, 1).Value = WorksheetFunction.Transpose(Split(Join(a, ","), ","))
    r = r + UBound(a) + 1
  Next
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Казанский написал:
Aleksei_Zhigulin , а по моделям внутри бренда разбить
Не заметил, спасибо.
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Номера"]}[Content],
    index = Table.AddIndexColumn(Source, "i", 0, 1),
    split = Table.ExpandListColumn(Table.TransformColumns(index, {{"Номера", Splitter.SplitTextByDelimiter("; ", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Номера"),
    split1 = Table.SplitColumn(split, "Номера", Splitter.SplitTextByDelimiter(": ", QuoteStyle.Csv), {"a", "b"}),
    split2 = Table.ExpandListColumn(Table.TransformColumns(split1, {{"b", Splitter.SplitTextByDelimiter(", ", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "b"),
    suffix = Table.TransformColumns(split2, {{"a", each _ & ": ", type text}}),
    merge = Table.CombineColumns(suffix,{"a", "b"},Combiner.CombineTextByDelimiter("", QuoteStyle.None),"Номера"),
    group = Table.Group(merge, {"i"}, {{"Номера", each Text.Combine(_[Номера], "#(lf)")}}),
    remove = Table.RemoveColumns(group,{"i"})
in
    remove
Страницы: 1
Наверх