保守性の高いPowerQueryについて
最近、自分が作ったPowerQueryを人に使ってもらうこともあります。
うちは夏季休暇一斉にとるのではなく、別々に休むから迷惑かけたら申し訳ないと思うと夏季休暇中も仕事に備えなければならない。
■エラーが発生する原因の典型的な例はカラム(特に型の変更)
PowerQueryのカラムが原因でエラーになることが多い。
特にデータソース読込み時に自動で追加されるステップの「変更された型」に要注意。
これの対処はデータ型の変換を必要最小限にしぼり、極力後半のステップで行う。
■列の並び替えもカラムを使う
また、列の並替えにおいても要注意
単に列を並び替えるのではなく
List.InsertRange関数、List.Difference関数、Table.ColumnNames関数を
使う。
= Table.ColumnNames(昇格されたヘッダー数)
これは単にテーブルのすべてのカラムをリスト形式にする。
Table.ColumnNames関数
引数:テーブル
戻り値:リスト
https://learn.microsoft.com/ja-jp/powerquery-m/table-columnnames
= List.Difference(Table.ColumnNames(昇格されたヘッダー数),{"電話番号"})
これはリスト1の中にある項目のうち、リスト2に存在しない項目を返す。
この場合はリスト2が電話番号のみの項目のため、リスト1(※上記画像)の中で電話番号以外の項目を返している
List.Difference関数
引数:リスト1、リスト2
戻り値:リスト
https://learn.microsoft.com/ja-jp/powerquery-m/list-difference
= List.InsertRange(List.Difference(Table.ColumnNames(昇格されたヘッダー数),{"電話番号"}),1,{"電話番号"})
式が長くなって来たけれど、List.InsertRangeの引数に「画像2のリスト」と
「並替えをする位置(この場合は1を指定しているため2番目※0からはじまるので)」と「電話番号のみのリスト」の3つを渡して電話番号を並び替えている。
この関数はリスト2をリスト1のインデックスの位置に挿入するというもの
注意点はリスト1にすでにリスト2の内容があると同じカラムを挿入することになるのでエラーになる。
そのため、List.Differenceで項目(電話番号)を除外している。
List.InsertRange関数
引数:リスト1、インデックス、リスト2
戻り値:リスト
https://learn.microsoft.com/ja-jp/powerquery-m/list-insertrange
= Table.ReorderColumns(昇格されたヘッダー数,List.InsertRange(List.Difference(Table.ColumnNames(昇格されたヘッダー数),{"電話番号"}),1,{"電話番号"}))
最後に、Table.ReorderColumns関数で「画像3のリストの順番」でテーブルを並び替える。
Table.ReorderColumns関数
引数:テーブル、リスト
戻り値:テーブル
https://learn.microsoft.com/ja-jp/powerquery-m/table-reordercolumns
並び替え(旧・新)比較
カラムの並び替えを行うのに、以前はこのように書いていてすべてのカラムが指定されていたので、いずれかに変更・削除が入るとエラーになるが
新の方では電話番号のみとしているため、電話番号以外は変更・削除となってもエラーにはならないのが分かる。
「旧」
= Table.ReorderColumns(昇格されたヘッダー数,{"№", "定価", "お客様氏名", "販売数量", "受注日", "メールアドレス", "電話番号", "郵便番号", "生年月日", "性別", "お住まい", "年齢", "ブログ", "お客様氏名(カナ)", "姓", "名"})
「新」
= Table.ReorderColumns(昇格されたヘッダー数,List.InsertRange(List.Difference(Table.ColumnNames(昇格されたヘッダー数),{"電話番号"}),1,{"電話番号"}))
参考書籍
PowerQueryのM言語についてはこちらの書籍が大変勉強になりました。 M言語というと難しく感じましたが、大変わかりやすく解説されておりました。
この記事が気に入ったらサポートをしてみませんか?