Страницы: 1
RSS
Как сделать плоскую таблицу из сгруппированных блоков
 
Здравствуйте.
Есть огромный прайс-лист (фрагмент в приложенном примере), данные в котором сгруппированы в блоки вида:

ПРОИЗВОДИТЕЛЬ 1
Модель 1
Размер 1 модели 1
Размер 2 модели 1
...
Размер N модели 1
Модель 2
Размер 1 модели 2
...
Размер N модели 2

ПРОИЗВОДИТЕЛЬ 2
и т.д.

Всю голову сломал как сделать макрос, который из этой таблицы делал бы обычную плоскую вида:
ПРОИЗВОДИТЕЛЬ 1 | Модель 1 | Размер 1 модели 1
ПРОИЗВОДИТЕЛЬ 1 |  Модель 1 | Размер 2 модели 1
...
ПРОИЗВОДИТЕЛЬ 1 | Модель 1 | Размер N модели 1
ПРОИЗВОДИТЕЛЬ 1 | Модель 2 | Размер 1 модели 2
...
ПРОИЗВОДИТЕЛЬ 1 | Модель 2 | Размер N модели 2
ПРОИЗВОДИТЕЛЬ 2 | Модель 1 | Размер 1 модели 1
и т.д.

Единственное,  что приходит в голову - как то использовать при создании плоской  таблицы факт, что ячейки с названием производителя, модели и размера  имеют разную заливку. Но как? Или это по другому как-нибудь сделать?
Прошу помощи.
 
Цитата
Neuro75 написал:
как то использовать при создании плоской  таблицы факт, что ячейки с названием производителя, модели и размера  имеют разную заливку.
Правильная мысль вам приходит в голову
Цитата
Neuro75 написал:
Но как?
Макросом.
Заливка ячейки определяется
Код
a=Cells(i, 1).Interior.Color
Изменено: Михаил Витальевич С. - 14.02.2019 03:51:09
 
Кросс
 
Вариант на Power Query. Разбивка основана на уровнях группировки без них работать не будет. Перед обработкой прайс необходимо пересохранить в формат xlsx, иначе скрипт не сработает. Все спасибы как всегда Максиму Зеленскому за супер-функцию.
Как пользоваться: в табличку пишем путь к прайсу, далее по рыжей табличке жмем ПКМ и выбираем пункт обновить. Решение работает только в Excel 2016/2019 либо в 2010/2013 с установленной надстройкой PowerQuery.
Вот горшок пустой, он предмет простой...
 
тоже PQ почти кнопками
 
В принципе именно такую структуру можно разобрать и без той функции:
Код
// Таблица1
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Removed Columns" = Table.RemoveColumns(Source,{"Столбец2"}),
    #"Removed Top Rows" = Table.Skip(#"Removed Columns",3),
    #"Renamed Columns" = Table.RenameColumns(#"Removed Top Rows",{{"Столбец3", "Цена"}, {"Столбец4", "Ед."}, {"Столбец1", "Наименование"}}),
    #"Added Index" = Table.AddIndexColumn(#"Renamed Columns", "Индекс", 1, 1),
    #"Added Custom" = Table.AddColumn(#"Added Index", "IsGoods", each if [Цена]<>null then [Индекс] else null),
    #"Filled Up" = Table.FillUp(#"Added Custom",{"IsGoods"}),
    #"Inserted Subtraction" = Table.AddColumn(#"Filled Up", "LvlBack", each [IsGoods]-[Индекс] , type number),
    #"Removed Columns1" = Table.RemoveColumns(#"Inserted Subtraction",{"Индекс", "IsGoods"}),
    #"Added Index1" = Table.AddIndexColumn(#"Removed Columns1", "Индекс", 0, 1),
    #"Pivoted Column" = Table.Pivot(Table.TransformColumnTypes(#"Added Index1", {{"LvlBack", type text}}, "ru-RU"), List.Distinct(Table.TransformColumnTypes(#"Added Index1", {{"LvlBack", type text}}, "ru-RU")[LvlBack]), "LvlBack", "Наименование"),
    #"Sorted Rows" = Table.Sort(#"Pivoted Column",{{"Индекс", Order.Ascending}}),
    #"Filled Down" = Table.FillDown(#"Sorted Rows",{"3", "2", "1", "0"}),
    #"Filtered Rows" = Table.SelectRows(#"Filled Down", each ([#"Ед."] = "пар")),
    #"Removed Other Columns" = Table.SelectColumns(#"Filtered Rows",{"3", "2", "1", "0", "Цена", "Ед."}),
    #"Changed Type" = Table.TransformColumnTypes(#"Removed Other Columns",{{"3", type text}, {"2", type text}, {"1", type text}, {"0", type text}, {"Ед.", type text}, {"Цена", type number}})
in
    #"Changed Type"

Михаил Витальевич С., мне думается, здесь скорее подойдёт Row.OutlineLevel
F1 творит чудеса
 
Огромное спасибо, что отозвались, буду пробовать предложенные варианты.
 
Цитата
Максим Зеленский написал:
здесь скорее подойдёт Row.OutlineLevel
Тоже можно, но не обязательно "скорее".
Для PQ - может может быть; для макроса - без разницы; тем более, что группировки может и не быть (впрочем, может быть группировка и не быть заливки...)
Страницы: 1
Наверх