「ファイル操作」カテゴリーアーカイブ

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

この記事でできること

フォルダ内のファイル名を1つずつ右クリックで変更していませんか? VBAを使えば、Excelでリネーム表(旧名→新名)を作って実行するだけで、数十件のファイル名を一括変更できます。この記事では、ドライラン(事前確認)モード付きのコードをコピペで提供します。

  • 対象:ファイル名を手作業でリネームしている人、VBAが初めての人
  • 所要時間:コピペ → 実行まで約10分(目安。リネーム表の作成時間を含む)

完成イメージ(Before / After)

Excelのリネーム表

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

Before(実行前のフォルダ)


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

After(実行後のフォルダ)


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列に「成功」「失敗:理由」が記録される

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


よくある落とし穴5選

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

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の数式で生成すると効率的。


まとめ

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

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

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


もっとカスタマイズしたい場合

「連番の付与ルールを自動化したい」「日付の付け替えをしたい」「特定の文字列を一括置換したい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できます。

相談時に以下の情報があるとスムーズです:

  • Excel のバージョン / OS
  • リネームのルール(例:先頭に日付を付ける、特定文字を置換する)
  • ファイルの数(目安)
  • サブフォルダの有無

【VBA】フォルダ内のファイル一覧をExcelに自動出力する方法(コピペOK)

この記事でできること

フォルダの中にあるファイル名を、1つずつ手作業でExcelに入力していませんか? VBAを使えば、コードをコピペして実行するだけで、指定フォルダ内の全ファイル名がExcelシートに一覧出力されます。この記事では、VBAが初めての方でも迷わずできるよう、最小限のコード(5行)から手順を解説します。

  • 対象:ファイル名を手入力している人、VBAが初めての人
  • 所要時間:コピペ → 実行まで約5分(目安)

完成イメージ(Before / After)

Before(実行前)

空のExcelシート。フォルダにはファイルが10個入っている。

After(実行後)

A
1 売上報告_202601.xlsx
2 売上報告_202602.xlsx
3 在庫リスト.xlsx
4 議事録_0115.docx
5 写真_001.jpg

A列にファイル名が1行ずつ並ぶ。


実行前の準備

バックアップを取る

既存のデータが入っているExcelファイルで実行する場合は、先にファイルをコピーしてバックアップを取ってください。コード内の Cells.Clear でシートのデータがすべてクリアされます。

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

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

.xlsx のままだとマクロが保存されない。必ず .xlsm にすること。


手順(コピペ → 実行まで約5分)

VBE(コードを書く画面)を開く

Alt + F11 キーを押すとVBE(Visual Basic Editor)が開く。

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

標準モジュールを挿入する

  1. VBEのメニュー「挿入」→「標準モジュール」をクリック
  2. 右側に白い画面(コードウィンドウ)が表示される

