Excel VBAでファイル名を一括変更する方法|コピペで動くリネームマクロと実運用レベルの改良版を徹底解説

Excelでファイル名を一括変更する解説の図解 Excel

どうも、くまおやぢです。

「report001.pdf、report002.pdf……これ、全部ファイル名を変えないといけないのか」

100件あったら、手でやったら30分以上かかります。ミスも出ます。翌月また同じ作業が来ます。

そういう地獄から抜け出すのに、わざわざ専門的なプログラミングを覚える必要はありません。ExcelとVBAがあれば解決できます。

Excelに「変更前→変更後」の対応表を作って、マクロを走らせるだけ。100件でも1000件でも、数秒で終わります。


⚡ 急いでいる人へ|最短手順

  1. Excelのシートに「A列:旧ファイル名」「B列:新ファイル名」を記入する
  2. 下記の基本コードをThisWorkbookではなく標準モジュールに貼り付ける
  3. folderPath を対象フォルダのパスに書き換える
  4. マクロを実行する

コードと詳しい手順は、この記事で全部カバーします。


この記事でできること

  • 基本コード:コピペしてパスを1行書き換えるだけで動くリネームマクロ
  • 実運用レベルの改良版:バックアップ自動作成・ログ出力・フォルダ選択ダイアログ・同名ファイルの衝突回避を全部入れた完成形
  • よくある詰まりポイント:「何も起こらず終わる」「ファイルが見つからない」などのエラー対処法
  • 応用テクニック:日付・連番の自動付与、文字列の一括置換、拡張子フィルター

01. 仕組みをざっくり理解する|3ステップだけ

VBAでファイル名を変える仕組みは、シンプルです。

  1. Excelに対応表を作る(旧名 → 新名)
  2. フォルダのパスを指定する(どこのファイルを変えるか)
  3. VBAが1行ずつ読み取ってリネームする

Excelが「変換の設計図」、VBAが「実際に動く機械」です。

重要なのは、VBAはファイルを「移動」することでリネームするという点です。Name 旧パス As 新パス というVBA命令、または FileSystemObject の MoveFile メソッドを使います。ファイルは削除も複製もされません。名前が変わるだけです。

基本の対応表(Excelの構成)

A列(旧ファイル名)B列(新ファイル名)
report001.pdf2026年_営業報告_1.pdf
report002.pdf2026年_営業報告_2.pdf
photo_001.jpg2026-02_現場写真_001.jpg

注意点はひとつ。拡張子まで含めて記載すること。 .pdf や .xlsx を省略すると、ファイルが見つからずにエラーになります。


02. 作業前の準備|ここをサボると後で詰まる

バックアップを先に取る(必須)

ファイル名の変更は「元に戻す」が難しい操作です。Ctrl+Zでは戻せません。

実行前に対象フォルダをまるごとコピーしておくことを、強くおすすめします。「バックアップを取るほどでもないか」と思ったケースほど、後悔する事態が起きます。経験談です。

フォルダの構造を確認する

今回のマクロは、指定した1つのフォルダの直下にあるファイルだけが対象です。サブフォルダの中までは処理しません。

対象ファイルを1つのフォルダにまとめておいてください。

例:C:\Users\YourName\Documents\RenameTarget\

Excelファイルの場所

リネーム用のExcelファイルは、対象フォルダとは別の場所に置くことをおすすめします。同じフォルダに入れると、マクロが自分自身のファイル名を誤って処理しようとすることがあります。

マクロ有効ファイルとして保存する

VBAを含むExcelファイルは、.xlsm(マクロ有効ブック)形式で保存してください。.xlsx で保存するとマクロが消えます。


03. 基本コード|まずこれをコピペして動かす

VBEへの貼り付け手順

  1. Excelを開き、Alt + F11 でVBE(Visual Basic Editor)を開く
  2. 「挿入」→「標準モジュール」を選択
  3. 表示されたコードウィンドウに、以下のコードを貼り付ける
  4. folderPath の部分を自分の環境のパスに変更する
  5. F5 キー、または「実行」→「Sub/ユーザーフォームの実行」で動かす

基本コード

