shikumika’s diary

日々の事務作業で手間なことを簡単にできる仕組み(自動化、方法など)、困ったことの解決方法を調べた備忘録

【Power Query】Excelのように一つ上の行の値を参照する方法

Power QueryでもExcelのように一つ上の行の値を参照することは可能です。Power Queryは列(フィールド)を基本に処理しますが、「一つ上の行の値を参照する方法」を理解しておくと作業の効率化が図れます。

内容:

使用のExcelは「Microsoft® Excel® for Microsoft 365 MSO」(バージョン2403)です。

アウトプットイメージ

下図のように、Power QueryでExcelのように一つ上の行の値を参照します。

一つ上の行のセルの値を参照するイメージ

Power QueryでExcelのように一つ上の行の値を参照

事例の前提

Excel ブックの内容を取り込み、PowerQueryエディターの起動

上図左側のExcel表について、「データ」タブの「テーブルまたは範囲から」を用いて、Excel ブックの内容を取り込みしている状態から説明します。

Excel ブックの内容を取り込み、PowerQueryエディターが起動した状態は次のとおりです。下図の画面右側の「適用したステップ」は「変更された型」まで作成され、Excelと同様の表が取り込めています。

「ソース」と「変更された型」のステップが自動作成されている状態

Excel ブックの内容を取り込み、PowerQueryエディターが起動した状態

なお、上図状態にする基本操作が不明な場合は、【Power Queryの初歩】簡単な事例説明(使いながら覚える最初のポイント) を参考にしてください。

PowerQueryで一つ上の行の値を参照する基本知識

一つ上の行の値を参照するにあたり、PowerQueryの基本知識は次のとおり。

  • Excelと異なり、PowerQueryは”0”から始まる連番が基本となる。
    「Excelの1行目は、Power Queryの0番目」と理解しておく。
  • 上記のPowerQueryエディターの左端にも「Excelの行に該当しそうな1からの連番」がある。ただし、これはデータ数を示しているものと理解しておく。
    PowerQueryエディターの左端の数字と、Excelのセル番地の概念は違う
  • テーブルから値を取得する場合の基本は次となる。
    テーブル名[フィールド名]{インデックス位置}
    例えば、上図の場合で、適用したステップ「変更された型」の結果は表(テーブルの状態)である。この場合、「売上」列の値を以下で参照できる。

    行目の値: 変更された型[売上]{0}

    行目の値: 変更された型[売上]{1}

    行目の値: 変更された型[売上]{2}

    このようにインデックス位置の数字で指定できる。

以上の基本知識をもとに、以降で具体的な手順を説明する。

なお、補足であるが、変更された型{0}[売上]のように指定の順序を入れ替えても同様の結果が得られる。

詳細: 式、値、および let 式 - PowerQuery M | Microsoft Learn

手順

1.「インデックス列」の追加

Excelでの「行」に相当するものとして、「インデックス列」を追加する。

手順は、「列の追加」タブー「インデックス列」をクリックする。

「列の追加」タブー「インデックス列」をクリック

「インデックス列」の追加

上記のクリックで、下図のように「追加されたインデックス」という名前のステップが追加される。

このステップで、「インデックス列」フィールドが追加され、0から始まる連番のデータができる。

「Excelでいう1行目が0、2行目が1、…、」となっており、前述の「PowerQueryで一つ上の行の値を参照する基本知識」で示したインデックス位置として利用できる。

「インデックス列」フィールドが追加され、0から始まる連番が追加されている

「インデックス列」の追加後のイメージ

 

2.「カスタム列」の追加で、一つ上の行の値を参照する

「列の追加」タブー「カスタム列」をクリックし、カスタム列の設定画面を表示する。

「カスタム列の式」に、以下を入力する。

上記1の手順で作成されたステップ(適用したステップ)が「追加されたインデックス」であるので

追加されたインデックス[売上]{[インデックス]-1}

[インデックス]-1 は、「インデックス」の列の値より、一つ前(上)という意味。

「列の追加」タブー「カスタム列」をクリックして表示

カスタム列の設定画面

上記でOKをクリックすると、次のようにステップが追加され、一つ上の行の値を参照できている。

1行目の値は、インデックス位置がマイナスを指定となるのでエラーとなる(1行目の作成した「インデックス」が"0"で、”-1”でインデックス位置が負となるため)。

1行目の値は、インデックス位置がマイナスを指定となるのでエラーとなる

カスタム列の追加結果

3.余分な「インデックス列」の削除

今回は、最終のアウトプットに「インデックス」の値は不要なので、列を削除して以下として完成。

これで読み込むと、冒頭のアウトプットイメージとなる。

処理の目的によるが、今回は1行目のエラー処理をせず空欄にした事例。必要に応じて、try式等でエラー処理をする。

よくある間違い

テーブルから値を取得する場合の基本は、前述のとおり

テーブル名[フィールド名]{インデックス位置}

である。

Excelの感覚的に、テーブル名(前のステップ名)を指定せず取得できそうなイメージを持ってしまうが、次のようにエラーとなる。

(誤った事例)手順2で、カスタム列の式にステップ名を省略

列名のみ指定している

誤った事例(カスタム列の式でステップ名を省略)

このようにテーブル名(前のステップ名)を省略した場合、次のエラーとなる。

「Expression.Error: 値 ○○ を型 List に変換できません。」のエラー

ステップ名を省略したときのエラーの画面

このエラーメッセージは、以下となっている。

Expression.Error: 値 ○○ を型 List に変換できません。
詳細:
    Value=○○
    Type=[Type]

これは、「売上」フィールドの値そのもので、この値はテーブルでないのでエラーになっているという状態。

一つ上の行の値を参照する場合は、「前のステップの表(テーブル)」から値を取得するというイメージが必要。

以上、Power Queryで、Excelのように一つ上の行の値を参照する方法でした。

これが理解できると、一つ上だけでなく、下方向や、指定した位置の値を取得できます。

参考:Power Queryで一つ下の値を参照

今回の方法を活用して、複数行ごとの表を1行に変換する事例です。

shikumika.org