毎日ダウンロードされる請求書や売上データ、日報ファイルを、1つずつ手作業で名前変更していませんか。
たとえば、ダウンロードフォルダに保存された「data (1).xlsx」「売上.csv」といったファイルを、毎回「20260906_東京支店_売上.csv」のような分かりやすい名前へ変更し、さらに「202609」のような年月別フォルダへ移動する作業です。
1件だけなら数十秒でも、毎日10件、20件と繰り返せば大きな時間になります。しかも、日付の入力ミス、ファイルの移動忘れ、同名ファイルの上書きといったヒューマンエラーも起こりやすい作業です。
このようなWindows上の定型ファイル操作を自動化するのに向いているのが、MicrosoftのPower Automate for desktop(PAD)です。
PADでは、プログラムコードをほとんど書かず、画面左側にある「アクション」をドラッグ&ドロップして処理を組み立てられます。今回作るフローも、VBAやPythonを書く必要はありません。
Windows 11ではPower Automate for desktopを利用しやすい形で提供されています。一方、Windows 10では別途インストールが必要になる場合があります。また、この記事で扱うPC上で手動実行する基本的なデスクトップフローと、クラウド連携・無人実行などの機能ではライセンス条件が異なります。
この記事では、PAD初心者の方でも再現できるように、「フォルダをスキャン → ファイル名へ日付を追加 → 年月フォルダを作成 → ファイルを移動」という実務向けフローを、最初から順番に解説します。
【結論】今回作るファイル整理フローの完成形
最初に、完成後の動きを確認しておきましょう。
たとえば、次のような受信フォルダがあるとします。
' 処理対象フォルダー
C:\Work\Incoming
' 処理前のファイル例
C:\Work\Incoming\売上.csv
C:\Work\Incoming\data (1).xlsx
C:\Work\Incoming\東京支店_日報.xlsx
PADのフローを実行すると、次のような処理を自動で行わせます。
- 指定したフォルダ内のファイルをまとめて取得する
- 取得したファイルを1件ずつFor eachで処理する
- 現在日付、またはファイルに関連する日時を取得する
- 日付をyyyyMMdd形式へ変換する
- 元のファイル名の先頭へ20260906_のような接頭辞を付ける
- 年月をyyyyMM形式で取り出す
- 保存先の年月フォルダがなければ作成する
- リネーム後のファイルを年月フォルダへ移動する
処理後のイメージは次のとおりです。
' 処理後
C:\Work\Archive\202609\20260906_売上.csv
C:\Work\Archive\202609\20260906_data (1).xlsx
C:\Work\Archive\202609\20260906_東京支店_日報.xlsx
支店名も固定で付けたい場合は、最終的に次のような形式にもできます。
' ファイル名の例
20260906_東京支店_売上.csv
20260906_東京支店_日報.xlsx
一度フローを作ってしまえば、毎日の作業はPADを開いて実行ボタンを押すだけにできます。
今回作成するPADフローの全体構成
まずは、配置するアクションを一覧で確認しておきます。
| 順番 | PADアクション | 役割 |
|---|---|---|
| 1 | フォルダー内のファイルを取得 | 処理対象ファイルをリストとして取得 |
| 2 | For each | 取得したファイルを1件ずつ処理 |
| 3 | 現在の日時を取得 | リネームに利用する日時を取得 |
| 4 | datetime をテキストに変換 | 20260906、202609などの文字列を作成 |
| 5 | ファイルの名前を変更する | ファイル名の先頭へ日付を追加 |
| 6 | フォルダーが存在する場合 | 保存先フォルダの有無を判定 |
| 7 | フォルダーを作成する | 年月フォルダがない場合だけ作成 |
| 8 | ファイルの移動 | 整理先の年月フォルダへ移動 |
PADを起動して新しいデスクトップフローを作成する
1. WindowsからPower Automateを起動する
Windowsのスタートメニューまたは検索欄を開き、「Power Automate」と入力してPower Automate for desktopを起動します。
起動後、デスクトップフローの一覧画面から「新しいフロー」を選択します。
フロー名は自由ですが、実務では何をするフローなのか一目で分かる名前がおすすめです。
' 作成するデスクトップフロー名
請求書・売上ファイル自動整理
フローを作成すると、中央にアクションを並べていくデザイナー画面が開きます。
アクション1:「フォルダー内のファイルを取得」で対象ファイルを読み込む
最初に、処理したいフォルダ内のファイルをPADへ読み込みます。
左側のアクション検索欄で「フォルダー内のファイルを取得」を検索し、中央のワークスペースへドラッグ&ドロップします。
' 対象フォルダーからExcel・CSVファイルを取得する
フォルダー内のファイルを取得
Folder:
C:\Work\Incoming
ファイル フィルター:
*.xlsx;*.csv
サブフォルダーを含む:
False
生成される変数:
%Files%
%Files%には、条件に一致した複数のファイルが「ファイルのリスト」として格納されます。
ファイルフィルターにはワイルドカードが使用できます。ExcelとCSVだけを処理したい場合は、対象形式に合わせてフィルターを設定しておくと安全です。
いきなり「*」ですべてのファイルを取得すると、PDF、画像、ZIP、一時ファイルなど、意図しないファイルまでリネーム・移動する可能性があります。まずは「*.xlsx;*.csv」のように対象を絞ってテストしてください。
「フォルダー内のファイルを取得」の重要ポイント
- Folder:検索対象となるフォルダの完全パスを指定します。
- ファイル フィルター:*.xlsxなどのワイルドカードで対象を限定します。
- *:任意の文字列に一致します。
- ?:任意の1文字に一致するパターンとして利用できます。
- セミコロン:複数のファイル条件を指定するときに利用します。
- サブフォルダーを含む:有効にすると配下のフォルダも検索対象になります。
アクション2:「For each」でファイルを1つずつ処理する
%Files%には複数のファイルが入っています。
そこで「For each」を使い、取得したファイルを1件ずつ順番に処理します。
' %Files% に入っているファイルを1件ずつ取り出す
For each
反復処理する値:
%Files%
現在の項目:
%CurrentItem%
この設定によって、1周目では1個目のファイル、2周目では2個目のファイルというように、%CurrentItem%へ処理対象が順番に入ります。
この後に追加する日時取得、リネーム、フォルダ作成、移動処理は、基本的にFor eachの内側へ配置します。
For each %CurrentItem% in %Files%
' 現在日時を取得する
' 日付を文字列へ変換する
' ファイル名を変更する
' 保存先フォルダーを確認する
' 必要ならフォルダーを作成する
' ファイルを移動する
End
アクション3:「現在の日時を取得」でリネーム用の日付を作る
次に、ファイル名の先頭へ付ける日付を取得します。
アクション検索欄から「現在の日時を取得」をFor eachの内側へ追加します。
' フローを実行した時点の日時を取得する
現在の日時を取得
取得:
現在の日時
生成される変数:
%CurrentDateTime%
ここで取得できる%CurrentDateTime%は日時データです。
そのままファイル名へ追加するのではなく、次のアクションで20260906のような文字列へ整形します。
ファイルの作成日や更新日を基準にしたい場合
今回の基本例ではフローを実行した日をファイル名へ付けます。
一方、業務によっては「今日処理した日」ではなく、ファイルそのものの作成日時・更新日時を基準に整理したいケースもあります。
その場合は、対象ファイルから取得できるファイル情報やファイル関連アクションを利用し、必要な日時を後続の「datetime をテキストに変換」へ渡します。
月末に前月分のファイルをまとめて整理する運用では、「現在の日時」を使うと実際の対象月と保存フォルダがずれる可能性があります。業務ルールに合わせて、処理日・作成日・更新日のどれを基準にするか最初に決めてください。
アクション4:「datetime をテキストに変換」でyyyyMMddを作る
ファイル名へ付けやすいように、日時データの%CurrentDateTime%を文字列へ変換します。
' ファイル名に付ける年月日を作成する
datetime をテキストに変換
変換する日時:
%CurrentDateTime%
使用する形式:
カスタム
カスタム形式:
yyyyMMdd
生成される変数:
%FormattedDateTime%
たとえば2026年9月6日に実行した場合、%FormattedDateTime%には次の文字列が入ります。
%FormattedDateTime% = 20260906
年月フォルダ用にyyyyMMも作成する
同じ「datetime をテキストに変換」をもう1つ追加し、今度は年月フォルダ用の文字列を作成します。
' 保存先フォルダー名に使う年月を作成する
datetime をテキストに変換
変換する日時:
%CurrentDateTime%
使用する形式:
カスタム
カスタム形式:
yyyyMM
生成される変数:
%YearMonth%
2026年9月6日であれば、%YearMonth%は次のようになります。
%YearMonth% = 202609
日時フォーマットの意味
| 書式 | 意味 | 例 |
|---|---|---|
| yyyy | 4桁の年 | 2026 |
| MM | 2桁の月 | 09 |
| dd | 2桁の日 | 06 |
| yyyyMMdd | 年月日 | 20260906 |
| yyyyMM | 年月 | 202609 |
アクション5:「ファイルの名前を変更する」で日付を付ける
ここまで準備できたら、ファイル名を変更します。
今回のように拡張子を残したまま日付を追加する場合は、元の名前を丸ごと作り直すのではなく、既存ファイル名の先頭へ文字列を追加する方法が分かりやすいです。
' 元のファイル名を残したまま、先頭へ日付を追加する
ファイルの名前を変更する
名前を変更するファイル:
%CurrentItem%
名前変更のルール:
テキストの追加
追加するテキスト:
%FormattedDateTime%_
追加する位置:
名前の先頭
生成される変数:
%RenamedFiles%
元のファイルが「売上.csv」だった場合、結果は次のようになります。
' 変更前
売上.csv
' 変更後
20260906_売上.csv
「東京支店」のような固定文字も付ける場合
日付だけではなく支店名も付けたい場合は、追加するテキストを次のようにします。
' 日付+支店名を接頭辞として追加する
%FormattedDateTime%_東京支店_
' 完成例
20260906_東京支店_売上.csv
この方法なら、元の「売上」という名前と「.csv」という拡張子を維持しながら、先頭だけを変更できます。
年月ごとの保存先フォルダを自動判定する
リネームができたら、次はファイルを202609などの年月フォルダへ振り分けます。
保存先のルートフォルダを次のように決めておきます。
' 保存先の親フォルダー
C:\Work\Archive
年月部分には先ほど作成した%YearMonth%を利用します。
' 保存先フォルダーの組み立て例
C:\Work\Archive\%YearMonth%
' 2026年9月の場合
C:\Work\Archive\202609
保存先フォルダが存在するか確認する
年月フォルダが存在しない状態で、そのフォルダへファイルを移動しようとするとエラーになります。
そのため、先に「フォルダーが存在する場合」を使って保存先を確認します。
' 年月フォルダーがまだ存在しない場合だけ後続処理を実行する
フォルダーが存在する場合
フォルダーが次の場合:
存在しない
フォルダーパス:
C:\Work\Archive\%YearMonth%
存在しない場合だけ「フォルダーを作成する」
条件ブロックの内側へ「フォルダーを作成する」を配置します。
' C:\Work\Archive の下へ年月フォルダーを作成する
フォルダーを作成する
新しいフォルダーを次の場所に作成:
C:\Work\Archive
新しいフォルダー名:
%YearMonth%
これで、202609フォルダがすでに存在する場合は何もせず、存在しないときだけ自動作成できます。
「ファイルの移動」で年月フォルダへ自動仕分けする
最後に、リネーム済みファイルを年月フォルダへ移動します。
' 名前変更後のファイルを年月別フォルダーへ移動する
ファイルの移動
移動するファイル:
%RenamedFiles%
宛先フォルダー:
C:\Work\Archive\%YearMonth%
ファイルが存在する場合:
何もしない
「ファイルの名前を変更する」アクションでは、変更後のファイルが%RenamedFiles%として取得できます。
そのため、名前変更前の%CurrentItem%ではなく、リネーム後のファイルを示す%RenamedFiles%を移動対象として利用するのがポイントです。
名前変更前に取得したファイル情報を後続処理で使い続けると、すでに存在しない旧ファイル名を参照してしまうことがあります。名前変更アクションが生成した変数を後続処理へ渡すと、処理の流れが分かりやすくなります。
完成したPADフローの配置順
ここまでのアクションをまとめると、基本フローは次の順番です。
' ① 対象ファイルをまとめて取得
フォルダー内のファイルを取得
Folder: C:\Work\Incoming
ファイル フィルター: *.xlsx;*.csv
出力: %Files%
' ② 1ファイルずつ繰り返す
For each
値: %Files%
現在の項目: %CurrentItem%
' ③ 現在日時を取得
現在の日時を取得
出力: %CurrentDateTime%
' ④ ファイル名用の年月日を作成
datetime をテキストに変換
日時: %CurrentDateTime%
形式: yyyyMMdd
出力: %FormattedDateTime%
' ⑤ フォルダー名用の年月を作成
datetime をテキストに変換
日時: %CurrentDateTime%
形式: yyyyMM
出力: %YearMonth%
' ⑥ ファイル名の先頭へ日付を追加
ファイルの名前を変更する
ファイル: %CurrentItem%
ルール: テキストの追加
追加文字: %FormattedDateTime%_
出力: %RenamedFiles%
' ⑦ 保存先フォルダーがなければ作成
フォルダーが存在する場合
条件: 存在しない
パス: C:\Work\Archive\%YearMonth%
フォルダーを作成する
親フォルダー: C:\Work\Archive
フォルダー名: %YearMonth%
' ⑧ リネーム後のファイルを年月フォルダーへ移動
ファイルの移動
ファイル: %RenamedFiles%
宛先: C:\Work\Archive\%YearMonth%
End
この形まで作れば、「フォルダ内のファイルを一括取得 → リネーム → 年月別整理」という一連の定型作業をワンクリックで実行できます。
実務で重要な例外処理・エラー回避策
PADでは簡単にファイル操作を自動化できますが、実務投入する場合は正常系だけでなく例外ケースも考えておくことが重要です。
1. 拡張子「.xlsx」「.csv」を二重に付けない
リネームで起こりやすいミスの1つが、拡張子を自分で追加してしまうことです。
' 避けたい考え方
%FormattedDateTime%_%CurrentItem%.csv
' 意図しない結果の例
20260906_売上.csv.csv
今回の用途では、元のファイル名を丸ごと作り直すよりも、「テキストの追加」で先頭へ接頭辞だけ追加する方が安全です。
' 接頭辞だけを追加する
追加する文字:
%FormattedDateTime%_
' 元ファイル
売上.csv
' リネーム後
20260906_売上.csv
2. 同名ファイルがすでに存在する場合のルールを決める
同じ日に同じ名前のファイルが複数回ダウンロードされる業務では、ファイル名が衝突する可能性があります。
20260906_売上.csv
20260906_売上.csv
このとき、何も考えずに「上書き」を選ぶと、先に保存されたファイルを失う可能性があります。
業務では、次のどれにするか明確に決めておきましょう。
- 何もしない:既存ファイルを保護し、新しいファイルは移動しない
- 上書き:常に最新ファイルだけ残す
- 連番を付ける:001、002などを付けて両方保存する
- 時刻を付ける:20260906_154530_売上.csvのように秒まで含める
履歴を残す必要がある請求書や日報では、安易な上書きは避けるのがおすすめです。
3. 「~$」から始まるExcel一時ファイルを除外する
Excelファイルを開いていると、同じフォルダ内に次のような一時ファイルが作成されることがあります。
~$売上.xlsx
この一時ファイルまでリネーム・移動しようとすると、エラーの原因になることがあります。
実務では、For eachの内側で現在のファイル名が「~$」で始まるかを判定し、該当しないファイルだけを処理する構成にすると安全です。
For each %CurrentItem% in %Files%
' 一時ファイルではない場合だけ処理する
If ファイル名が ~$ で始まらない
' 日時を取得する
' ファイル名を変更する
' 保存先フォルダーを作成する
' ファイルを移動する
End
End
Excelや他のアプリがファイルを使用中の場合、ファイルがロックされてリネーム・移動できないことがあります。
4. すでに日付が付いているファイルの二重リネームを防ぐ
同じフォルダに処理済みファイルが残っている状態でフローを再実行すると、次のようになる可能性があります。
' 1回目
20260906_売上.csv
' 2回目に再び同じリネームをすると
20260906_20260906_売上.csv
今回のフローでは処理後に別フォルダへ移動するため通常は起こりにくいですが、途中でフローが停止した場合などには注意が必要です。
より堅牢にするなら、すでに日付の接頭辞が付いているファイルは処理しないという条件を追加します。
5. 本番フォルダでいきなりテストしない
ファイル操作の自動化では、設定ミスによって大量のファイルを一括移動・上書きしてしまう可能性があります。
最初は必ず、次のようなテスト専用フォルダを用意してください。
' テスト用の受信フォルダー
C:\PAD_Test\Incoming
' テスト用の保存先フォルダー
C:\PAD_Test\Archive
コピーしたダミーファイルで正常に動作することを確認してから、本番パスへ切り替えるのが安全です。
さらに実務向けに改善するアイデア
ファイル名に部署名・支店名を追加する
部署ごとに同じフローを使うなら、固定文字列を追加するだけでも管理しやすくなります。
' 追加する接頭辞
%FormattedDateTime%_東京支店_
' 完成例
20260906_東京支店_売上.csv
ファイル名に時刻も追加する
同日に何度も同名ファイルが作られる場合は、日付だけでなく時刻も利用すると重複しにくくなります。
' カスタム日時形式
yyyyMMdd_HHmmss
' 完成例
20260906_154530_売上.csv
拡張子ごとに保存先を変える
条件分岐を追加すれば、ExcelとCSVを別フォルダへ振り分けることもできます。
' Excelファイルの保存先
C:\Work\Archive\202609\Excel
' CSVファイルの保存先
C:\Work\Archive\202609\CSV
「請求書」「日報」「売上」のようなキーワードをファイル名から判定すれば、さらに細かな自動仕分けへ発展させることもできます。
PADで使った主要アクション・変数を詳しく解説
フォルダー内のファイルを取得
指定フォルダ内に存在するファイルを検索し、ファイルのリストとして取得するアクションです。
- Folder:検索対象のフォルダパスを指定します。
- ファイル フィルター:*.xlsxなどのワイルドカードで対象を絞ります。
- サブフォルダーを含む:下位フォルダまで検索するかを指定します。
- %Files%:取得したファイル一覧が格納される変数です。
大量のファイルがある場合は、不要なファイルまで取得しないようファイルフィルターをできるだけ限定するのがポイントです。
For each
リストに入っている要素を1件ずつ順番に処理するためのループです。
今回の場合は%Files%の中にあるファイルを順番に取り出し、現在処理中のファイルを%CurrentItem%として参照します。
現在の日時を取得
フロー実行時点の日時を取得します。
取得結果は日時データなので、そのままファイル名へ使うより、「datetime をテキストに変換」で用途に合った形式へ変換する方が扱いやすくなります。
datetime をテキストに変換
日時データを任意の書式の文字列へ変換するアクションです。
今回のようなファイル整理では、次の2種類を覚えておけば便利です。
- yyyyMMdd:20260906のような年月日
- yyyyMM:202609のような年月
ファイルの名前を変更する
ファイル名を変更するためのアクションです。
単純な新名称への変更だけでなく、既存ファイル名へ文字列を追加するなど、用途に応じたリネーム処理に利用できます。
今回のように元のファイル名と拡張子を維持したい場合は、既存名の先頭へテキストを追加する方式が扱いやすいです。
フォルダーが存在する場合
指定したフォルダが存在するか、存在しないかによって処理を分岐できます。
年月フォルダを自動生成する場合は、「存在しない場合だけフォルダーを作る」という構成にすると安全です。
フォルダーを作成する
指定した親フォルダの配下へ、新しいフォルダを作成します。
フォルダ名へ%YearMonth%のような変数を指定すれば、月が変わってもフローを修正する必要がありません。
ファイルの移動
対象ファイルを指定したフォルダへ移動します。
重要なのが同名ファイルがすでに存在する場合の挙動です。上書きするのか、処理しないのかなどを業務ルールに合わせて決めてください。
「フォルダ内のファイル処理」はPAD・VBA・Power Query・クラウド版のどれを使うべき?
ファイルを扱う自動化には、PAD以外にもVBA、Power Query、Power Automateクラウド版があります。
どれが優れているというより、やりたい処理によって得意分野が異なると考えるのがポイントです。
| ツール | 得意な処理 | 向いているケース | 難易度 |
|---|---|---|---|
| Power Automate for desktop | Windows上のファイル操作、アプリ操作、リネーム、コピー、移動 | ローカルPCの定型操作を自動化したい | 低~中 |
| VBA | Excelブック操作、セル転記、複数ファイル結合、集計 | Excelファイルの中身まで細かく操作したい | 中 |
| Power Query | 複数Excel・CSVの一括取得、結合、データ整形 | 同じ形式のデータをノーコードでまとめたい | 低~中 |
| Power Automate クラウド版 | OneDrive・SharePointなどの監視、Teams、メール通知、クラウドサービス連携 | クラウド上のイベントをきっかけに処理したい | 低~中 |
判断基準をシンプルにすると、次のようになります。
- ファイル名を変える、移動する、Windowsアプリを操作する → PAD
- Excelブックを開き、セルの値を転記・集計する → VBA
- 大量のExcel・CSVデータを同じ形にまとめる → Power Query
- OneDriveやSharePointの更新を検知して通知する → Power Automate クラウド版
実務では、これらを組み合わせるのも効果的です。
たとえば、PADでダウンロードファイルを整理 → Power Queryで複数CSVを集約 → Excelで分析という流れにすれば、ファイル保存から集計までの手作業を大幅に減らせます。
PADでファイル整理を自動化するときのチェックリスト
本番運用へ切り替える前に、次のポイントを確認しておきましょう。
- 対象フォルダのパスは正しいか
- *.xlsx、*.csvなどファイルフィルターを適切に設定したか
- 一時ファイル「~$」を除外できているか
- リネーム後も拡張子が正しく残っているか
- 同名ファイルが存在する場合のルールを決めたか
- 保存先フォルダがなければ自動作成できるか
- ファイルを開いたまま実行していないか
- テスト用ファイルで十分に動作確認したか
- 処理日・作成日・更新日のどれを基準にするか決めたか
- フローを2回実行しても想定外の二重リネームが起きないか
まとめ:毎日のリネーム・フォルダ整理はPADで自動化できる
Power Automate for desktopを使えば、毎日繰り返しているファイル名変更とフォルダ仕分けを、コードを書かずにデスクトップフローとして自動化できます。
今回の基本構成は次のとおりです。
- 「フォルダー内のファイルを取得」で対象ファイルを一覧化する
- 「For each」でファイルを1件ずつ処理する
- 「現在の日時を取得」でリネーム用の日付を取得する
- 「datetime をテキストに変換」でyyyyMMdd・yyyyMM形式へ変換する
- 「ファイルの名前を変更する」で日付や支店名を追加する
- 「フォルダーが存在する場合」で年月フォルダを確認する
- 「フォルダーを作成する」で必要な保存先を自動生成する
- 「ファイルの移動」で年月別フォルダへ仕分ける
たとえば、これまで毎朝手作業で行っていた次の作業も、自動化できます。
' ダウンロード直後
売上.csv
' PADでリネーム
20260906_東京支店_売上.csv
' 年月フォルダーへ自動移動
C:\Work\Archive\202609\20260906_東京支店_売上.csv
特に、ファイルそのものを開いて加工する必要がなく、「名前を変える」「コピーする」「移動する」「フォルダを作る」といったWindows上の定型操作が中心なら、PADは非常に相性のよい選択肢です。
関連記事
ファイル整理だけでなく、整理後のExcel・CSVをまとめて集計したい場合は、次の記事もあわせてご覧ください。
-
VBAでフォルダ内の複数ファイルを高速自動結合する方法
Excelブックの中身を開いて転記・結合・集計したい場合は、VBAが向いています。 -
Power Queryでフォルダ内の複数Excel・CSVをノーコード集約する方法
同じ形式のExcel・CSVをまとめて読み込み、整形・集約したい場合に便利です。 -
Power Automateクラウド版でExcel更新を検知・通知する方法
OneDriveやSharePoint上のファイル更新をきっかけに、Teamsやメールへ通知したい場合はこちらが適しています。
まずはテスト用フォルダに数個のダミーファイルを置き、「取得 → For each → リネーム → フォルダ作成 → 移動」という最小構成から試してみてください。仕組みを一度理解すれば、請求書、日報、売上データ、ダウンロードファイルなど、さまざまな定型ファイル整理へ応用できます。
