【VBA】ファイル名を一括変更(リネーム)する方法(コピペOK)

VBA
スポンサーリンク
スポンサーリンク

完成イメージ(Before / After)

Excelのリネーム表

A(旧ファイル名) B(新ファイル名)
1 旧ファイル名 新ファイル名
2 報告書_draft.xlsx 202601_売上報告.xlsx
3 報告書_draft2.xlsx 202602_売上報告.xlsx
4 data.csv 202601_在庫データ.csv

Before(実行前のフォルダ)

Before(実行前)のExcel画面

報告書_draft.xlsx
報告書_draft2.xlsx
data.csv

After(実行後のExcel画面)

After(実行後)のExcel画面
A(旧ファイル名) B(新ファイル名) C(結果)
1 旧ファイル名 新ファイル名 実行結果
2 報告書_draft.xlsx 202601_売上報告.xlsx 成功
3 報告書_draft2.xlsx 202602_売上報告.xlsx 成功
4 data.csv 202601_在庫データ.csv 成功

フォルダ内のファイル名も変更される:


202601_売上報告.xlsx
202602_売上報告.xlsx
202601_在庫データ.csv

実行前の準備

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

ファイル名の変更は元に戻せない操作です。 必ず対象フォルダを丸ごとコピーしてバックアップを取ってください。

手順:

  1. エクスプローラーで対象フォルダを右クリック
  2. 「コピー」→ 同じ場所に「貼り付け」
  3. 「対象フォルダ – コピー」というバックアップが作られる

Excelをマクロ有効ブック(.xlsm)で保存する

  1. Excelを開く(新規でも既存でもOK)
  2. 「ファイル」→「名前を付けて保存」
  3. ファイルの種類を 「Excel マクロ有効ブック (*.xlsm)」 に変更して保存

Windowsの拡張子を表示する

リネーム表には拡張子(.xlsx .csv など)を含めて記載する必要がある。Windowsの初期設定では拡張子が非表示のため、以下の手順で表示する。

  1. エクスプローラーを開く
  2. 上部メニューの「表示」タブをクリック
  3. ファイル名拡張子」にチェックを入れる

これでファイル名の末尾に .xlsx .csv などが表示されるようになる。

手順

ステップ1:リネーム表を作る

