Страницы: 1
RSS
Как нормализировать (flat) таблицу?
 
Добрый день. У меня имеется выгрузка отвратительнейшего формата. Она ужасна и по структуре и по виду и по частоте предоставления. Я не представляю как ее можно сделать вменяемым плоским видом.
Задача - сделать плоскую таблицу по дням. Пример в приложении и на пером листе одна строчка желтого цвета желаемого результата. Файл выгружается ежедневно. Столбцы постоянно едут. Количество именно дней что-то около двух недель, но это не точно. Собирать надо данные со всех листов в один единый массив. В данный момент в папке лежит пара сотен файлов с повторяющимися данными. Я смог макросом наковырять данных, но все рушится при проверке дат, не тех столбцов и тд. Не получилось короче.
Буду рад любым предложением решения. Если задача слишком сложная, то прошу перенести в платный раздел.
Изменено: Валерий Кишин - 10.04.2023 14:05:10
 
Валерий Кишин, PQ в помощь. Но я даже не буду пытаться это сделать бесплатно: слишком долго (не 10 минут) + много нюансов, о которых нет упоминания в вопросе.
 
Цитата
surkenny написал:
не буду пытаться это сделать бесплатно
Так, ясно, подождем. А какие нюансы дополнительные стоит указать?
 
Код
Option Explicit

Sub FlatActiveSheet()
    Dim arr As Variant
    arr = FlatArray(Range("A3:AF20"))
    
    With Workbooks.Add(1).Sheets(1).Cells(1, 1).Resize(UBound(arr, 1), UBound(arr, 2))
        .Value = arr
    End With
End Sub

Private Function FlatArray(rr As Range) As Variant
    
    Dim arr As Variant
    Dim yy As Long
    Dim xx As Long
    Dim uu As Long
    Dim brr As Variant
    arr = rr.Value
    ReDim brr(1 To UBound(arr, 1) * UBound(arr, 2), 1 To 5)
    
    Dim s1 As String
    For yy = 2 To UBound(arr, 1)
        If rr.Cells(yy, 1).Interior.Color <> 16777215 Then
            s1 = arr(yy, 1)
        Else
            For xx = 3 To UBound(arr, 2)
                uu = uu + 1
                brr(uu, 1) = s1
                brr(uu, 2) = arr(yy, 1)
                brr(uu, 3) = arr(yy, 2)
                brr(uu, 4) = arr(1, xx)
                brr(uu, 5) = arr(yy, xx)
            Next
        End If
    Next
    
    FlatArray = brr
End Function
 
Код
let
    Source = Excel.Workbook(File.Contents("путь_к_файлу"), null, true),
    sheets = Table.SelectRows(Source, each not Text.Contains([Name], "Print")),
    fx_gas = (t as table) as table =>
    let        
        r_top = Table.Skip(t,2),
        promote = Table.PromoteHeaders(r_top, [PromoteAllScalars=true]),
        c1 = Table.AddColumn(promote, "col1", each if [марка топлива] = null then [Column1] else null),
        fd = Table.FillDown(c1,{"col1", "Column1"}),
        fd1 = Table.SelectRows(fd, each ([марка топлива] <> null)),
        rc = Table.RenameColumns(fd1,{{"Column1", "col2"}}),
        cols = 
            List.Select(
                List.Difference(
                    Table.ColumnNames(rc), {"col1", "col2", "марка топлива"}
                ),
                each not (try Date.From(_))[HasError]
            ),
        res = Table.SelectColumns(rc, {"col1", "col2", "марка топлива"} & cols),
        unpivot = Table.UnpivotOtherColumns(res, {"col1", "col2", "марка топлива"}, "дата", "цена")
    in unpivot,
    z = Table.Distinct(Table.Combine(Table.TransformColumns(sheets, {"Data", fx_gas})[Data]))
in
    z
Пришелец-прораб.
 
МатросНаЗебре,
Увы, не решает задачу многих файлов, разных диапазонов, только дат и проверки на наличие повторов
Страницы: 1
Наверх