なんでもエクセル(Nandemo Excel)

何でもエクセルでやってしまう そこのあなた。ようこそ

Power Query:ロットを指定して梱包ラベルを作る

梱包数に合わせてラベルを作る時に必要かもしれない処理。

例えば「55個」の商品を「10個単位」の梱包で分けると「5梱包と余り5個」なので、「10個入梱包×5」と「5個入梱包×1」のラベルが必要。これをクエリでやるとどうなるか。

    ロット = 10,
    個数リスト = Table.FromColumns(
        {{"A社", "B社", "C社", "D社"}, {55, 30, 22, 38}},
        type table[社名=Text.Type, 必要個数=Int64.Type]
    )

会社ごとに必要個数が記入されたテーブルがあるとして、ここからロット(今回は「10」)に合わせてラベル行を作成する。

    梱包列を追加 = Table.AddColumn(個数リスト, "梱包", each
        Number.RoundDown([必要個数]/ロット,0)
    ),
    剰余列を追加 = Table.AddColumn(梱包列を追加, "剰余", each
        Number.Mod([必要個数], ロット)
    ),
    リスト列を追加 = Table.AddColumn(剰余列を追加, "梱包数", each
        List.Repeat({ロット}, [梱包]) & (if [剰余]=0 then {} else {[剰余]})
    ),
    列名の変更 = Table.RenameColumns(リスト列を追加,{{"必要個数", "総数"}}),
    列を選択 = Table.SelectColumns(列名の変更,{"社名", "総数", "梱包数"}),
    リスト展開 = Table.ExpandListColumn(列を選択, "梱包数"),
    型の変更 = Table.TransformColumnTypes(リスト展開, 
        {{"社名", type text}, {"総数", Int64.Type}, {"梱包数", Int64.Type}}
    )

実際にはいちいちこんなことをしなくても

    梱包数列を追加 = Table.AddColumn(
        個数リスト,
        "梱包数",
        each List.Transform(List.Split({1..[本数]}, ロット), List.Count)
    )

とやって展開するだけでもいいと思う。