複数ブック、複数シートをPower Queryで1つの表にする方法(シート整形関数クエリ)
1. 前置き
以前の記事
Power Queryでフォルダからデータを取得するとヘルパークエリが作られますが、この時作られるヘルパークエリは、ファイルを処理するクエリです。
シートがクロス表等で横項目の値が異なる場合は、単純にシートを展開(Table.ExpandTableColumn)できないので、クリック操作では処理ができません。
そこで、以前Power Query Mの詳細エディタでTable.Combineなどを使用し、縦結合するコードを記述する方法を記事にしました。
Power QueryでExcelの複数のシートを縦結合する方法
https://bigarrow.tea-nifty.com/blog/2025/02/post-b425f3.html
本時事で紹介する方法
手動でシート整形関数クエリを作成し、2つのカスタム列の追加で、ブックとシートを処理して結合します。
詳細エディタでコードを書くのは1ヵ所だけなので、上記記事のTable.Combineより操作が簡単です。
しかし、展開ボタンでTable.ExpandTableColumnが使われるので、シートの整形後の表の項目を揃える必要があります。
また、関数クエリ作成後は、関数クエリをPower Queryエディタのクリック操作で編集できなくなります。
これらを回避する場合は、7.関連記事にある 1ヘルパークエリ や Table.Combine を用いる方法 を使用してください。
2. 入力表
| Sheet1 | Sheet2 | ||||||||||||||||||||||||||||||||||||||||
|
|
条件
- 店舗別のブックに1ヶ月1シートの売上実績表があります。
- 1シートの表は次の様に縦に商品、横に日付が並んだクロス表です。
- 年月と日はシリアル値で、表示形式は"yy年mm年"、"d日"です。
(日付けが整数の場合は、Power Queryエディタの[カスタム列の追加]で式に「try #date(Date.Year([年月]), Date.Month([年月]), [属性]) otherwise null」と入力して、日付に変えてください。) - 左上の売上数のセルアドレスはA1です。
- 1つのフォルダに各店舗の売上実績と集計ファイルがあります。それ以外のファイルはありません。
- 集計ファイル名にみに"集計"という文字を含みます。
- 売上実績ブックには、実績以外のシートは入っていません。
横項目は日付なので、シート毎に日付のシリアル値が異なります。なので、通常のフォルダーから取得する方法で"Content"列のBinaryを展開すると、異なるシリアル値のデータが縦に並び、列のデータが揃いません。
3. 出力表
合計/売上、年月
| 店舗 | 商品 | 25/10 | 25/11 | 25/12 | 総計 |
|---|---|---|---|---|---|
| A店 | 商品01 | 6 | 9 | 12 | 27 |
| 商品02 | 9 | 12 | 15 | 36 | |
| 商品03 | 12 | 15 | 18 | 45 | |
| A店 集計 | 27 | 36 | 45 | 108 | |
| B店 | 商品01 | 9 | 12 | 15 | 36 |
| 商品02 | 12 | 15 | 18 | 45 | |
| 商品03 | 6 | 9 | 12 | 27 | |
| B店 集計 | 27 | 36 | 45 | 108 | |
| 総計 | 54 | 72 | 90 | 216 |
4. 手順例
シートの整形クエリの作成
1つのシートをサンプルにしてデータベース形式に変更するクエリを作成します。シートの表の形により手順が異なります。以下の操作は、2.入力表の場合の手順例です。
-
集計ファイルを開き[データ]-[データの取得v]-[ファイルから>]-[Excelブックから]でExcelブックを選択し[インポート]、シートを選択し[データの変換]でPower Queryエディタに取込み、右の名前を'シート整形サンプル'に変更。
-
右の"変更された型"の左の×をクリックして削除。
-
[列の追加]-[条件列]で次のように入力し[OK]。[]は列の選択で入力。
新しい列名:カスタム
列名 :演算子 :値 :出力
[Column1]:指定の値に等しい:売上:[Column2]
それ以外の場合
null -
[列の追加]-[条件列]で次のように入力し[OK]。
新しい列名:カスタム.1
列名 :演算子 :値 :出力
[Column1]:指定の値に等しい:売上:[Column3]
それ以外の場合
null -
"カスタム"列を選択し、Ctrlを押しながら"カスタム.1"列を選択し、[変換]-[フィルv]-[下へ]。
-
[列の追加]-[条件列]で次のように入力し[OK]。
新しい列名:カスタム.2
列名 :演算子 :値 :出力
[Column1]:指定の値に等しい:商品:店舗
それ以外の場合
[カスタム] -
[列の追加]-[条件列]で次のように入力し[OK]。
新しい列名:カスタム.3
列名 :演算子 :値 :出力
[Column1]:指定の値に等しい:商品:年月
それ以外の場合
[カスタム.1] -
"カスタム"列を選択し、Ctrlを押しながら"カスタム.1"列を選択し、右クリックで[列の削除]。
-
[ホーム]-[行の削除v]-[上位の行の削除]で行数に1を入力し[OK]。
-
[変換]-[1行目をヘッダーとして使用v]-[1行目をヘッダーとして使用]。
-
右の最後の"変更された型"の左の×をクリックして削除。
-
"年月"列を選択し、Ctrlを押しながら"店舗"と"商品"列を選択し、[変換]-[列のピボット解除v]-[その他の列のピボット解除]。
-
数式バーの"値"を"売上"に変更。
-
[列の追加]-[カスタム列]で次のように入力し[OK]。
新しい列名:日付
カスタム列の式:= Date.AddDays(#date(1899, 12, 30), Number.FromText([属性]))
解説:Excelの日付のシリアル値(整数)をPower Queryの日付形式に変換する式です。 -
"属性"列を右クリックし[削除]。
-
"年月"列を選択し[変換]-[抽出v]-[範囲]で開始インデックスに2、文字数に5を入れ[OK]。
-
適当な列を選択し、Ctrl+aで全列選択し、[変換]-[データ型の検出]。適切ではない型を右クリックし[型の変更]で再設定し[現在のものを置換]する。(本例では、[売上]を"10進数"に変更。)
注意:全てのシートが同じ項目を持つように成形してください。
修正方法:"シート整形関数"クエリを作成後に"シート整形サンプル"クエリを修正した場合は、修正した箇所のコードを"シート整形関数"クエリに貼り付けてください。
シートの整形関数クエリの作成
前記のクエリを関数クエリに変更します。
- 左の"シート整形サンプル"クエリを右クリックし[複製]、右の名前を"シート整形関数"に変更。
- [ホーム]-[詳細エディタ]で次のように冒頭のコードを変更し[完了]。
let
ソース = Excel.Workbook(File.Contents("サンプルExcelブックのフルパス名"), null, true),
Sheet1_Sheet = ソース{[Item="Sheet1",Kind="Sheet"]}[Data],
追加された条件列 = Table.AddColumn(Sheet1_Sheet, "カスタム", each if [Column1] = "売上" then [Column2] else null),
↓
(_Table as table) =>
let
// ソース = Excel.Workbook(File.Contents("サンプルExcelブックのフルパス名"), null, true),
// Sheet1_Sheet = ソース{[Item="Sheet1",Kind="Sheet"]}[Data],
Sheet1_Sheet = _Table,
追加された条件列 = Table.AddColumn(Sheet1_Sheet, "カスタム", each if [Column1] = "売上" then [Column2] else null),
集計クエリの作成
-
[ホーム]-[新しいソース]-[ファイル>]-[フォルダー]でフォルダを選択し[開く]-[データの変換]、右の名前を"集計"に変更。
-
"Name"列の▼-[テキストフィルタ]-[次の値から始まらない]-[詳細設定]で次を入力し[OK]。
および/または:列:演算子 :値
_____:Name:次の値で始まらない:~$
および:Name:指定の値を含まない:集計
および:Extension:指定の値に等しい:.xlsx -
"Content"とCtrlを押しながら"Name"を選択、右クリックし[他の列の削除]。
-
[列の追加]-[カスタム列]で次のように入力し[OK]。
新しい列名:カスタム
カスタム列の式:= Excel.Workbook([Content], null, true)
解説:Excel.Workbook()は、Excelブックの内容(シート他)を返す関数です。これを次のステップで展開(Table.ExpandTableColumn)することにより、中身が行に展開されます。
-
"カスタム"列の矢印アイコンをクリックし、"Data"、"Item"、"Kind"のみチェックを残し、"元の列名をプレフィックスとして使用します"のチェックを外し[OK]。
-
"Kind"列の▼-[テキストフィルター]-[指定の値に等しい]で値にSheetと入力し[OK]。
-
[列の追加]-[カスタム列]で次のように入力し[OK]。
新しい列名:カスタム
カスタム列の式:= シート整形関数([Data])
解説:展開したシートの内容を関数クエリで1つずつ整形します。これを後のステップで展開(Table.ExpandTableColumn)することにより、中身が行に展開=整形した表が縦に並びます。
注意:Table.Combineではないので、最初のシートに無い項目が後のシートに合っても展開されません。
-
"Content"列を選択し、Ctrlを押しながら"Data"と"Kind"列を選択し、右クリックで[列の削除]。
-
"カスタム"列の矢印アイコンをクリックし、"元の列名をプレフィックスとして使用します"のチェックを外し[OK]。
-
適当な列を選択し、Ctrl+aで全列選択し、[変換]-[データ型の検出]。適切ではない型を右クリックし[型の変更]で再設定し[現在のものを置換]する。(本例では、[売上]を"10進数"に変更。)
-
[ホーム]-[閉じて読み込むv]-[閉じて次に読み込む]で"接続の作成のみ"を選択し[OK]でExcelに戻る。
Excelシートに読み込む
-
右の"クエリと接続"の[クエリ]の"実績"を右クリックし[読み込み先…]で必要な形式を選択し[OK]。
本例では"ピボットテーブル"と"このモデルをデータモデルに追加"を選択し[OK]。 -
ピボットテーブルを選択し[ピボットテーブルのフィールド]-[ピボットテーブル]-[オプション]-[レイアウトと書式]で"更新時に列幅を自動調整する"のチェックを外す。
-
[デザイン]-[レポートのレイアウト]-[表形式で表示]。
-
[デザイン]-[小計v]-[すべての小計をグループの末尾に表示する]。
-
"ピボットテーブルのフィールド"で次のように項目をドラッグする。
列:[年月]。行:[店舗]、[商品]。Σ値:[売上]。 -
データの変更、追加があれば、[データ]-[すべて更新v]-[すべて更新]で更新される。
5. サンプル
C:\Users\Public\Documents に展開します。C:\Users\Public\Documents\251020pqsh の下にファイルが展開されます。
6. 参考情報
表を整形する。ファイルを統合する。両方やらなくっちゃあならないってのがつらいところ、でもない。【Excel Power Query】
https://www.youtube.com/watch?v=PCThHqvQKIU
1シートの複数ブックの結合です。
【Excel パワークエリ】これを見ても、まだコピペでいいなんて言うヤツ……いねぇよなぁ
https://www.youtube.com/watch?v=UapvFSxv2mE
リスト(テータベース)形式の複数シートの複数ブックの結合です。
Power Query:複数のシートのデータを縦結合する(ヘルパークエリ編)
https://nandemo-xl.hatenablog.com/entry/2023/11/14/161634
1ブックの複数シートの結合です。
7. 関連記事
Power Queryで複数の表を結合する方法(まとめ) : 当ブログ : 2025/11/05
https://bigarrow.tea-nifty.com/blog/2025/11/post-341d5f.html
Power Queryで表をリスト形式に整形する方法(まとめ): 当ブログ : 2025/11/06
https://bigarrow.tea-nifty.com/blog/2025/11/post-4925ca.html
複数ブック、複数シートをPower Queryで1つの表にする方法(1ヘルパークエリ): 当ブログ : 2025/11/04
https://bigarrow.tea-nifty.com/blog/2025/11/post-d0f322.html
これがお勧めです。
Excel Power Query Table.Combine を用いた複数ブック、複数シートの縦結合 : 当ブログ : 2025/12/20
https://bigarrow.tea-nifty.com/blog/2025/12/post-60e0ad.htm
シート整形後の各シートの項目が異なっていても結合できますが、ブック名やシート名を残す場合は、少々コードが長くなります。
8. 余談
当初、パラメータの変換と関数の生成を用いてシート整形関数クエリを作成しようとしたのですが、この機能ではパラメータを1つしか渡せないので、クリック操作でヘルパークエリを作ることができませんでした。そこでChatGPTの力を借りて本記事の方法を作成しました。
その後、若干のコードを記述することにより、手動でヘルパークエリを作成する方法が分かりました。それが、1ヘルパークエリ の記事です。ヘルパークエリを使用すると、関数クエリの動作をステップごとに確認し修正できるので保守性が良いです。本記事の関数クエリの仕組みを理解したうえで、1ヘルパークエリの方法を使うと、理解しやすいと思います。










最近のコメント