コードを貼り付けて実行する

  1. 下の「コード(最小版)」をコピーして、コードウィンドウに貼り付ける
  2. コード内の folderPath を自分の対象フォルダのパスに書き換える
  3. Alt + F8 を押す(または VBE上で F5
  4. 「GetFileList」を選択して「実行」
  5. Sheet1 を開き、A列にファイル名が並んでいることを確認する

フォルダパスの確認方法: エクスプローラーでフォルダを開き、アドレスバーをクリックするとパスが表示される。それをコピーして使う。

パスの末尾に \ を忘れないこと。 例:C:\Users\tanaka\Documents\報告書\


コード(最小版)— ファイル名だけ取得

まずはこれだけで動く。フォルダ内のファイル名をA列に書き出す。


Sub GetFileList()

    Dim folderPath As String
    Dim fileName As String
    Dim row As Long

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

    ' 出力先シートをクリア(※既存データがあると消えるので注意)
    Worksheets("Sheet1").Cells.Clear

    ' 最初のファイル名を取得
    fileName = Dir(folderPath)

    row = 1

    ' ファイルがなくなるまで繰り返す
    Do While fileName <> ""
        Worksheets("Sheet1").Cells(row, 1).Value = fileName
        row = row + 1
        fileName = Dir()  ' 次のファイルを取得
    Loop

    MsgBox row - 1 & " 件のファイルを出力しました。", vbInformation

End Sub

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

パスの入力が面倒な場合(ダイアログで選択する方法):

folderPath = "..." の行を以下に置き換えると、実行時にフォルダ選択ダイアログが表示される。


    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = True Then
            folderPath = .SelectedItems(1) & "\"
        Else
            Exit Sub
        End If
    End With

コード(実務版)— パス・更新日時・サイズも取得

業務で使うなら、ファイル名だけでなくフルパス・更新日時・サイズも欲しい場合が多い。以下はFileSystemObjectを使った実務版。


Sub GetFileListDetail()

    Dim fso As Object
    Dim folder As Object
    Dim file As Object
    Dim row As Long
    Dim ws As Worksheet

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

    ' FileSystemObject を作成(参照設定不要)
    Set fso = CreateObject("Scripting.FileSystemObject")

    ' フォルダが存在するかチェック
    If Not fso.FolderExists(folderPath) Then
        MsgBox "フォルダが見つかりません:" & folderPath, vbExclamation
        Exit Sub
    End If

    Set folder = fso.GetFolder(folderPath)
    Set ws = Worksheets("Sheet1")

    ' 出力先シートをクリア(※既存データがあると消えるので注意)
    ws.Cells.Clear

    ' ヘッダー行
    ws.Cells(1, 1).Value = "ファイル名"
    ws.Cells(1, 2).Value = "フルパス"
    ws.Cells(1, 3).Value = "更新日時"
    ws.Cells(1, 4).Value = "サイズ(KB)"

    row = 2

    ' フォルダ内の各ファイルを処理
    For Each file In folder.Files
        ws.Cells(row, 1).Value = file.Name
        ws.Cells(row, 2).Value = file.Path
        ws.Cells(row, 3).Value = file.DateLastModified
        ws.Cells(row, 4).Value = Round(file.Size / 1024, 1)
        row = row + 1
    Next file

    MsgBox row - 2 & " 件のファイルを出力しました。", vbInformation

    Set file = Nothing
    Set folder = Nothing
    Set fso = Nothing

End Sub

CreateObject を使っているため、参照設定は不要。そのままコピペで動く。

シート名を変更している場合は Worksheets("Sheet1") を自分のシート名に書き換えること。


よくある落とし穴5選

# 症状 原因 対策
1 何も出力されない フォルダパスの末尾に \ がない パスの末尾に \ を必ず付ける。例:C:\Data\
2 「実行時エラー ’76’: パスが見つかりません」 フォルダパスが間違っている、またはフォルダが存在しない エクスプローラーのアドレスバーからパスをコピーして貼り付ける
3 マクロを保存したのに次回開くと消えている .xlsx で保存してしまった 「名前を付けて保存」→ ファイルの種類を .xlsm に変更する
4 既存のデータが消えた Cells.Clear が先頭にあるため、シートの全データがクリアされた 出力用に新しいシートを追加してから実行する。または Cells.Clear の行を削除する
5 日本語フォルダ名でエラーになる 一般的にはDir関数は日本語パスに対応しているが、特殊文字(# % など)がパスに含まれると問題になる場合がある フォルダ名に特殊文字を使わない。または短いパスに移動してから実行する

FAQ

Q1: サブフォルダ内のファイルも含めたい

Dir関数は1階層のみ対象。サブフォルダも含めるには FileSystemObject の再帰処理が必要になる。サブフォルダ対応を含むカスタマイズはココナラで相談できます。

Q2: .xlsx だけなど、特定の拡張子に絞りたい

最小版なら Dir(folderPath & "*.xlsx") と書き換える。実務版なら If fso.GetExtensionName(file.Name) = "xlsx" Then で条件分岐する。

Q3: ネットワークドライブ(\server\share)でも使える?

一般的にはUNCパス(\\サーバー名\共有名\)でも動作する。ただしアクセス権限がない場合はエラーになる。社内サーバーの場合はIT部門に確認すること。

Q4: 実行するたびに前回の結果が残ってしまう

コードの先頭に Cells.Clear が入っているため、通常は毎回クリアされる。もし残っている場合は、出力先シート名がコード内の指定と一致しているか確認する。

Q5: 100件以上のファイルがあっても大丈夫?

数千件程度なら問題ない。数万件を超える場合は Application.ScreenUpdating = False をコードの先頭に追加すると高速化できる。

Q6: サイズが「0」と表示されるファイルがある

0KBのファイルは空ファイル(中身がないファイル)。ファイル自体は存在するが、データが書き込まれていない状態。


まとめ

この記事で、指定フォルダ内のファイル名をExcelに自動一覧出力できるようになった。

  • 最小版:Dir関数でファイル名だけ取得。まずはこれで十分
  • 実務版:FileSystemObjectでパス・更新日時・サイズも取得

もっとカスタマイズしたい場合

「特定の拡張子だけ抽出したい」「サブフォルダも含めたい」「一覧をメールで自動送信したい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できます。

相談時に以下の情報があるとスムーズです:

  • Excel のバージョン / OS
  • 対象フォルダのパス構成(階層の深さ)
  • 出力したい項目(ファイル名以外に何が必要か)
  • ファイルの数(目安)