画像で見た方が分かりやすいと思うので、早速だが下のような表があるものとする。
「日」の列と「時刻」の行で構成されたマトリクス表から「日時」と「名前」の表に組み替えしたい場合。何となく「列のピボット解除」をすれば良さそうなのは分かると思う。
というわけで、まずは「データ範囲」を読み込む。今回はテーブルではないので「先頭行をヘッダーに昇格」も実行する。
ソース = Excel.CurrentWorkbook(){[Name="データ範囲"]}[Content],
昇格されたヘッダー数 = Table.PromoteHeaders(
ソース, [PromoteAllScalars=true]
),
自動的にデータ型の変更もステップに追加されるだろうけど、後で指定し直すことになるのでステップ「変更された型」は削除しておく。
続いて、左端の先頭列以外を選択して「列のピボット解除」を実行。その後にデータ型を変更することで、一覧の日付が増減してもエラーが出なくなる。
ピボット解除された列 = Table.UnpivotOtherColumns(
昇格されたヘッダー数, {"Column1"}, "属性", "値" ),
変更された型 = Table.TransformColumnTypes(
ピボット解除された列,
{
{"Column1", type duration},
{"属性", type datetime},
{"値", type text}
}
),
この時、後で「属性(日付)」と「Column1(時刻)」を足し算をする必要があるので、時刻列は「type duration(期間型)」にしておくこと。「type time(時刻型)」では次のステップでエラーになってしまう。
後は[列の追加]→[カスタム列の追加]で「= [属性]+[Column1]」を実行すればいい。
追加されたカスタム = Table.AddColumn(
変更された型, "日時", each [属性]+[Column1]
),
削除された他の列 = Table.SelectColumns(
追加されたカスタム,{"値", "日時"}
)
整理すると下記の通り。
let
ソース = Excel.CurrentWorkbook(){[Name="データ範囲"]}[Content],
ヘッダーへの昇格 = Table.PromoteHeaders(
ソース, [PromoteAllScalars=true]
),
列のピボット解除 = Table.UnpivotOtherColumns(
ヘッダーへの昇格, {"Column1"}, "日付", "名前" ),
型の変更 = Table.TransformColumnTypes(列のピボット解除, {
{"日付", type datetime},
{"Column1", type duration},
{"名前", type text}
}),
日時列の追加 = Table.AddColumn(
型の変更, "日時", each [日付]+[Column1], type datetime
),
列の選択 = Table.SelectColumns(日時列の追加, {"名前", "日時"})
in
列の選択
もし「時刻」の列が「9」「10」みたいな数値だった場合は、「列のピボット解除」以降のステップを下記に変更。
列の追加 = Table.AddColumn(
列のピボット解除, "Column2",
each #duration(0, [Column1], 0, 0), type duration
),
型の変更 = Table.TransformColumnTypes(列の追加, {
{"日付", type datetime}, {"名前", type text}
}),
日時列の追加 = Table.AddColumn(
型の変更, "日時", each [日付]+[Column2], type datetime
),
列の選択 = Table.SelectColumns(日時列の追加, {"名前", "日時"})