Sheet1 に以下のように入力する。

  • A1:旧ファイル名(ヘッダー)
  • B1:新ファイル名(ヘッダー)
  • A2以降:現在のファイル名(拡張子を含む
  • B2以降:変更後のファイル名(拡張子を含む

旧ファイル名の入力を楽にする方法:【VBA】フォルダ内のファイル一覧をExcelに自動出力する方法」のコードでA列にファイル名を出力し、それをリネーム表のA列に使うと手入力が不要になる。

リネーム表のチェックポイント:

  • 旧・新どちらも 拡張子を含めて 記載する(例:報告書.xlsx
  • 新ファイル名に使用禁止文字(\ / : * ? " < > |)を含めない
  • 新ファイル名が重複していないか確認する(B列で =COUNTIF(B:B,B2) を使うと重複チェックできる。2以上なら重複あり)

ステップ2:VBEを開いてコードを貼り付ける

  1. Alt + F11 でVBE(コードを書く画面)を開く
  2. メニュー「挿入」→「標準モジュール
  3. 下の「コード(最小版)」をコピーしてコードウィンドウに貼り付ける

一般的にはAlt + F11で開けるが、企業のセキュリティ設定でVBAが無効化されている場合は、IT部門に確認すること。

ステップ3:フォルダパスを書き換える

コード内の folderPath = "C:\Users\(ユーザー名)\Desktop\対象フォルダ\" を、自分の対象フォルダのパスに書き換える。

パスの末尾に \ を忘れないこと。

ステップ4:マクロを実行する

  1. Alt + F8 を押す
  2. 「RenameFiles」を選択して「実行」
  3. 確認ダイアログが表示されるので「はい」を押す

ステップ5:結果を確認する

  1. C列に「成功」「失敗:理由」が記録されているので確認する
  2. フォルダを開き、ファイル名が変更されていることを確認する
  3. 1つファイルを開いて、中身が壊れていないことを確認する

コード(最小版)— リネーム表どおりに一括変更

Sheet1のリネーム表(A列:旧名、B列:新名)に従ってファイル名を変更する。結果はC列に記録される。


Sub RenameFiles()

    Dim folderPath As String
    Dim oldName As String
    Dim newName As String
    Dim row As Long
    Dim ws As Worksheet
    Dim successCount As Long
    Dim failCount As Long

    ' ★ ここを自分のフォルダパスに書き換える(末尾の \ を忘れずに)
    folderPath = "C:\Users\(ユーザー名)\Desktop\対象フォルダ\"

    Set ws = Worksheets("Sheet1")

    ' 確認ダイアログ
    If MsgBox("リネーム表の内容でファイル名を変更します。" & vbCrLf & _
              "対象フォルダ:" & folderPath & vbCrLf & vbCrLf & _
              "この操作は元に戻せません。" & vbCrLf & _
              "バックアップは取りましたか?" & vbCrLf & vbCrLf & _
              "実行しますか?", vbYesNo + vbExclamation) = vbNo Then
        Exit Sub
    End If

    row = 2  ' ヘッダー行(1行目)をスキップ

    Do While ws.Cells(row, 1).Value <> ""

        oldName = ws.Cells(row, 1).Value
        newName = ws.Cells(row, 2).Value

        ' 新ファイル名が空ならスキップ
        If newName = "" Then
            ws.Cells(row, 3).Value = "スキップ(新ファイル名が空)"
            row = row + 1
            ' ↓ 次の行に進む(GoTo の飛び先)
            GoTo NextRow
        End If

        ' リネーム実行(エラーが出ても次のファイルに進む)
        On Error Resume Next
        Name folderPath & oldName As folderPath & newName
        If Err.Number = 0 Then
            ws.Cells(row, 3).Value = "成功"
            successCount = successCount + 1
        Else
            ws.Cells(row, 3).Value = "失敗:" & Err.Description
            failCount = failCount + 1
            Err.Clear
        End If
        On Error GoTo 0

NextRow:
        row = row + 1
    Loop

    MsgBox "完了しました。" & vbCrLf & _
           "成功:" & successCount & " 件" & vbCrLf & _
           "失敗:" & failCount & " 件" & vbCrLf & vbCrLf & _
           "C列に詳細を記録しました。", vbInformation

End Sub

シート名について: コード内の "Sheet1" はシート名(タブに表示される名前)。シート名を変更している場合は書き換えること。

コード(実務版)— ドライラン+ログ出力付き

実務では「本当にこのリネームで合っているか」を事前確認したい場面が多い。以下のコードはドライラン(確認のみ・変更なし)モードを搭載している。


Sub RenameFilesWithDryRun()

    Dim folderPath As String
    Dim oldName As String
    Dim newName As String
    Dim row As Long
    Dim ws As Worksheet
    Dim isDryRun As Boolean
    Dim successCount As Long
    Dim failCount As Long
    Dim skipCount As Long

    ' ★ ここを自分のフォルダパスに書き換える(末尾の \ を忘れずに)
    folderPath = "C:\Users\(ユーザー名)\Desktop\対象フォルダ\"

    Set ws = Worksheets("Sheet1")

    ' ドライラン or 本実行を選択
    Select Case MsgBox("ドライラン(確認のみ・変更なし)で実行しますか?" & vbCrLf & vbCrLf & _
                       "「はい」→ ドライラン(ファイルは変更されません)" & vbCrLf & _
                       "「いいえ」→ 本実行(ファイル名が変更されます)" & vbCrLf & _
                       "「キャンセル」→ 中止", _
                       vbYesNoCancel + vbQuestion)
        Case vbYes
            isDryRun = True
        Case vbNo
            isDryRun = False
            ' 本実行の最終確認
            If MsgBox("本当にファイル名を変更しますか?" & vbCrLf & _
                      "この操作は元に戻せません。" & vbCrLf & _
                      "バックアップは取りましたか?", _
                      vbYesNo + vbExclamation) = vbNo Then
                Exit Sub
            End If
        Case vbCancel
            Exit Sub
    End Select

    ' C列(結果列)をクリア
    ws.Range("C:C").Clear

    ' ヘッダー
    If isDryRun Then
        ws.Cells(1, 3).Value = "ドライラン結果"
    Else
        ws.Cells(1, 3).Value = "実行結果"
    End If

    row = 2

    Do While ws.Cells(row, 1).Value <> ""

        oldName = ws.Cells(row, 1).Value
        newName = ws.Cells(row, 2).Value

        ' 新ファイル名が空ならスキップ
        If newName = "" Then
            ws.Cells(row, 3).Value = "スキップ:新ファイル名が空"
            skipCount = skipCount + 1
            row = row + 1
            ' ↓ 次の行に進む(GoTo の飛び先)
            GoTo NextRow2
        End If

        ' 旧ファイルが存在するか確認
        If Dir(folderPath & oldName) = "" Then
            ws.Cells(row, 3).Value = "NG:旧ファイルが見つからない"
            failCount = failCount + 1
            row = row + 1
            GoTo NextRow2
        End If

        ' 新ファイル名が既に存在するか確認(旧名と同じ場合は除く)
        If oldName <> newName And Dir(folderPath & newName) <> "" Then
            ws.Cells(row, 3).Value = "NG:新ファイル名が既に存在する"
            failCount = failCount + 1
            row = row + 1
            GoTo NextRow2
        End If

        If isDryRun Then
            ' ドライラン:チェックのみ
            ws.Cells(row, 3).Value = "OK:変更可能"
            successCount = successCount + 1
        Else
            ' 本実行:リネーム
            On Error Resume Next
            Name folderPath & oldName As folderPath & newName
            If Err.Number = 0 Then
                ws.Cells(row, 3).Value = "成功"
                successCount = successCount + 1
            Else
                ws.Cells(row, 3).Value = "失敗:" & Err.Description
                failCount = failCount + 1
                Err.Clear
            End If
            On Error GoTo 0
        End If

NextRow2:
        row = row + 1
    Loop

    ' 結果サマリー
    Dim mode As String
    If isDryRun Then mode = "【ドライラン】" Else mode = "【本実行】"

    MsgBox mode & " 完了しました。" & vbCrLf & _
           "成功/OK:" & successCount & " 件" & vbCrLf & _
           "失敗/NG:" & failCount & " 件" & vbCrLf & _
           "スキップ:" & skipCount & " 件" & vbCrLf & vbCrLf & _
           "C列に詳細を記録しました。", vbInformation

End Sub

使い方:

  1. まず「はい(ドライラン)」で実行 → C列に「OK:変更可能」「NG:理由」が表示される
  2. C列を確認し、全行OKならもう一度実行して「いいえ(本実行)」を選ぶ
  3. 本実行後、C列に「成功」「失敗:理由」が記録される

注意: ドライランと本実行は続けて行うこと。間に時間が空くとファイルの移動・削除で結果が変わる可能性がある。

この実務版のドライラン機能を導入してからは、リネームのミスがゼロになった。200件の命名規則変更のときも、まずドライランで全件「OK:変更可能」を確認してから本実行した。もし1件でもNGがあればリネーム表を直してやり直せる。本番一発勝負の恐怖がなくなるだけで、精神的な負担がまるで違う。チームのメンバーにもこの手順を教えたら、自分がいなくても命名規則の変更対応ができるようになった。

よくある落とし穴6選

# 症状 原因 対策
1 「失敗:ファイルが見つかりません」 リネーム表の旧ファイル名がフォルダ内に存在しない。拡張子の抜け、スペルミスが多い エクスプローラーからファイル名をコピーして貼り付ける。拡張子まで含めること
2 「失敗:既に同名のファイルが存在します」 新ファイル名がフォルダ内の別ファイルと重複 B列で =COUNTIF(B:B,B2) を使って重複チェックする
3 「失敗:書き込みできません」 対象ファイルが他のアプリで開かれている 対象ファイルをすべて閉じてから実行する
4 拡張子が消えた / 変わった 旧ファイル名には拡張子を含めたが、新ファイル名で拡張子を書き忘れた。またはWindowsの設定で拡張子が非表示になっているため、そもそも拡張子を認識していなかった 旧・新どちらも拡張子まで含めて記載する。拡張子が見えない場合は「実行前の準備」の手順でWindowsの設定を変更する
5 一部だけリネームされて困る 途中のファイルでエラーが発生した。最小版でもエラーハンドリングで次のファイルに進むが、エラー原因は事前確認で防げる 実務版のドライランで事前にNGを検出してから本実行する
6 リネーム後に拡張子が二重になった(例:報告書.xlsx.xlsx 自分も最初これに気づかず何度かやらかしたのだが、Windowsの拡張子表示がオフの状態でリネーム表を作ると、見えていない .xlsx の上にさらに .xlsx を付けてしまう 「実行前の準備」の手順でWindowsの拡張子表示をオンにしてからリネーム表を作る

VBAでファイル名が変更できないときの対処法

「リネームを実行したのにC列が『失敗:ファイルが見つかりません』になる」という場合、原因はリネーム表の旧ファイル名に拡張子が含まれていないことが多い。Windowsの設定で拡張子が非表示になっていると、拡張子を書き忘れやすい。「実行前の準備」の手順でWindowsの拡張子表示をオンにしてから、エクスプローラーでファイル名を確認して転記すれば解決する。

VBAのName文でリネーム時にエラーが出るときの対処法

「実行時エラー ’58’: 既に同名のファイルが存在します」が出る場合、新ファイル名がフォルダ内の別ファイルと重複している。B列で =COUNTIF(B:B,B2) を使って重複チェックし、2以上になっている行のファイル名を修正してから再実行する。

FAQ

Q1: 元のファイル名に戻したい

リネームは元に戻す機能がない。バックアップから復元するか、リネーム表のA列とB列を入れ替えて再実行する方法がある。だからこそ実行前のバックアップが必須。

Q2: ファイル名に連番を付けたい(例:001_, 002_…)

B列に連番付きのファイル名を入力する。Excelの数式で自動生成も可能。例:=TEXT(ROW()-1,"000") & "_" & A2(この数式は旧ファイル名の先頭に連番を付けるもので、拡張子もそのまま維持される)

Q3: サブフォルダ内のファイルもリネームしたい

この記事のコードは1階層のみ対象。サブフォルダも対象にするには再帰処理が必要。

Q4: 特定の文字列を一括置換したい(例:「旧」→「新」)

VBAの Replace 関数を使えばリネーム表を手作業で作らずに一括置換できる。ただしこの記事の範囲外。

Q5: ファイル数が多い(100件以上)が大丈夫か?

数千件程度なら問題ない。リネーム表の作成が大変な場合は、「【VBA】フォルダ内のファイル一覧をExcelに自動出力する方法」のコードでA列にファイル名を出力し、B列の新ファイル名をExcelの数式で生成すると効率的。

Q6: リネーム後にファイルを別フォルダに振り分けたい

【VBA】ファイルを別フォルダにコピー・移動する方法」と組み合わせると、リネーム→振り分けまで一気に自動化できる。また、フォルダの自動作成と振り分けを同時にやりたい場合は「【VBA】フォルダを自動作成して振り分ける方法」も参考になる。

まとめ

この記事で、Excelのリネーム表を使ったファイル名の一括変更ができるようになった。

  • 最小版:リネーム表どおりにリネーム。結果はC列に記録される
  • 実務版:ドライラン(事前確認)→ 本実行の2ステップで安心

関連記事: リネーム表の旧ファイル名をExcelに自動出力したい場合は「【VBA】フォルダ内のファイル一覧をExcelに自動出力する方法」を参照。

次にやりたくなること

この記事の自動化ができたら、次はこんなことも試してみてください。

コメント

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