Sub RenameFiles()

    Dim folderPath As String
    Dim oldName As String
    Dim newName As String
    Dim i As Long
    Dim fso As Object

    ' ★ここを自分のフォルダパスに変更する(末尾の\は必須)
    folderPath = "C:\Users\YourName\Documents\RenameTarget\"

    ' FileSystemObjectを生成
    Set fso = CreateObject("Scripting.FileSystemObject")

    ' 2行目から処理(1行目はヘッダー)
    i = 2
    Do While Cells(i, 1).Value <> ""

        oldName = folderPath & Cells(i, 1).Value  ' A列:旧ファイル名
        newName = folderPath & Cells(i, 2).Value  ' B列:新ファイル名

        If fso.FileExists(oldName) Then
            fso.MoveFile oldName, newName
        Else
            Debug.Print "ファイルが見つかりません: " & Cells(i, 1).Value
        End If

        i = i + 1
    Loop

    MsgBox "リネームが完了しました!", vbInformation

End Sub

このコードの動き

  1. folderPath で指定したフォルダを起点にする
  2. A列の値(旧ファイル名)とフォルダパスを組み合わせて「旧ファイルのフルパス」を作る
  3. ファイルが存在するか確認する
  4. 存在すれば MoveFile で名前を変える
  5. 存在しなければ Debug.Print でイミディエイトウィンドウに記録して次へ進む
  6. A列が空欄になったら終了

💡 パスの末尾の \ は必須
folderPath の末尾に \ がないと、"C:\RenameTarget" + "report001.pdf" が "C:\RenameTargetreport001.pdf" になってしまいます。必ず \ で終わらせてください。


04. 実運用レベルの改良版|現場で本当に使えるコード

基本コードは「動く」最小構成です。でも実際の業務で使うなら、次の機能が欲しくなります。

  • バックアップを自動で取ってから実行したい
  • 処理結果をログ(C列)に残したい
  • 同名ファイルがあったときに上書きしたくない
  • フォルダパスをダイアログで選びたい
  • 実行前に「本当に実行しますか?」と聞いてほしい

以下は、これらをすべて盛り込んだ改良版です。コピペしてそのまま使えます。

改良版コード(実運用仕様)

Sub RenameFiles_Pro()

    Dim folderPath As String
    Dim backupPath As String
    Dim oldName As String
    Dim newName As String
    Dim i As Long
    Dim fso As Object
    Dim successCount As Long
    Dim skipCount As Long
    Dim errorCount As Long

    ' FileSystemObjectを生成
    Set fso = CreateObject("Scripting.FileSystemObject")

    ' ── フォルダをダイアログで選択 ──────────────────────────
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "リネーム対象のフォルダを選択してください"
        If .Show = -1 Then
            folderPath = .SelectedItems(1) & "\"
        Else
            MsgBox "フォルダが選択されませんでした。処理を終了します。", vbExclamation
            Exit Sub
        End If
    End With

    ' ── バックアップフォルダを作成 ──────────────────────────
    backupPath = folderPath & "backup_" & Format(Now, "yyyymmdd_hhmmss") & "\"
    On Error Resume Next
    fso.CreateFolder backupPath
    On Error GoTo 0

    If Not fso.FolderExists(backupPath) Then
        MsgBox "バックアップフォルダの作成に失敗しました。処理を中止します。", vbCritical
        Exit Sub
    End If

    ' ── 実行確認 ──────────────────────────────────────────
    If MsgBox("以下のフォルダを対象にリネームを実行します。" & vbCrLf & vbCrLf & _
              folderPath & vbCrLf & vbCrLf & _
              "実行前にバックアップを作成します。続けますか?", _
              vbYesNo + vbQuestion, "リネーム確認") = vbNo Then
        Exit Sub
    End If

    ' ── 処理ヘッダーをC列に記録 ──────────────────────────
    Cells(1, 3).Value = "処理結果"
    successCount = 0
    skipCount = 0
    errorCount = 0

    ' ── リネーム処理 ──────────────────────────────────────
    i = 2
    Do While Cells(i, 1).Value <> ""

        oldName = folderPath & Cells(i, 1).Value
        newName = folderPath & Cells(i, 2).Value

        ' A列またはB列が空欄の場合はスキップ
        If Cells(i, 1).Value = "" Or Cells(i, 2).Value = "" Then
            Cells(i, 3).Value = "スキップ(空欄)"
            skipCount = skipCount + 1

        ' 旧ファイルが存在しない場合
        ElseIf Not fso.FileExists(oldName) Then
            Cells(i, 3).Value = "NG:旧ファイルが見つかりません"
            errorCount = errorCount + 1

        ' 新ファイル名がすでに存在する場合(上書き防止)
        ElseIf fso.FileExists(newName) Then
            Cells(i, 3).Value = "NG:新ファイル名がすでに存在します"
            errorCount = errorCount + 1

        ' 正常処理
        Else
            ' バックアップを取ってからリネーム
            On Error Resume Next
            fso.CopyFile oldName, backupPath & Cells(i, 1).Value
            fso.MoveFile oldName, newName
            If Err.Number = 0 Then
                Cells(i, 3).Value = "OK"
                successCount = successCount + 1
            Else
                Cells(i, 3).Value = "NG:エラーコード " & Err.Number
                errorCount = errorCount + 1
                Err.Clear
            End If
            On Error GoTo 0
        End If

        i = i + 1
    Loop

    ' ── 完了メッセージ ────────────────────────────────────
    MsgBox "リネーム完了!" & vbCrLf & vbCrLf & _
           "成功:" & successCount & " 件" & vbCrLf & _
           "スキップ:" & skipCount & " 件" & vbCrLf & _
           "エラー:" & errorCount & " 件" & vbCrLf & vbCrLf & _
           "バックアップ場所:" & vbCrLf & backupPath, _
           vbInformation, "処理結果"

