shikumika’s diary

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

【Power Query】複数行ごと(例外あり)の表を一行に変換する方法 

Power Queryで複数行ごとの表を1行に変換する事例として、繰り返しの行数が変動する場合の対応事例です。

繰り返しの行数が固定の場合は、【Power Query】複数行ごとの表を1行に変換(一つ下の値を参照)をご覧ください。

内容:

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

アウトプットイメージ

下図左側のように、基本的な項目パターンは一致するものの、2行や3行のデータ、空白行があるような例外がある表を右側の一行に変換します。

「NO」列の値で、1件のレコードとして複数行をまとめます。

基本的な項目パターンは一致するが、2行や3行のデータ、空白行がある

Power Queryで複数行ごと(例外あり)の表を一行に変換

Excelのみを用いた場合の処理事例は次のとおりで、この内容をPowerQueryで実現する方法です。

shikumika.org

PowerQueryの設定イメージ

この事例で、複数行ごと(例外あり)の表を一行に変換するPowerQueryの設定イメージは、次のとおりです。「ピボット解除」や「フィル」の機能を用いて13ステップの事例です。

なお、処理対象のデータ状況によりますが、Tableの値を参照するカスタム列を一つずつ追加する方法もあります(カスタム列の設定数が少ない場合は適している見込)。この方法は、【Power Query】グループごとのTableから値取得する事例で紹介しています。

合計13ステップの設定をします

PowerQueryの設定イメージ

基本知識

基本知識として、次の「列のピボット解除で、単票形式のExcelシートからセルの値を抽出」と同様の手順が多くあります。

この事例では、初めに下記と同様なデータ状態として処理をしていますので、随時参照してください。

shikumika.org

具体的な手順

冒頭のアウトプットイメージ左側のExcelファイルを前提に以下説明します。

1.対象のデータをPowerQueryに取り込み

Excelの「データ」タブから「テーブルまたは範囲から」をクリック、対象のデータをPowerQueryに取り込む。

取り込んだデータがPowerQueryエディターで次のように表示される。

設定によるが「変更された型」までのステップが自動作成されている

PowerQueryエディターにデータ取り込み後イメージ

なお、PowerQueryに取り込む方法が不明な場合は、【Power Queryの初歩】簡単な事例説明(使いながら覚える最初のポイント) を参考にする。

2.同じ1件を識別するため「NO」列の値を「フィル」で埋める

「NO」列の値で1件分のデータを識別したいが「空白」の値もある。空白の値は「フィル」機能を使用して「上と同じ値」を入力する。

「NO」列に下方向のフィルを実施した結果が次のとおり。

「NO」列の空白に「上と同じ値」が反映されている

「NO」列に下方向のフィルを実施した結果

なお、フィルの詳細が不明な場合は、【Power Query】空白セルがある場合に「上のセルと同じ値」を一括入力を参考にする。

3.1件分のレコードごとの「Table」を作成

1件分のレコードをまとめるため、「グループ化」機能で、「NO」列が同じ値ごとのテーブルを作成する。

具体的には、「変換」タブの「グループ化」をクリックし、設定画面で以下とする。

  • グループ化する列を「NO」列に設定
  • 「新しい列名」は適当な名称(事例では、”グループ別テーブル”としている)
  • 「操作」の欄は「すべての行」

「NO」列を対象に、新しい列に「すべての行」を設定している

「グループ化」の設定例

上記で「操作」の欄に「すべての行」を設定しているので、グループ化したデータが次のように「Table」に変換される。

「NO」列でグループ化され、その他は「Table」になっている

「グループ化」の設定イメージ

なお、上図のとおり、該当の「Table」を選択すると、PowerQueryエディターの画面下に「Table」内容を確認することができる(上図は1行目の「Table」を選択した状態)

4.1件分のレコードごとの「Table」に行の位置を示すインデックス追加

「Table」を1行に展開する準備として、行の位置を示すインデックスを追加する。

具体的には、「カスタム列」で以下を追加する。

Table.AddIndexColumn([グループ別テーブル],"行",1)

補足: ”グループ別テーブル”は「Table」がある列名
    ”行”は追加するインデックスの列名

以下は、「新しい列名」を”グループ別テーブルの変換”とした設定例。

カスタム列の式: Table.AddIndexColumn([グループ別テーブル],"行",1) 

「カスタム列」の設定イメージ

上記の設定により、次のように「新しい列名」を”グループ別テーブルの変換”が追加され、「行番号(インデックス)が付与された「Table」ができる。

なお、Tableごとに行が1から始まる連番が付与されている。

Tableごとに行が1から始まる連番が付与されている

行番号(インデックス)が付与された「Table」の作成イメージ

5.余分な列を削除する

処理の結果、「グループ別テーブルの変換」のデータに、「NO」列、「グループ別テーブル」列の情報は含まれている。余分なので、「NO」列、「グループ別テーブル」列を削除する。

「NO」列、「グループ別テーブル」列を削除している

「グループ別テーブルの変換」のみ残した状態

6.行位置を含む「Table」を展開する

前手順で残した「グループ別テーブルの変換」を展開する。

なお、展開の設定は次のとおり。

「すべての列の選択」のチェックをつける。
・「元の列名をプレフィックスとして使用します」のチェックを外す。

展開により、次のように同じ1件のレコードを示す「NO.1」列と「行」列が追加された状態になる。

同じ1件のレコードを示す「NO.1」列と「行」列が追加されている

行位置を含む「Table」の展開例

7.列のピボット解除でExcelセルの値を抽出する方法と同様処理

前手順で、基礎知識の「列のピボット解除で、単票形式のExcelシートからセルの値を抽出」と同様のデータ状態になっている。

以降の手順は、次のページで「その他の列のピボット解除」と同様に処理することで、冒頭のアウトプットが可能。

shikumika.org

以上、Power Queryで複数行ごと(例外あり)の表を1行に変換する事例でした。