ゴールのイメージをそろえる
今回のテーマは「フォルダの中に同じ形式のファイルがたくさんあっても、“一番新しいファイルだけ”を Power Query で自動的に選んで取り込む実務テンプレ」を身につけることです。
毎日や毎月ファイルが増えていくフォルダから、「最新だけ欲しい」「古いのは無視したい」という場面を想定します。
キーワードは Folder.Files と Date 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 QuerySorted で「新しい順」に並べ替え、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 QueryCSV のときと同じく、ここでも重要なのは「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 版で一度手を動かして体に入れてしまえば、
毎日・毎月ファイルが増えていくフォルダでも、「常に最新だけを見る」クエリを安定して作れるようになります。
