まず「理想の運用イメージ」をはっきりさせる
目指すゴールはとてもシンプルです。
毎月届くCSVファイルを、あるフォルダにポンと入れるだけ。
Excel側では、Power Queryの[更新]ボタンを押すだけで、
過去分も含めた「累積データ」が自動で最新になる。
つまり、「コピペ作業ゼロ」「インポート設定やり直しゼロ」の状態を、
一度の仕込みでずっと使い回せるようにする、というのが今回の実務テンプレです。
全体構成の考え方(フォルダを“データベース”にする)
毎月ファイルを「1つのフォルダに貯める」という発想
まず大前提として、「毎月のCSVを1つのフォルダに全部入れていく」運用にします。
例として、こんなイメージです。
- C:\Data\MonthlySales
- sales_2024-01.csv
- sales_2024-02.csv
- sales_2024-03.csv
- …
ファイル名は「年月が分かるようにしておく」と後でかなり楽になります。
Power Queryは「フォルダーから」取り込む機能を持っていて、
このフォルダを丸ごと“テーブル化”してくれます。
一度だけ「変換ルール」を作り、あとは自動適用
Power Queryの強みは、「一度作った変換手順を、後から来るファイルにも自動で適用できる」ことです。
やることは本質的に次の二つだけです。
フォルダを指定して、ファイル一覧をテーブルとして読み込む。
その中の「1つのサンプルファイル」に対して、列の整形・型変換などの手順を作る。
すると、その手順が「フォルダ内の全ファイル」に自動で適用され、
毎月ファイルを追加しても、同じ処理が勝手に走るようになります。
具体例:売上CSVを毎月追加していくケース
想定するCSVの中身
たとえば、毎月こんなCSVが届くとします。
日付,店舗,商品,数量,金額
2024/01/01,東京,りんご,10,1200
2024/01/01,大阪,みかん,5,500
...
2月分、3月分も同じ列構成(同じ順番・同じ列名)で出てくる前提です。
「同一形式で更新」というのは、この「列構成が毎月同じ」という意味だと思ってください。
ステップ1:フォルダから取り込む(Power QueryのUI操作イメージ)
Excelの[データ]タブから、だいたい次のような流れになります。
データの取得 → ファイルから → フォルダーから
先ほどの C:\Data\MonthlySales を指定
ファイル一覧が出てきたら「データの変換」を選ぶ
ここまでで、「ファイル名・拡張子・更新日・フォルダパス・コンテンツ(バイナリ)」などが並んだテーブルができます。
この「Content」列が、実際のCSVデータ本体です。
ステップ2:サンプルファイルに対して変換手順を作る
フォルダ取り込みのウィザードを進めると、「サンプルファイルに変換を適用」という流れになります。
中身としては、次のようなMコードが自動生成されます(イメージです)。
let
Source = Folder.Files("C:\Data\MonthlySales"),
#"Filtered Rows" = Table.SelectRows(Source, each [Extension] = ".csv"),
#"Invoke Custom Function" = Table.AddColumn(
#"Filtered Rows",
"Transform File",
each TransformFile([Content])
),
#"Expanded Table Column" = Table.ExpandTableColumn(
#"Invoke Custom Function",
"Transform File",
{"日付", "店舗", "商品", "数量", "金額"},
{"日付", "店舗", "商品", "数量", "金額"}
)
in
#"Expanded Table Column"
ここで出てくる TransformFile というのが、「サンプルファイルに対して作った変換手順」を関数化したものです。
この関数が、フォルダ内の全CSVに対して適用され、最後に全部まとめて縦に結合(Append)されます。
重要ポイント1:サンプルファイルの変換を“丁寧に”作る
サンプルファイル側のMコードのイメージ
TransformFile の中身は、だいたいこんな構造になっています。
let
Source = Csv.Document(
Parameter1,
[
Delimiter = ",",
Encoding = 65001,
QuoteStyle = QuoteStyle.Csv
]
),
#"Promoted Headers" = Table.PromoteHeaders(Source, [PromoteAllScalars = true]),
#"Changed Type" = Table.TransformColumnTypes(
#"Promoted Headers",
{
{"日付", type date},
{"店舗", type text},
{"商品", type text},
{"数量", Int64.Type},
{"金額", Int64.Type}
}
)
in
#"Changed Type"
ここでの超重要ポイントは、「この変換手順が、毎月の全ファイルにそのまま適用される」ということです。
だからこそ、ここでやるべきことは次のようなイメージになります。
不要な列があれば削除する。
列名をきちんと揃える(後で変えない)。
型(数値・日付・テキスト)を正しく指定する。
一度ここを丁寧に作っておけば、来月以降は何も触らなくてOKになります。
逆に、ここを適当に作ると、毎月「型が合わない」「列が足りない」などのトラブルの元になります。
重要ポイント2:年月をファイル名から自動で取る
なぜ「年月列」を持たせると便利なのか
月次ファイルを累積するとき、よくやる集計が「月別の売上」「年別の売上」です。
このとき、CSVの中に「年月」列がないことも多いので、ファイル名から年月を取り出して列として追加しておくと、後の分析がとても楽になります。
たとえば、ファイル名が sales_2024-01.csv のような形式なら、2024-01 の部分を抜き出して「対象年月」列として追加できます。
ファイル名から年月を取り出すMコード例
フォルダから取り込んだ最初のテーブルには、Name という列にファイル名が入っています。
そこから年月を抜き出して列を追加する例です。
let
Source = Folder.Files("C:\Data\MonthlySales"),
#"Filtered Rows" = Table.SelectRows(Source, each [Extension] = ".csv"),
// ファイル名から「2024-01」の部分を抜き出す例
#"Added Custom" = Table.AddColumn(
#"Filtered Rows",
"対象年月",
each Text.Middle([Name], 6, 7), // "sales_" が5文字なので、6文字目から7文字分
type text
)
in
#"Added Custom"
この「対象年月」列は、そのまま後ろの結合結果にも引き継がれます。
ピボットテーブルやPower BIで集計するときに、「行:対象年月」「値:金額」のように簡単に使えるようになります。
重要ポイント3:毎月の運用フローを“1行”にする
実務での運用イメージ
ここまでのテンプレを作ってしまえば、毎月やることは本当にシンプルです。
新しい月のCSVを、決めたフォルダに保存する(ファイル名ルールは守る)。
Excelファイルを開いて、[データ]タブの[すべて更新]を押す。
これだけで、過去分+今月分のデータがすべて更新されます。
「先月のシートをコピーして、今月分を貼り付けて…」という作業は完全に不要になります。
フォルダ構成とファイル名ルールを“最初に決めておく”ことの大事さ
この仕組みが安定して動くかどうかは、実は「Mコード」よりも「運用ルール」にかかっています。
フォルダを途中で変えない。
ファイル名の形式を途中で変えない。
列構成(列名・順番)を途中で変えない。
ここさえ守られていれば、Power Query側はほとんど触らなくて済みます。
もし将来、列が1つ増えた・名前が変わった、などの変更があった場合は、
サンプルファイルの変換手順(TransformFile)を一度だけ修正すれば、
またそこから先は自動で回り続けます。
もう一歩先:データ量が増えてきたときの考え方
毎月のCSVが何年分も溜まってくると、行数がかなり増えてきます。
Power BI側では「増分更新」という仕組みもありますが、
Excel+Power Queryだけで運用する場合は、次のような工夫が現実的です。
古い年のデータは別ブックにアーカイブしておき、
Power Queryで読み込むフォルダは「直近数年分だけ」にする。
あるいは、フォルダを「history」「current」などに分けて、
history側はめったに更新しない、current側だけ頻繁に更新する、
といった運用もよく使われます。
まとめと「あなたの現場用」に落とし込むヒント
ここまでで、
フォルダを“データベース”として扱う発想。
サンプルファイルに対して一度だけ変換手順を作り、それを全ファイルに適用する仕組み。
ファイル名から年月を取り出して列として持たせるテクニック。
毎月の運用を「フォルダに保存+更新ボタン」にまで簡略化する考え方。
を一通り押さえました。
