Power Query 実務テンプレ | データ取込・更新系:最新ファイルのみ取得

Excel VBA Power Query M Formula Language
スポンサーリンク

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

今回のテーマは「フォルダの中に同じ形式のファイルがたくさんあっても、“一番新しいファイルだけ”を Power Query で自動的に選んで取り込む実務テンプレ」を身につけることです。
毎日や毎月ファイルが増えていくフォルダから、「最新だけ欲しい」「古いのは無視したい」という場面を想定します。

キーワードは Folder.FilesDate modified(更新日時)、そして「並べ替え+先頭1行だけ残す」です。
ここを押さえれば、CSV でも Excel でも同じ型で書けるようになります。


基本の考え方:フォルダ一覧から「最新の1行」を選ぶ

Folder.Files と Date modified 列

まず、フォルダを Power Query で扱うときの入口はいつも Folder.Files です。

let
    Source = Folder.Files("C:\Data\Daily")
in
    Source
Power Query

これを実行すると、「そのフォルダにあるファイル一覧」がテーブルとして返ってきます。
このテーブルには、ファイル名(Name)、拡張子(Extension)、更新日時(Date modified)、サイズ(Size)、中身(Content)などが列として入っています。

今回の主役は Date modified 列です。
ここには「そのファイルが最後に更新された日時」が入っているので、これを使って「一番新しいファイル」を決めます。

「最新ファイルだけ」を選ぶ流れ

やることはシンプルで、次の3ステップです。

更新日時で降順に並べ替える(新しい順)。
先頭の1行だけ残す。
その行の Content を使って中身を読み込む。

この「並べ替え+先頭1行」が、“最新ファイルのみ取得”のコアパターンです。


例題1:最新の CSV ファイルだけを取り込むテンプレ

想定する状況

C:\Data\DailyCsv フォルダに、毎日こんなファイルが増えていくとします。

sales_2024-10-01.csv
sales_2024-10-02.csv
sales_2024-10-03.csv

この中から、「一番新しい CSV だけを Power Query で読みたい」というケースです。

実務テンプレ M コード(最新 CSV 1つだけ)

let
    // 1) フォルダ内のファイル一覧を取得
    Source = Folder.Files("C:\Data\DailyCsv"),

    // 2) .csv だけに絞り込む
    OnlyCsv =
        Table.SelectRows(
            Source,
            each Text.Lower([Extension]) = ".csv"
        ),

    // 3) 更新日時で降順ソート(新しい順)
    Sorted =
        Table.Sort(
            OnlyCsv,
            {{"Date modified", Order.Descending}}
        ),

    // 4) 先頭の 1 行だけ残す(最新ファイル)
    LatestOne = Table.FirstN(Sorted, 1),

    // 5) そのファイルの Content を CSV として読み込む
    LatestContent = LatestOne{0}[Content],

    CsvTable =
        Csv.Document(
            LatestContent,
            [
                Delimiter = ",",
                Encoding = 65001,
                QuoteStyle = QuoteStyle.Csv
            ]
        ),

    // 6) 先頭行をヘッダーに昇格
    Promoted =
        Table.PromoteHeaders(
            CsvTable,
            [PromoteAllScalars = true]
        )
in
    Promoted
Power Query

ここで一番大事なのは、次の3行です。

Sorted =
    Table.Sort(OnlyCsv, {{"Date modified", Order.Descending}})

LatestOne = Table.FirstN(Sorted, 1)

LatestContent = LatestOne{0}[Content]
Power Query

Sorted で「新しい順」に並べ替え、LatestOne で「先頭1行だけ残し」、LatestContent で「その行の Content を取り出す」。
この流れが、“最新ファイルのみ取得”の基本型です。


例題2:最新の Excel ファイルだけを取り込むテンプレ

想定する状況

C:\Data\MonthlyBooks に、毎月の売上ブックが溜まっているとします。

売上_2024-08.xlsx
売上_2024-09.xlsx
売上_2024-10.xlsx

この中から、「一番新しいブックの1枚目シートだけを読みたい」というケースです。

実務テンプレ M コード(最新 Excel 1つだけ)

