ゴールのイメージを先にそろえる
今回のテーマは「毎回レイアウトは同じだけど、ブック名や中身だけ変わるExcelファイルから、“必ず1枚目のシートだけ”をPower Queryで取り込む実務テンプレ」です。
たとえば、毎月こんなブックが届くイメージです。
- 売上_2024-01.xlsx
- 売上_2024-02.xlsx
- 売上_2024-03.xlsx
中身はどれも「1枚目のシートにだけデータが入っている」。
この「1枚目固定」を前提に、Power Queryで安定して取り込む方法を、初心者向けにかみ砕いて説明します。
基本の考え方:ブック全体 → 1枚目のシートを選ぶ
Excel.Workbook で「ブックの中身一覧」をテーブル化する
Power QueryでExcelファイルを読むとき、裏側ではだいたい次のような関数が使われます。
Excel.Workbook(File.Contents("C:\Data\売上_2024-01.xlsx"), null, true)
この Excel.Workbook は、「ブックの中のシート・テーブル・名前付き範囲などを一覧にしてくれる関数」です。
戻り値はテーブルで、こんな列を持っています。
- Name(シート名やテーブル名)
- Data(そのシートやテーブルの中身そのもの)
- Item / Kind / Hidden などの情報
ここで一番大事なのは「Data」列です。
この列の中に、各シートの中身が“入れ子のテーブル”として格納されています。
「1枚目のシート」を選ぶという発想
「1枚目固定取込」というのは、言い換えると「Excel.Workbookで一覧化した結果の、先頭行のDataを使う」ということです。
Mコードで書くと、イメージはこうなります。
let
Source = Excel.Workbook(
File.Contents("C:\Data\売上_2024-01.xlsx"),
null,
true
),
FirstSheetRow = Source{0}, // 0番目の行(先頭行)を取り出す
FirstSheetTable = FirstSheetRow[Data] // その行の Data 列(中身のテーブル)を取り出す
in
FirstSheetTable
ここで {0} は「0番目の行(先頭)」という意味です。
Excelの行番号は1から始まりますが、M言語のインデックスは0から始まる、という点だけ注意してください。
例題:毎月届く「売上ブック」の1枚目だけを取り込む
想定するブック構造
たとえば、売上_2024-01.xlsx の中身がこうだとします。
- シート1:売上明細(ここにだけデータがある)
- シート2:注意事項
- シート3:集計表(数式だけ)
でも、毎月のブックで「シート名が微妙に変わる」こともあります。
このとき、「シート名で指定する」のは不安定なので、「1枚目固定で取る」方が安全です。
単一ファイル版のテンプレ
まずは「1つのブックから1枚目だけ取る」シンプルなテンプレです。
let
// 1) 読み込むブックのパス
FilePath = "C:\Data\売上_2024-01.xlsx",
// 2) ブック全体を読み込む
Source = Excel.Workbook(
File.Contents(FilePath),
null,
true
),
// 3) 先頭行(1枚目のシート)を取得
FirstSheetRow = Source{0},
// 4) そのシートの中身(テーブル)を取り出す
FirstSheetTable = FirstSheetRow[Data],
// 5) 先頭行をヘッダーに昇格
Promoted = Table.PromoteHeaders(
FirstSheetTable,
[PromoteAllScalars = true]
)
in
Promoted
ここでの重要ポイントは二つです。
一つ目は、「シート名ではなく“順番”で指定している」こと。
二つ目は、「Data列から中身のテーブルを取り出している」こと。
この形にしておけば、シート名が「売上」「売上_2024」「Sheet1」などと変わっても、1枚目である限りは問題なく取り込めます。
応用:フォルダ内の複数ブックの「1枚目だけ」を全部まとめる
実務でよくあるパターン
現場で一番おいしい使い方は、「フォルダに毎月のブックを貯めておいて、全ブックの1枚目だけを縦に結合する」パターンです。
イメージとしてはこうです。
- C:\Data\MonthlyBooks
- 売上_2024-01.xlsx
- 売上_2024-02.xlsx
- 売上_2024-03.xlsx
どのブックも「1枚目のシートに売上明細がある」。
これを全部まとめて1つのテーブルにしたい、という状況です。
フォルダからの取り込み+1枚目固定のテンプレ
Mコードの全体像は次のようになります。
let
// 1) フォルダ内のファイル一覧を取得
Source = Folder.Files("C:\Data\MonthlyBooks"),
// 2) 必要なら拡張子で絞り込み(.xlsxだけ)
Filtered = Table.SelectRows(
Source,
each [Extension] = ".xlsx"
),
// 3) 各ファイルの1枚目シートを読み込むカスタム列を追加
AddedTables = Table.AddColumn(
Filtered,
"FirstSheet",
each
let
WB = Excel.Workbook([Content], null, true),
FirstRow = WB{0},
FirstTable = FirstRow[Data],
Promoted = Table.PromoteHeaders(
FirstTable,
[PromoteAllScalars = true]
)
in
Promoted
),
// 4) そのカスタム列(FirstSheet)を展開して、全部縦に結合
Expanded = Table.ExpandTableColumn(
AddedTables,
"FirstSheet",
Table.ColumnNames(AddedTables[FirstSheet]{0})
)
in
Expanded
少し長く見えますが、やっていることはシンプルです。
フォルダからファイル一覧を取る。
各行(各ファイル)について、「1枚目のシートを読む処理」を実行して、FirstSheet列に入れる。
最後にFirstSheet列を展開して、全部まとめて1つのテーブルにする。
ここでの超重要ポイントは、「1枚目を読むロジックを、Table.AddColumnの中に閉じ込めている」ことです。
これにより、フォルダにファイルを追加するだけで、同じ処理が自動で全ファイルに適用されます。
重要ポイントの深掘り
なぜ「シート名指定」より「1枚目指定」が安定するのか
現場あるあるとして、「シート名が人によって微妙に違う」「コピペしたらシート名に(2)が付いた」などの揺れがよく起きます。
シート名で指定する場合は、たとえばこう書きます。
Sheet1 = Source{[Item="売上明細", Kind="Sheet"]}[Data]
これは「Item列が“売上明細”で、Kindが“Sheet”の行を探す」という指定です。
シート名が変わると、この条件が満たせなくなり、エラーになります。
一方、「1枚目固定」であれば、こうです。
FirstSheetRow = Source{0};
FirstSheetTable = FirstSheetRow[Data];
シート名が何であろうと、「一番上にあるシート」であれば必ず取れます。
「毎回1枚目にだけデータを入れてください」という運用ルールさえ守られていれば、こちらの方が圧倒的に壊れにくいです。
Data列の中身は「さらにテーブル」になっている
初心者が最初に戸惑うポイントが、「Data列の中にテーブルが入っている」という構造です。
Excel.Workbookの結果は「メタ情報の一覧」であり、
実際のシートの中身は、Data列の中に“入れ子のテーブル”として格納されています。
だからこそ、
行を1つ選ぶ → その行のData列を取り出す → それがシートの中身のテーブル
という三段階の取り出しが必要になります。
この構造を一度理解してしまえば、「2枚目だけ取りたい」「特定のシートだけ取りたい」といった応用も、インデックスや条件を変えるだけで書けるようになります。
実務での運用イメージ
毎月のブックが1つだけ届く場合
この場合は、単一ファイル版のテンプレを使い、FilePathだけ毎月差し替えるか、ファイル名を固定にして上書き保存する運用が現実的です。
ファイル名を固定にする場合は、たとえば常に 最新売上.xlsx という名前で保存しておき、Power Query側はそのパスを固定で参照します。
毎月の更新作業は、「最新売上.xlsxを上書き保存 → Excelで[更新]」の2ステップだけになります。
毎月のブックを累積したい場合
この場合は、フォルダ版テンプレを使います。
フォルダに新しいブックを追加する。
Excelファイルを開いて[すべて更新]を押す。
これだけで、過去分+新しい月のデータがすべて反映されます。
「1枚目固定」というルールさえ守られていれば、シート名が多少ブレても問題ありません。
まとめと「あなたの現場用」にするための一歩
ここまでで、
Excel.Workbookでブックの中身を一覧化する考え方。
1枚目のシートを「インデックス0」で指定するテクニック。
フォルダ内の複数ブックに対して、同じ「1枚目取込ロジック」を一括適用するテンプレ。
シート名指定よりも「1枚目固定」の方が壊れにくい理由。
を一通り押さえました。
