PR

Power Queryでセル結合されたヘッダー行を読み込む

Power Query応用
スポンサーリンク

Excelで作成された表をデータソースとして扱う際、厄介な問題の一つが「セルの結合」です。

特にヘッダー行(見出し行)が2行以上にまたがって結合されているケースは、日本の実務現場では「あるある」ではないでしょうか。例えば、今回取り上げるサンプルのように「寸法」という大項目の下に「幅」「高さ」「奥行」という小項目があるようなケースです。

商品マスタ

人間が見る分には分かりやすいですが、システムからは扱いにくいです。そのまま読み込むと、セル結合した部分がnullになったりします。

セル結合した部分がnullになる

本記事では、添付の「商品マスタ」を例に、セル結合された2行のヘッダー行を、Power Queryを使ってきれいに1行のヘッダーとして読み込むテクニックを解説します。

基本機能である「入れ替え」と「フィル」を組み合わせて実装します。

本記事のExcelは次のバージョンを使用しています。
Microsoft® Excel® for Microsoft 365 MSO (バージョン 2510 ビルド 16.0.19328.20244) 64 ビット

スポンサーリンク

サンプルデータ

次の商品マスタをサンプルデータとして使用します。

商品マスタ

サンプルデータはこちらからダウンロードしてください。

ポイント:

  • 1行目に「商品マスタ」というタイトルがある(不要な行)。
  • 2行目と3行目がヘッダーになっている。
  • 2行目のE列「寸法」は、Excel上ではE・F・G列に結合されていた。
  • 3行目に「幅」「高さ」「奥行」の詳細項目がある。

目指すゴール:

これらを以下のような1行のヘッダーを持つテーブルに変換します。

商品コード | 商品名 | 商品分類 | 寸法_幅 | 寸法_高さ | 寸法_奥行 | 単価


スポンサーリンク

実際の手順

それでは、Power Queryエディタでの操作手順をステップバイステップで解説します。

手順1:加工されていない状態に戻す

まず、データを読み込んだ直後の状態を確認します。「昇格されたヘッダー行」、「変更された型」というステップが自動的に作成されていることがあります。

データを読み込んだ直後

加工されていない状態から始めたいので、「昇格されたヘッダー行」、「変更された型」のステップが作成されている場合は、右側の「適用したステップ」から削除します。

加工されていない状態に戻す

加工されていない状態になりました。

加工されていない状態

手順2:不要な上位行を削除する

今回のデータでは、1行目の「商品マスタ」タイトルは不要です。行削除します。
「ホーム」タブー「行の削除」ー「上位の行の削除」をクリックします。

上位の行の削除

「行数」に「1」を入力し、OKをクリックします。

1行目を削除

これで、1行目に商品コード、2行目に幅、高さ、奥行が来る状態になりました。

1行目が削除された状態

手順3:行と列を入れ替える

Power Queryには「下方向へコピー(フィル)」する機能はありますが、「右方向へコピー」する機能はありません。

そこで、一度テーブル全体を回転させて、列を行に変換します。
「変換」タブー「入れ替え」をクリックします。

行と列の入れ替え

すると、データの向きが90度回転します。

これまで「ヘッダー行」だったものが、現在は「Column1」「Column2」という「列」になっているはずです。

入れ替えた結果

手順4:null値を埋める(下方向へコピー)

行列を回転させたことで、Excelのセル結合によって発生していた null(空欄)が縦に並びました。これで下方向へコピーするフィルが使えます。

「変換」タブー「フィル」ー「下へ」をクリックします。

下へフィル

これで、「寸法」の下にあった null が「寸法」で埋まりました。
寸法, 寸法, 寸法 と3つ並んだ状態になります。

下へフィルした結果

手順5:2つの列を結合して新しいヘッダー名を作る

次に、ヘッダー行の大項目(Column1)と小項目(Column2)を合体させます。

「Column1」、「Column2」を列選択(クリック)し、「変換」タブー「列のマージ」をクリックします。

列のマージ

「区切り記号」を「カスタム」に選択し、「_」を入力します。※_はアンダースコア
OKをクリックします。

