Power Query 実務テンプレ | データ取込・更新系:毎月届くCSVを同一形式で更新

Excel
スポンサーリンク

まず「理想の運用イメージ」をはっきりさせる

目指すゴールはとてもシンプルです。

毎月届く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側だけ頻繁に更新する、
といった運用もよく使われます。


まとめと「あなたの現場用」に落とし込むヒント

ここまでで、

フォルダを“データベース”として扱う発想。
サンプルファイルに対して一度だけ変換手順を作り、それを全ファイルに適用する仕組み。
ファイル名から年月を取り出して列として持たせるテクニック。
毎月の運用を「フォルダに保存+更新ボタン」にまで簡略化する考え方。

を一通り押さえました。

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