End Sub

改良版で追加した機能の解説

フォルダ選択ダイアログ

毎回コードを書き換えずに、実行時にフォルダを選べます。パスの書き間違いによる事故が防げます。

バックアップの自動作成

実行のたびに backup_日時 という名前のフォルダを自動生成して、リネーム前のファイルをコピーします。後から「やっぱり戻したい」が発生しても、バックアップがあれば安心です。

実行前の確認ダイアログ

「本当に実行しますか?」を確認してから処理します。フォルダパスも表示されるので、「違うフォルダを選んでしまった」に気付けます。

同名ファイルの衝突回避

変更後のファイル名がすでに存在する場合は、上書きせずにスキップして「NG:新ファイル名がすでに存在します」とログに残します。

C列へのログ出力

処理結果を「OK」「NG:〇〇」「スキップ」の形でC列に書き込みます。処理後に何が成功して何が失敗したかを一目で確認できます。


05. 応用テクニック|よく使うカスタマイズ集

特定の拡張子だけを処理する

PDFだけ、Excelだけなど、特定の種類のファイルに絞って処理する場合は、条件を追加します。

' 拡張子が .pdf のファイルだけ処理する
If LCase(fso.GetExtensionName(oldName)) = "pdf" Then
    fso.MoveFile oldName, newName
End If

ファイル名に日付・連番を自動付与する

「report001.pdf」を「2026年02月_report_001.pdf」のように自動変換したい場合は、新ファイル名を動的に生成します。

' B列が空の場合、日付+連番で自動生成する
If Cells(i, 2).Value = "" Then
    newName = folderPath & Format(Date, "yyyy年mm月") & "_" & _
              fso.GetBaseName(Cells(i, 1).Value) & "_" & _
              Format(i - 1, "000") & "." & _
              fso.GetExtensionName(Cells(i, 1).Value)
End If

ファイル名の文字列を一括置換する

「仮」→「正式」、「temp」→「final」のように、ファイル名の一部を一括で置き換えたい場合はReplaceを使います。

' A列の値をそのまま使い、特定の文字列だけ置換して新ファイル名を作る
Cells(i, 2).Value = Replace(Cells(i, 1).Value, "仮", "正式")

これをマクロ実行前に走らせてB列を自動生成してから、リネームマクロに渡す、という使い方ができます。

フォルダ内のファイル名を自動でExcelに取り込む

現在のファイル名を手入力するのが面倒な場合、以下のマクロでA列に自動取得できます。

Sub GetFileList()

    Dim folderPath As String
    Dim fso As Object
    Dim folder As Object
    Dim file As Object
    Dim i As Long

    ' フォルダをダイアログで選択
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "ファイル一覧を取得するフォルダを選択してください"
        If .Show = -1 Then
            folderPath = .SelectedItems(1) & "\"
        Else
            Exit Sub
        End If
    End With

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set folder = fso.GetFolder(folderPath)

    ' ヘッダー行を設定
    Cells(1, 1).Value = "旧ファイル名"
    Cells(1, 2).Value = "新ファイル名"
    Cells(1, 3).Value = "処理結果"

    i = 2
    For Each file In folder.Files
        Cells(i, 1).Value = file.Name  ' A列に現在のファイル名を取得
        i = i + 1
    Next file

    MsgBox folder.Files.Count & " 件のファイルを取得しました。" & vbCrLf & _
           "B列に新しいファイル名を入力してください。", vbInformation

End Sub

