Страницы: 1
RSS
Автоматическое отображение заголовков и подзаголовков таблицы при много уровневой структуре, Как добиться автоматического отображения заголовков и подзаголовков таблицы при много уровневой структуре
 
Есть таблица с большим количеством строк, которая имеют многоуровневый принцип. Данные в этой таблице периодически заполняются и меняются. Часть строк является своего рода заголовками, часть - подзаголовками и т.д. и не имеют изменяемых значений. А бОльшая часть строк является позициями с изменяемыми данными.
Задача, решение которой упростила бы жизнь, многим инженерам-строителям следующая.
Как автоматически отобразить строку - заголовок, подзаголовок и т.д. при внесении данных в строку с данными.
Искал на разных форумах, соответствующих сайтах, но так и не смог ничего путного найти. Наверное, в первую очередь потому, что очень трудно кратко сформулировать суть того что хочется получить. Какие формулы можно применить тоже не смог сообразить.
Поэтому прошу помощи знающих людей.
В прикрепленном файле я приложил очень упрощенный вариант, тог с чем приходится иметь дело. Но если понять принцип, то можно будет его применить для любого количества данных и уровней.
На вкладке "исходный вид" - то, что вбивается вручную. На вкладке "итоговый вид", то что хочется получить в итоге.
 
И еще момент. Не получится один раз заморочиться и вручную задать принцип, по которому будет структурирована таблица, поскольку строки регулярно удаляются и добавляются. Избежать удаления и дополнения нет возможности.
 
Фильтр по столбцу D "равно 1" (или "больше 0") и "(Пустые)"даёт похожий результат.
 
Ну нет же. Если бы все было так просто. Ниже подзаголовка "2" нет ни одной позиции со значением. Поэтому и необходимости в его отображении нет. Но при этом есть позиции со значениями в подзаголовках "1", "3"; "4" их отражать нужно.
 
PQ
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    selector = (tbl as table) =>
        [rows = List.Buffer(Table.ToRecords(tbl)),
        acc = List.Accumulate(
            rows,
            {}, 
            (s, c) => s & 
                (if not List.Contains({0, null}, c[#"Кол-во"]) 
                or 
                    List.PositionOf(
                        s, c[#"Поз."], Occurrence.First, 
                        (x, y) => Text.StartsWith(x, y)
                    ) <> -1 
                then {c[#"Поз."]} else {})
        )][acc],
    levels = Table.Group(
        Source, "Поз.", 
        {{"lvl", each selector(Table.Sort(_, {"Поз.", Order.Descending}))}}, GroupKind.Local, 
        (s, c) => Byte.From(Text.Start(s, 1) <> Text.Start(c, 1))
    ),
    selected = List.Buffer(List.Combine(levels[lvl])),
    z = Table.SelectRows(Source, (x) => List.Contains(selected, x[#"Поз."]))
in
    z

и попроще вариант (пришел на ум, когда заканчивал вариант 1)
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    has_value = List.Buffer(Table.SelectRows(Source, each not List.Contains({0, null}, [#"Кол-во"]))[#"Поз."]),
    selected = Table.SelectRows(
        Source,
        (x) => List.PositionOf(has_value, x[#"Поз."], Occurrence.First, (x, y) => Text.StartsWith(x, y)) <> -1
    )
in
    selected
Изменено: AlienSx - 06.12.2023 14:48:13 (вариант 2)
Пришелец-прораб.
 
Как вариант допстолбец
=СУММПРОИЗВ(D$2:D$36*(ЛЕВСИМВ(A$2:A$36&".";ДЛСТР(A2)+1)=A2&"."))>0
и по нему фильтр
 
Павел \Ʌ/, огромнейшая благодарность. Именно то, что нужно. Не до конца понял формулу, но смог ее приспособить для разного рода таблиц. Работает лучше всех ожиданий.
Страницы: 1
Наверх