Страницы: 1
RSS
Разделение данных ячейки на строки.
 

В прикрепленном файле я привела вариант таблицы, и что в идеале надо с ней сделать. Когда делаю выгрузку из системы, то телефоны по каждому сотруднику выгружаются в одну ячейку(разделитель - запятая и пробел -«, »). Нужно переформатировать таблицу так, чтобы данные по сотруднику дублировались в каждой строке столько раз, сколько номеров телефонов у него есть, причём в колонке phone отображались по очереди номера телефонов.

Помогите, пожалуйста, написать макрос или подскажите как это возможно сделать вручную, т.е. с использованием формул или команд excel.

Спасибо!

 
Power Query
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"First Name", type text}, {"Last Name", type text}, {"Date of birth", type date}, {"Phone", type text}, {"Department", Int64.Type}, {"Rank", Int64.Type}}),
    #"Разделить столбец по разделителю" = Table.ExpandListColumn(Table.TransformColumns(#"Измененный тип", {{"Phone", Splitter.SplitTextByDelimiter(", ", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Phone")
in
    #"Разделить столбец по разделителю"
Изменено: Msi2102 - 14.10.2021 07:32:00
 
Алёна, еще вариант
Код
Sub mrshkei()
Dim arr, arr2, arr3, i As Long, j As Long, n As Long, k As Long, lr As Long, x As Long
x = 6
lr = Cells(Rows.Count, 1).End(xlUp).Row
arr = Range("A1:F" & lr)
ReDim arr3(1 To lr * 5, 1 To x): k = 2
For i = 1 To x
    arr3(k - 1, i) = arr(1, i)
Next i
For i = LBound(arr) + 1 To UBound(arr)
    arr2 = Split(arr(i, 4), ", ")
    For n = LBound(arr2) To UBound(arr2)
    If UBound(arr2) > 0 And arr2(n) = "NO" Then GoTo M
        arr3(k, 1) = arr(i, 1)
        arr3(k, 2) = arr(i, 2)
        arr3(k, 3) = arr(i, 3)
        arr3(k, 4) = arr2(n)
        arr3(k, 5) = arr(i, 5)
        arr3(k, 6) = arr(i, 6)
        k = k + 1
M:
    Next n
Next i
Range("H1").Resize(UBound(arr3), x) = arr3
End Sub
Не бойтесь совершенства. Вам его не достичь.
 
Еще вариант (по массивнее)  :) . См. файл
Изменено: artemkau88 - 14.10.2021 13:49:52
 
MSi2102, Mershik, artemkau88, спасибо за помощь!!!
 
Msi2102, а можно как-то сделать обратное действие? Т.е. когда у меня для одного сотрудника телефоны записаны в разных строках, указать их (как было в исходнике) в одной строке через запятую?
спасибо.
 
Цитата
Алёна написал: а можно как-то сделать обратное действие?..
Конечно же можно, ежели очень хочется.
Вложением полное решение. А ключевая формула вот:
Код
=ОБЪЕДИНИТЬ(", ";;ТРАНСП(ФИЛЬТР(Table13[Phone];I11=Table13[First Name])))

P/S/ Excel нужен LTSC или 365.
Компьютер никогда не заменит человека (©️ Hannibal Lecter)
 
Алёна,
Код
  group = Table.Group (
    src,
    List.RemoveItems ( Table.ColumnNames ( src ), { "Phone" } ),
    { { "Phone", each Text.Combine ( [Phone], ", " ), type text } }
  )
 
Сергей Евдокимов, в этом- то и проблема - дома все работает так как у меня 365, а вот на рабочей машине стоит 16 версия, а там нет таких функции😢

surkenny, не пойму, куда этот код в макрос писать. Можете, пожалуйста, в моем файле показать, как это работает. Спасибо!
 
Алёна, так Вам Msi2102  не присылал макрос. Это запрос PQ.
 
Цитата
Алёна написал: Сергей Евдокимов ,...там нет таких функции😢
Такие точно есть.
Компьютер никогда не заменит человека (©️ Hannibal Lecter)
 
surkenny, теперь понятно, спасибо! Хотя пока сложно😅
 
Алёна, посмотрите Макрос_1 во вложенном файле:
Изменено: artemkau88 - 25.10.2021 16:30:14
Страницы: 1
Наверх