Страницы: 1
RSS
Транспонирование строк из вертикального массива в горизонтальный
 
Добрый день уважаемые форумчане, в очередной раз требуется Ваша помощь в написании макроса

Есть выгрузка из 1С
Исходные данные на листе AS IS (количество строк может быть больше / меньше, чем указано в примере), то что должно получиться на листе TO BE

Необходимо данные в столбце С транспонировать в строку, сложность заключается в том, что количество строк в столбце С для определенной группы может варьироваться от 4 до 6. После транспонирования, транспонированные строки необходимо удалить, а также столбец С в котором находились транспонированные данные

Буду очень признателен за помощь
Изменено: pinguindell - 04.06.2019 14:22:31
 
Я думаю, что проще всего будет макросом добавить снизу 0...2 пустые строки в каждую группу строк оригинальной таблицы (дополнить до шести строк во всех группах); а затем макросом или помощи Power Querry преобразовать оригинальную таблицу в желаемую плоскую форму.

Сам сделать не возьмусь :)
Изменено: IKor - 04.06.2019 14:42:18
 
См. вариант.
 
Юрий М, как всегда респектище большой ! Спасибо
 
На скорую руку всегда ActiveCell выручал
Изменено: msi2102 - 04.06.2019 15:42:10
 
Главное, чтобы пустых ячеек в столбце "С" не было
 
... и ещё такая карусель:
Код
Option Explicit

Sub abc_xyz()
    Dim x As Long, y As Long, rws As Long
    
    On Error Resume Next
        Application.DisplayAlerts = False
            Sheets("AS IS (2)").Delete
            Sheets("TO BE").Delete
        Application.DisplayAlerts = True
    On Error GoTo 0
    
    Sheets("AS IS").Copy After:=Sheets("AS IS")
    ActiveSheet.Name = "TO BE"
    
    x = 2
    rws = Cells(Rows.Count, "C").End(xlUp).Row
    
    Do Until x > rws
        y = Range("A" & x).End(xlDown).Row
        If y > rws Then y = rws + 1
        
        Range("F" & x).Resize(1, y - x).Value = Application.Transpose(Range("C" & x & ":C" & y - 1).Value)
        Rows(x + 1 & ":" & y - 1).Delete Shift:=xlUp
        
        x = Range("A" & x).End(xlDown).Row
    Loop
    
    For x = 6 To Range("A1").CurrentRegion.Columns.Count
        Cells(1, x).Value = "Pole" & x - 5
    Next
    
    Columns("C:C").Delete Shift:=xlToLeft
End Sub
 
Ну и вариант на PQ до кучи:
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    ChangedType = Table.TransformColumnTypes(Source,{{"Дата", type date}, {"Документ", type text}, {"Операция", type text}, {"Счет", type text}, {"Сумма", type number}}),
    FilledDown = Table.FillDown(ChangedType,{"Дата", "Документ"}),
    GroupedRows = Table.Group(
        FilledDown, 
        {"Дата", "Документ"}, 
        {
            {"Таб2", each Table.SelectRows( Table.SelectColumns(_, {"Счет", "Сумма"}), each ([Счет] <> null)), type table}, 
            {"Таб1", each Table.Transpose(Table.SelectColumns(_, {"Операция"})), type table}, 
            {"Количество", each Table.RowCount(_), type number}
        }),
    Expanded = Table.ExpandTableColumn(GroupedRows, "Таб2", {"Счет", "Сумма"}, {"Счет", "Сумма"}),
    Expanded2 = Table.ExpandTableColumn(Expanded, "Таб1", List.Transform({1..List.Max(Expanded[Количество])}, each "Column" & Text.From(_) )),
    RemovedColumns = Table.RemoveColumns(Expanded2,{"Количество"})
in
    RemovedColumns
Вот горшок пустой, он предмет простой...
 
еще вариант так себе в Power Query
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Filtered Rows" = Table.SelectRows(Source, each ([Документ] <> null)),
    #"Filled Down" = Table.FillDown(Source,{"Документ"}),
    Custom1 = Table.Group(#"Filled Down", {"Документ"}, {{"поле", each Text.Combine(List.Transform(_[Операция], Text.From), "=="), type text}}),
    #"Split Column by Delimiter" = Table.SplitColumn(Custom1, "поле", Splitter.SplitTextByDelimiter("==", QuoteStyle.Csv), {"поле.1", "поле.2", "поле.3", "поле.4", "поле.5", "поле.6", "поле.7", "поле.8", "поле.9", "поле.10"}),
    #"Merged Queries" = Table.NestedJoin(#"Filtered Rows",{"Документ"},#"Split Column by Delimiter",{"Документ"},"Changed Type",JoinKind.LeftOuter),
    #"Removed Columns" = Table.RemoveColumns(#"Merged Queries",{"Операция"}),
    #"Expanded {0}" = Table.ExpandTableColumn(#"Removed Columns", "Changed Type", {"поле.1", "поле.2", "поле.3", "поле.4", "поле.5", "поле.6", "поле.7", "поле.8", "поле.9", "поле.10"}, {"поле.1", "поле.2", "поле.3", "поле.4", "поле.5", "поле.6", "поле.7", "поле.8", "поле.9", "поле.10"})
in
    #"Expanded {0}"
Изменено: artyrH - 05.06.2019 03:44:55
 
artyrH, маленькая просьба, публикуйте код когда прикладываете решение в файле. А то с телефона невозможно его посмотреть. Если уж большая портянка, то можно спрятать под спойлер. Заранее спасибо.
Вот горшок пустой, он предмет простой...
Страницы: 1
Наверх