Power Query 実務テンプレ | データ取込・更新系:Excelファイル1枚目固定取込

Excel
スポンサーリンク

ゴールのイメージを先にそろえる

今回のテーマは「毎回レイアウトは同じだけど、ブック名や中身だけ変わる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枚目固定」の方が壊れにくい理由。

を一通り押さえました。

タイトルとURLをコピーしました