アンダースコアで区切って列のマージ

これで 寸法_幅、寸法_高さ といった、新しい列名が1つの列に完成しました。

列のマージされた結果

手順6:不要なアンダースコアを削除する

商品コード_ のように、小項目がないものは後ろに記号がつきますので、削除した方がキレイです。

適用したステップで新たにステップを作成します。
「結合された列」を右クリックし、「後にステップの挿入」をクリックします。

後にステップの挿入

作成したステップの式を入力します。

アンダースコアを除去する式の入力

Table.TransformColumns関数を使って、列の値を変更します。
if文で条件分岐させています。文字の最後にアンダースコアがついている場合は、アンダースコアを除外し、それ以外はそのままの値にしています。

= Table.TransformColumns(
    結合された列,
    {"結合済み", each if Text.EndsWith(_, "_") 
                     then Text.Start(_, Text.Length(_) - 1) 
                     else _}
)

手順7:行と列を元に戻す

ヘッダー名の準備が整ったので、テーブルの向きを元に戻します。
「変換」タブー「入れ替え」をクリックします。

行と列の入れ替え

これで、1行目に整形されたヘッダー名が並んだ状態に戻りました。

入れ替えた結果

手順8:ヘッダーに昇格させる

最後に、作成した1行目をヘッダーとして使用します。
「ホーム」タブー「1行目をヘッダーとして使用」をクリックします。

1行目をヘッダーとして使用

これで完成です。

1行目をヘッダーとして使用した結果

手順9:Excelにデータ出力する

これまでデータ加工した結果をExcelにデータ出力します。
「ホーム」タブー「閉じて読み込む」をクリックします。

閉じて読み込む

セル結合したヘッダー行を1行に整形したデータに出力できました。

データ出力結果
スポンサーリンク

補足と注意点:パフォーマンスについて

今回紹介した「入れ替え」を使う方法は、視覚的に分かりやすく、ステップごとの変化が理解しやすいため、最も推奨される方法です。

ただし、「入れ替え」はデータ量が多い場合、処理負荷が高いという弱点があります。

データ行数が多い場合のアプローチ

もし、読み込むデータが何十万行もある場合、データ部分まで含めてすべて「入れ替え」を行うと、プレビューや更新に時間がかかる可能性があります。

その場合は、以下のように工夫することで回避できます。

  1. 上位の行を保持: 最初に「上位の行を保持」でヘッダー部分だけを残したクエリを作成し、そこで「入れ替え」等のヘッダー作成処理を行う。
  2. データ部分の分離: 別のクエリでデータ部分(ヘッダー行を除去したもの)を作成する。
  3. ヘッダーの適用: Table.DemoteHeadersTable.RenameColumns 等の関数を使い、1で作ったヘッダーリストを2のデータに適用する。

とはいえ、通常の商品マスタ(数千〜数万行程度)であれば、今回紹介した手順で全く問題ありません。まずは「入れ替え&フィル」のパターンをマスターしましょう。

スポンサーリンク

まとめ

Power Queryで「セル結合されたヘッダー」を扱う手順をおさらいします。

  1. 加工されていない状態に戻す
  2. 不要な行を削除し、ヘッダー行を最上部に持ってくる。
  3. 入れ替えで、列を行にする。
  4. フィル(下)で、結合によって生じた null を埋める。
  5. 列のマージで、大項目と小項目を繋ぐ。
  6. 再び入れ替えで元に戻す。
  7. ヘッダーに昇格させる。
Power Queryの学習に役立つおすすめ本
初心者向け 初心者~中級者向け 中級者~上級者向け
Power Query応用
スポンサーリンク
プロフィール
たがみ

IT業界20年程度のシステムエンジニアです。
構築したシステムのデータ検証をExcelで実施することが多く、検証作業の効率化を模索しているときにPower Queryと出会いました。
Excel業務効率化の手助けになればと当ブログを開設しました。
今ではデータ分析でPower BIを活用しており、Power BI、Excelの両方でPower Queryを活用しています。

たがみをフォローする
シェアする
たがみをフォローする
タイトルとURLをコピーしました