let
    // 1) フォルダ内のファイル一覧を取得
    Source = Folder.Files("C:\Data\MonthlyBooks"),

    // 2) .xlsx だけに絞り込む
    OnlyXlsx =
        Table.SelectRows(
            Source,
            each Text.Lower([Extension]) = ".xlsx"
        ),

    // 3) 更新日時で降順ソート(新しい順)
    Sorted =
        Table.Sort(
            OnlyXlsx,
            {{"Date modified", Order.Descending}}
        ),

    // 4) 先頭の 1 行だけ残す(最新ブック)
    LatestOne = Table.FirstN(Sorted, 1),

    // 5) そのブックの Content を取り出す
    LatestContent = LatestOne{0}[Content],

    // 6) Excel.Workbook で中身を一覧化
    Wb =
        Excel.Workbook(
            LatestContent,
            true,
            true
        ),

    // 7) 1 枚目のシートを取得
    FirstSheetRow =
        Table.SelectRows(Wb, each [Kind] = "Sheet"){0},

    FirstSheetTable = FirstSheetRow[Data],

    // 8) 先頭行をヘッダーに昇格
    Promoted =
        Table.PromoteHeaders(
            FirstSheetTable,
            [PromoteAllScalars = true]
        )
in
    Promoted
Power Query

CSV のときと同じく、ここでも重要なのは「Sorted → LatestOne → LatestContent」の3ステップです。
そのあとに Excel.Workbook で中身を読むか、Csv.Document で読むかが変わるだけで、型は同じです。


重要ポイントの深掘り

「最新」を何で決めるか:更新日時かファイル名か

今回のテンプレでは「Date modified(更新日時)」で最新を決めていますが、
実務によっては「ファイル名に含まれる日付」で決めたいこともあります。

例えば、こんなケースです。

ファイル名:sales_2024-10-01.csv
更新日時:2024-10-02 09:00(後から上書きされた)

この場合、「一番新しい日付のファイル」と「一番最近更新されたファイル」がズレることがあります。
どちらを“最新”とみなすかは、業務ルール次第です。

もし「ファイル名の日付で決めたい」なら、次のような流れになります。

Name から日付部分を Text.Middle などで切り出す。
それを Date 型に変換して「基準日」列を作る。
その列で降順ソートして、先頭1行だけ残す。

更新日時で十分な現場も多いので、まずは Date modified 版を押さえておき、
必要になったら「ファイル名日付版」に発展させる、という順番がおすすめです。

Table.FirstN と {0} の違いを整理する

初心者が混乱しやすいポイントなので、ここも丁寧に整理します。

Table.FirstN(Sorted, 1) は、「テーブルの先頭から N 行だけ残したテーブル」を返します。
つまり、LatestOne は「1行だけを持つテーブル」です。

一方、LatestOne{0} は、「テーブルの 0 番目の行(最初の行)をレコードとして取り出す」操作です。
そのレコードの中の Content 列を取り出すので、LatestOne{0}[Content] という書き方になります。

まとめると、

Sorted …複数行のテーブル
LatestOne …1行だけのテーブル
LatestOne{0} …その1行をレコードとして取り出したもの
LatestOne{0}[Content] …そのレコードの Content 列の値(バイナリ)

という関係です。
この「テーブル → 1行テーブル → レコード → 列の値」という流れに慣れておくと、Power Query の操作が一気に楽になります。


応用:最新ファイル名を列として残しておく

「どのファイルから取ったか」を後で確認できるようにする

最新ファイルだけを読んでいると、「今どのファイルを見ているのか」を忘れがちです。
そこで、最新ファイルの Name(ファイル名)を列として一緒に持たせておくと、後から確認しやすくなります。

例えば、CSV 版に少しだけ手を加えるとこうなります。

let
    Source = Folder.Files("C:\Data\DailyCsv"),

    OnlyCsv =
        Table.SelectRows(
            Source,
            each Text.Lower([Extension]) = ".csv"
        ),

    Sorted =
        Table.Sort(
            OnlyCsv,
            {{"Date modified", Order.Descending}}
        ),

    LatestOne = Table.FirstN(Sorted, 1),

    LatestContent = LatestOne{0}[Content],
    LatestName = LatestOne{0}[Name],

    CsvTable =
        Csv.Document(
            LatestContent,
            [
                Delimiter = ",",
                Encoding = 65001,
                QuoteStyle = QuoteStyle.Csv
            ]
        ),

    Promoted =
        Table.PromoteHeaders(
            CsvTable,
            [PromoteAllScalars = true]
        ),

    WithFileName =
        Table.AddColumn(
            Promoted,
            "元ファイル名",
            each LatestName,
            type text
        )
in
    WithFileName
Power Query

こうしておけば、最終テーブルのすべての行に「元ファイル名」として最新ファイルの名前が入ります。
「今はどのファイルを見ているのか」「更新したらファイル名が変わったか」を簡単にチェックできます。


実務テンプレとしてのまとめ

“最新ファイルのみ取得”の型は、次の一言に集約できます。

「フォルダ一覧を更新日時で降順ソートして、先頭1行だけ残し、その Content を読む」

これを CSV 版・Excel 版で一度手を動かして体に入れてしまえば、
毎日・毎月ファイルが増えていくフォルダでも、「常に最新だけを見る」クエリを安定して作れるようになります。

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