このマクロでA列を埋めて、B列に新しいファイル名を入力してから、リネームマクロを実行——という流れが、実務では一番スムーズです。


06. よくある詰まりポイントと対処法

「何も起こらず終わる」

原因はほぼ2つです。

① folderPath の末尾に \ がない

"C:\Users\YourName\Documents\RenameTarget" → "C:\Users\YourName\Documents\RenameTarget\" に修正してください。

② A列のデータが2行目から始まっていない

コード内の i = 2 は「2行目から処理を開始する」という意味です。1行目をヘッダー行にして、データを2行目から入力してください。

「ファイルが見つかりません」エラー

確認ポイントを順番に当たります。

  • 拡張子を含めて記載しているか(.pdf .xlsx など)
  • ファイル名の先頭・末尾に余計なスペースがないか
  • A列のファイル名と実際のファイル名が完全一致しているか(全角半角・大文字小文字)
  • 指定フォルダに実際にそのファイルが存在するか
  • Windowsの設定で「拡張子を非表示」にしていて、ファイル名を誤認していないか

「Permission Denied」(アクセス拒否)エラー

対象のファイルが別のアプリで開かれています。Excelやブラウザなど、ファイルを開いているアプリを全部閉じてから再実行してください。

読み取り専用に設定されているファイルでも同じエラーが出ます。

「マクロが実行できない」セキュリティエラー

Excelのセキュリティ設定でマクロが無効化されています。

  1. 「ファイル」→「オプション」→「セキュリティセンター」→「セキュリティセンターの設定」
  2. 「マクロの設定」で「警告を表示してすべてのマクロを無効にする」を選択
  3. ファイルを開き直し、「コンテンツの有効化」をクリック

会社の管理PCでマクロ実行自体が禁止されている場合は、IT部門に確認が必要です。

「MacのExcelでは動かない」

このコードは Windows専用 です。FileSystemObject はWindowsのCOMオブジェクトを使っているため、MacのExcelでは動作しません。

Mac環境でのファイルリネームを自動化したい場合は、AppleScriptやPython(os.rename)が代替手段になります。


07. よくある質問(FAQ)

Q. 実行中にフリーズしているように見えます

大量のファイル(数百件以上)を処理すると、画面の更新が止まってフリーズしているように見えることがあります。実際は処理が続いています。

心配なら、処理の途中でステータスバーに進捗を表示する行を追加できます。

Application.StatusBar = i & " 行目を処理中..."

処理が終わったら Application.StatusBar = False でリセットします。

Q. 変更後のファイルが「消えた」ように見えます

消えていません。新しいファイル名に変わっています。 フォルダ内を新ファイル名で検索してみてください。

同名ファイルが存在して上書きされた可能性がある場合は、バックアップフォルダを確認してください(改良版を使っていれば自動でバックアップが残っています)。

Q. 確認メッセージを1件ずつ出したい

件数が少ない場合に限り、1件ずつ確認するコードに変更できます。

If MsgBox(Cells(i, 1).Value & " → " & Cells(i, 2).Value & vbCrLf & _
          "このファイルをリネームしますか?", vbYesNo) = vbYes Then
    fso.MoveFile oldName, newName
End If

ただし100件以上ある場合は実用的ではないので、そのときは一括処理に切り替えてください。

Q. サブフォルダの中のファイルも処理したい

今回のコードはサブフォルダ内のファイルを対象にしていません。サブフォルダまで再帰的に処理するには、再帰呼び出しを使う必要があります。需要があれば別記事で扱います。


08. まとめ|手作業のリネームは、今日で卒業

VBAでファイル名を一括変更する仕組みは、シンプルです。

  1. Excelに対応表を作る(旧名 → 新名)
  2. フォルダパスを指定する
  3. マクロを走らせる

これだけで、100件でも1000件でも、数秒で終わります。手作業ではあり得なかったスピードで、ミスもゼロです。

この記事で紹介したコードをまとめると、使い分けはこうです。

コード向いているケース
基本コード(03章)初めて試す・小規模・シンプルに動かしたい
改良版コード(04章)実務で使う・バックアップ必須・ログを残したい
ファイル一覧取得(05章)A列を手入力したくない・ファイルが大量にある

まずは小さいフォルダで基本コードを試してみてください。「あ、動いた」という体験があれば、あとは改良版に切り替えるだけです。

「面倒だな」と感じる繰り返し作業は、ほぼ全部VBAで自動化できます。リネームはその入門として、ちょうどいいサイズの課題です。

ぜひ今日の業務から使ってみてください。

コメント

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