Power QueryでもExcelのように一つ上の行の値を参照することは可能です。Power Queryは列(フィールド)を基本に処理しますが、「一つ上の行の値を参照する方法」を理解しておくと作業の効率化が図れます。
内容:
使用のExcelは「Microsoft® Excel® for Microsoft 365 MSO」(バージョン2403)です。
アウトプットイメージ
下図のように、Power QueryでExcelのように一つ上の行の値を参照します。
事例の前提
Excel ブックの内容を取り込み、PowerQueryエディターの起動
上図左側のExcel表について、「データ」タブの「テーブルまたは範囲から」を用いて、Excel ブックの内容を取り込みしている状態から説明します。
Excel ブックの内容を取り込み、PowerQueryエディターが起動した状態は次のとおりです。下図の画面右側の「適用したステップ」は「変更された型」まで作成され、Excelと同様の表が取り込めています。
なお、上図状態にする基本操作が不明な場合は、【Power Queryの初歩】簡単な事例説明(使いながら覚える最初のポイント) を参考にしてください。
PowerQueryで一つ上の行の値を参照する基本知識
一つ上の行の値を参照するにあたり、PowerQueryの基本知識は次のとおり。
- Excelと異なり、PowerQueryは”0”から始まる連番が基本となる。
「Excelの1行目は、Power Queryの0番目」と理解しておく。 - 上記のPowerQueryエディターの左端にも「Excelの行に該当しそうな1からの連番」がある。ただし、これはデータ数を示しているものと理解しておく。
(PowerQueryエディターの左端の数字と、Excelのセル番地の概念は違う) - テーブルから値を取得する場合の基本は次となる。
テーブル名[フィールド名]{インデックス位置}
例えば、上図の場合で、適用したステップ「変更された型」の結果は表(テーブルの状態)である。この場合、「売上」列の値を以下で参照できる。
1行目の値: 変更された型[売上]{0}
2行目の値: 変更された型[売上]{1}
3行目の値: 変更された型[売上]{2}
以上の基本知識をもとに、以降で具体的な手順を説明する。
なお、補足であるが、変更された型{0}[売上]のように指定の順序を入れ替えても同様の結果が得られる。
詳細: 式、値、および let 式 - PowerQuery M | Microsoft Learn
手順
1.「インデックス列」の追加
Excelでの「行」に相当するものとして、「インデックス列」を追加する。
手順は、「列の追加」タブー「インデックス列」をクリックする。
上記のクリックで、下図のように「追加されたインデックス」という名前のステップが追加される。
このステップで、「インデックス列」フィールドが追加され、0から始まる連番のデータができる。
「Excelでいう1行目が0、2行目が1、…、」となっており、前述の「PowerQueryで一つ上の行の値を参照する基本知識」で示したインデックス位置として利用できる。
2.「カスタム列」の追加で、一つ上の行の値を参照する
「列の追加」タブー「カスタム列」をクリックし、カスタム列の設定画面を表示する。
「カスタム列の式」に、以下を入力する。
上記1の手順で作成されたステップ(適用したステップ)が「追加されたインデックス」であるので
追加されたインデックス[売上]{[インデックス]-1}
※ [インデックス]-1 は、「インデックス」の列の値より、一つ前(上)という意味。
上記でOKをクリックすると、次のようにステップが追加され、一つ上の行の値を参照できている。
1行目の値は、インデックス位置がマイナスを指定となるのでエラーとなる(1行目の作成した「インデックス」が"0"で、”-1”でインデックス位置が負となるため)。
3.余分な「インデックス列」の削除
今回は、最終のアウトプットに「インデックス」の値は不要なので、列を削除して以下として完成。
これで読み込むと、冒頭のアウトプットイメージとなる。
処理の目的によるが、今回は1行目のエラー処理をせず空欄にした事例。必要に応じて、try式等でエラー処理をする。
よくある間違い
テーブルから値を取得する場合の基本は、前述のとおり
テーブル名[フィールド名]{インデックス位置}
である。
Excelの感覚的に、テーブル名(前のステップ名)を指定せず取得できそうなイメージを持ってしまうが、次のようにエラーとなる。
(誤った事例)手順2で、カスタム列の式にステップ名を省略
このようにテーブル名(前のステップ名)を省略した場合、次のエラーとなる。
このエラーメッセージは、以下となっている。
Expression.Error: 値 ○○ を型 List に変換できません。
詳細:
Value=○○
Type=[Type]
これは、「売上」フィールドの値そのもので、この値はテーブルでないのでエラーになっているという状態。
一つ上の行の値を参照する場合は、「前のステップの表(テーブル)」から値を取得するというイメージが必要。
以上、Power Queryで、Excelのように一つ上の行の値を参照する方法でした。
これが理解できると、一つ上だけでなく、下方向や、指定した位置の値を取得できます。
参考:Power Queryで一つ下の値を参照
今回の方法を活用して、複数行ごとの表を1行に変換する事例です。