Power Queryで月別CSVを結合|フォルダーに置いて更新するだけで1つの表に

トレード記録を月ごとのCSVに分けて保存していると、集計のたびに貼り合わせる手間がかかります。ExcelのPower Queryを使うと、フォルダーに入れたCSVを1つの表にまとめ、新しい月のファイルを置いて[すべて更新]するだけで表が増える形にできます。この記事では、架空の記録を8月・9月・10月の3つのCSVに分けて、実際のExcelでまとめた結果と、使ったクエリ(M言語)を紹介します。

(確認:Microsoft 365 Excel(バージョン16.0、ビルド20430)で、2026年10月21日に実行。クエリの登録と読み込みはExcelを操作するプログラム(Python・pywin32)で行い、記事に載せたクエリの文字列をそのまま使いました。画面の名前は、インストールされているExcelとPower Queryの日本語の文字列(リソース)で確かめたものです。記録は乱数で作った架空のもので、実際の取引ではありません)

準備:専用のフォルダーと、同じ形のCSV

Microsoftのサポートページ(複数のファイルを含むフォルダーからデータをインポートする)には、結合するファイルを、無関係なファイルのない専用のフォルダーに入れること、各ファイルが同じ列見出し・データ型・列数(同じスキーマ)であることが、前提として書かれています。この記事では、次の形にしました。

  • フォルダー:C:\TradeLog\monthly
  • ファイル:2026-08.csv(16件)、2026-09.csv(14件)。どちらも1行目が「決済日,銘柄,売買,ロット,損益」の、文字コードUTF-8(BOM付き)のCSV

クエリ(M言語)

次のクエリは、フォルダー内の拡張子が.csvのファイルだけを読み、1行目を見出しにして、全ファイルを縦につなげ、列の型(日付・数値)を決めます。どのファイルの行かが分かるように、ファイル名の列も残しています。

let
    // フォルダー内のCSVをすべて読み、1つの表にまとめる
    Source = Folder.Files("C:\TradeLog\monthly"),
    CsvOnly = Table.SelectRows(Source, each Text.Lower([Extension]) = ".csv"),
    Parsed = Table.AddColumn(CsvOnly, "Data", each
        Table.PromoteHeaders(Csv.Document([Content], [Delimiter = ",", Encoding = 65001]), [PromoteAllScalars = true])),
    Kept = Table.SelectColumns(Parsed, {"Name", "Data"}),
    Expanded = Table.ExpandTableColumn(Kept, "Data", {"決済日", "銘柄", "売買", "ロット", "損益"}),
    Typed = Table.TransformColumnTypes(Expanded, {{"決済日", type date}, {"ロット", type number}, {"損益", Int64.Type}}),
    Renamed = Table.RenameColumns(Typed, {{"Name", "ファイル"}})
in
    Renamed

入れ方は、[データ]→[データの取得]→[その他のソースから]→[空のクエリ]でPower Queryエディターを開き、[詳細エディター]に上のクエリを貼り付けて、[閉じて読み込む]を選びます。Csv.Document の Encoding = 65001 はUTF-8の指定で、Microsoftの関数の説明には、encodingでテキストのエンコードの種類を指定する、と書かれています。

画面の操作だけで作る方法もあります。[データ]→[データの取得]→[ファイルから]→[フォルダーから]でフォルダーを選び、[データの結合と変換]などを選ぶと、Excelが補助のクエリを自動で作ってまとめます。

実行結果

確かめたこと 結果
読み込んだ行数(見出しを除く) 30行(8月16件+9月14件)
損益の合計 57,000(元の30件の合計と一致)
ファイル別の件数 2026-08.csv:16、2026-09.csv:14
決済日の型 日付(表示形式 yyyy/m/d)。BOM付きでも見出しの「決済日」は正しく読めた

読み込まれた表の先頭と、月の境目は次のとおりです。

ファイル 決済日 銘柄 売買 ロット 損益
2026-08.csv 2026/8/5 EURUSD 売り 0.2 -8000
2026-08.csv 2026/8/29 GBPJPY 売り 0.3 3000
2026-09.csv 2026/9/1 USDJPY 売り 0.2 -18000

新しい月のファイルを足して、更新する

次に、同じフォルダーに 2026-10.csv(2件・合計1,000)と、関係のない メモ.txt を置き、ブックを開いて[すべて更新]しました。

確かめたこと 結果
更新後の行数 32行(30+2)
損益の合計 58,000(57,000+1,000)
読み込まれたファイル 2026-08.csv・2026-09.csv・2026-10.csv(メモ.txtは入らない)

メモ.txtが入らなかったのは、クエリの2行目で拡張子が.csvのものだけに絞っているためです。画面の操作だけで作った場合は、この絞り込みが無いと、フォルダー内のすべてのファイルを読もうとします(サポートページの注意)。

うまくいかない時に見るところ

  • 見出しが「Column1」などになる:1行目が見出しになっていない。CSVの1行目を確かめる
  • 列が足りない・ずれる:月によって列の名前や数が違う。Table.ExpandTableColumn は、指定した名前の列だけを取り出す
  • 文字化けする:CSVの文字コードと Encoding が合っていない。UTF-8なら65001
  • 日付や数値でエラーになる:「2026/08/05」以外の形(時刻付きなど)が混ざっている。型を決める行(Typed)で、どの列がエラーかを見る

MT5から書き出した取引履歴は、列の形やファイルの種類が違うため、そのままでは上のクエリは使えません。MT5の取引履歴の書き出し方はMT5の取引履歴を書き出す方法に、MT5のCSVの文字化けの原因はMT5でCSVが出力されない・文字化けする原因にまとめています。

まとめた表を集計につなぐ

読み込んだ表は、通常のテーブルとして使えます。銘柄別・月別の集計はピボットテーブルでトレード記録を集計する方法やSUMIFSなどの関数で行えます。Excelの集計をどこまで身につけるかは、トレード記録をExcelで集計する力とMOSにまとめています。

この記事で確かめていないこと

  • Mac版のExcel・Web版のExcelでの動き
  • 画面の操作だけで作った場合に、Excelが自動で作る補助のクエリの中身
  • ファイルが数百・数千に増えた時の更新の時間

まとめ

  • 月ごとのCSVを専用のフォルダーに入れ、Power Queryで1つの表にまとめると、新しい月のファイルを置いて[すべて更新]するだけで表が増える
  • 架空の記録で、8月・9月の30件(合計57,000)が正しく1つになり、10月分を足した更新で32件(58,000)になった。拡張子で絞ったので、メモ.txtは入らなかった
  • 各ファイルの列の形と文字コードを揃えるのが前提。うまくいかない時は、見出し・列名・文字コード・型の順に見る

本記事は、架空の記録でExcelの機能を確かめたものです。売買の判断や成績の評価を示すものではありません。