Excel VBAでファイル名に日付を自動追加!複数ファイルを一括リネームするマクロ

Excel・VBA

Excel VBAでファイル名に日付を自動追加!複数ファイルを一括リネームするマクロ

「このファイル、いつ作成したんだっけ…?」
日々の業務で増え続けるファイル。「作業日」や「更新日」をファイル名に含めておけば、後から見返すときに非常に便利ですよね。

しかし、手作業で一つずつファイル名に日付を追加していくのは手間がかかる上に、ヒューマンエラーの原因にもなります。
そこで今回は、Excel VBAを使って複数のファイル名に日付を一括で自動追加する方法を、初心者の方でもすぐに使えるサンプルコードを交えて解説します。

このマクロを使えば、煩わしいファイル名変更作業から解放され、効率的なファイル管理が実現できます!

なぜファイル名に日付を追加するのか?

  • 視認性の向上: いつ作成・更新されたファイルなのかが一目で分かります。
  • バージョン管理: 同じファイル名の異なるバージョンの区別が容易になります。
  • 検索性の向上: 特定の期間に作成されたファイルを素早く見つけやすくなります。
  • 手作業の削減: 大量のファイルを一括で処理できるため、作業時間を大幅に短縮できます。

準備:VBAを動かすための初期設定

まずはVBAを記述するための準備をしましょう。

  1. 開発タブの表示:
    • Excelを開き、「ファイル」タブ → 「オプション」をクリック。
    • 「リボンのユーザー設定」を選択し、「開発」にチェックを入れて「OK」をクリックします。
  2. VBE(Visual Basic Editor)の起動:
    • Excelのリボンに表示された「開発」タブから「Visual Basic」をクリックします(またはAlt + F11キー)。
  3. 標準モジュールの挿入:
    • VBEの左側にあるプロジェクトエクスプローラーで、対象のブックを右クリック → 「挿入」 → 「標準モジュール」を選択します。
    • 表示された白いウィンドウにコードを記述していきます。
  4. 参照設定の追加(重要!):
    • ファイルシステムを操作するために、「Microsoft Scripting Runtime」ライブラリへの参照設定が必要です。
    • VBEのメニューバーから「ツール」→「参照設定」をクリック。
    • 「参照設定」ダイアログボックスが表示されたら、リストの中から「Microsoft Scripting Runtime」を探し、チェックを入れて「OK」をクリックします。
    • ※この設定を忘れると、後述のコードでエラーが発生します。

基本を理解する:単一ファイルのファイル名変更

まずは、VBAでファイル名を変更する基本的な方法を見ていきましょう。VBAにはNameステートメントという便利な機能があります。

Sub RenameSingleFile()
    '変更したいファイルのフルパスと新しいファイル名を定義します
    Dim oldFullPath As String
    Dim newFullPath As String
    Dim currentDate As String
    Dim targetFolder As String
    Dim fileName As String
    Dim fileExtension As String

    '対象のフォルダを指定(ご自身の環境に合わせて変更してください)
    targetFolder = "C:\Users\YourUser\Documents\TestFiles\" '末尾に"\"を忘れずに

    '変更したいファイル名(拡張子含む)
    fileName = "Report.xlsx"

    'ファイル名と拡張子を分割
    fileExtension = Right(fileName, Len(fileName) - InStrRev(fileName, "."))
    fileName = Left(fileName, InStrRev(fileName, ".") - 1)

    '今日の日付をYYYYMMDD形式で取得
    currentDate = Format(Date, "yyyymmdd") '日付のみ

    '元のファイルのフルパス
    oldFullPath = targetFolder & fileName & "." & fileExtension

    '新しいファイルのフルパス(ファイル名の先頭に日付を追加)
    newFullPath = targetFolder & currentDate & "_" & fileName & "." & fileExtension

    'ファイルが存在するか確認
    If Dir(oldFullPath) <> "" Then
        'ファイル名を変更
        Name oldFullPath As newFullPath
        MsgBox "ファイル名が変更されました: " & newFullPath, vbInformation
    Else
        MsgBox "ファイルが見つかりません: " & oldFullPath, vbExclamation
    End If
End Sub

このコードでは、指定したReport.xlsxというファイル名を20231027_Report.xlsxのように変更します(日付は実行時のもの)。

  • targetFolder: 対象ファイルがあるフォルダのパスを指定します。
  • fileName, fileExtension: ファイル名と拡張子を正確に取得し、新しいファイル名を作成します。
  • Format(Date, "yyyymmdd"): 現在の日付を「YYYYMMDD」形式の文字列として取得します。
  • Name oldFullPath As newFullPath: これが実際にファイル名を変更するVBAのステートメントです。

この仕組みを応用して、複数のファイルを一括で処理するマクロを作成しましょう。

実践:指定フォルダ内のファイル名に日付を一括追加するマクロ

次に、指定したフォルダ内のすべてのファイル(または特定の拡張子のファイル)に対して、ファイル名に日付を一括で追加するマクロを紹介します。

Sub AddDateToFilenamesInFolder()
    '***** 設定項目 *****
    Const TARGET_FOLDER As String = "C:\Users\YourUser\Documents\TestFiles\" ' ★ここを対象フォルダのパスに変更してください(末尾に"\"を忘れずに)
    Const DATE_FORMAT As String = "yyyymmdd" ' 日付のフォーマット (例: yyyymmdd, yyyy-mm-dd, yyyy_mm_dd)
    Const DATE_POSITION As String = "prefix" ' 日付の挿入位置 ("prefix":先頭, "suffix":末尾)
    Const SEPARATOR As String = "_" ' 日付とファイル名を区切る文字 (例: _, -, )
    Const OVERWRITE_EXISTING_DATE As Boolean = False ' 既存の日付を上書きするか (True:上書き, False:上書きしない)
    'Const TARGET_EXTENSION As String = ".xlsx" ' 特定の拡張子のみ対象にする場合 (例: ".xlsx", ".pdf", ""で全て)
    Const TARGET_EXTENSION As String = "" ' 空欄の場合、全てのファイルを対象

    '***** 変数宣言 *****
    Dim fso As Object ' FileSystemObject
    Dim folder As Object ' Folder
    Dim file As Object ' File
    Dim oldFileName As String
    Dim newFileName As String
    Dim baseName As String
    Dim extension As String
    Dim formattedDate As String
    Dim counter As Long
    Dim msg As String

    '--- 処理開始 ---
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    '指定されたフォルダが存在するか確認
    If Not fso.FolderExists(TARGET_FOLDER) Then
        MsgBox "指定されたフォルダが見つかりません: " & TARGET_FOLDER, vbCritical
        Exit Sub
    End If

    Set folder = fso.GetFolder(TARGET_FOLDER)
    formattedDate = Format(Date, DATE_FORMAT) '今日の日付を指定フォーマットで取得
    counter = 0

    'フォルダ内の各ファイルをループ処理
    For Each file In folder.Files
        oldFileName = file.Name
        baseName = fso.GetBaseName(oldFileName) '拡張子なしのファイル名
        extension = fso.GetExtensionName(oldFileName) '拡張子

        '特定の拡張子のみを対象とする場合
        If TARGET_EXTENSION <> "" And LCase("." & extension) <> LCase(TARGET_EXTENSION) Then
            GoTo NextFile '次のファイルへスキップ
        End If

        '既存の日付チェックと上書き設定
        If Not OVERWRITE_EXISTING_DATE Then
            'ファイル名がすでに日付で始まっているかチェック (例: YYYYMMDD_...)
            If Left(baseName, Len(formattedDate) + Len(SEPARATOR)) = formattedDate & SEPARATOR Then
                '既に日付が付加されている場合はスキップ
                GoTo NextFile
            End If
        End If

        '新しいファイル名の生成
        Select Case LCase(DATE_POSITION)
            Case "prefix" '先頭に追加
                newFileName = formattedDate & SEPARATOR & baseName & "." & extension
            Case "suffix" '末尾に追加
                newFileName = baseName & SEPARATOR & formattedDate & "." & extension
            Case Else 'デフォルトは先頭
                newFileName = formattedDate & SEPARATOR & baseName & "." & extension
        End Select

        '元のファイルパスと新しいファイルパスを生成
        Dim oldFullPath As String
        Dim newFullPath As String
        oldFullPath = TARGET_FOLDER & oldFileName
        newFullPath = TARGET_FOLDER & newFileName

        On Error GoTo ErrorHandler 'エラーハンドラを設定
        'ファイル名を変更
        Name oldFullPath As newFullPath
        counter = counter + 1
        On Error GoTo 0 'エラーハンドラを解除

NextFile:
    Next file

    msg = counter & " 個のファイルのファイル名に日付が追加されました。" & vbCrLf & _
          "対象フォルダ: " & TARGET_FOLDER
    MsgBox msg, vbInformation, "ファイル名日付追加完了"

    Set file = Nothing
    Set folder = Nothing
    Set fso = Nothing
    Exit Sub

ErrorHandler:
    MsgBox "ファイル名変更中にエラーが発生しました。" & vbCrLf & _
           "ファイル: " & oldFileName & vbCrLf & _
           "エラー内容: " & Err.Description, vbCritical
    Resume Next '次のファイルへ処理を続ける
End Sub

マクロの実行方法と注意点

マクロの実行方法

  1. 上記のコードをVBEの標準モジュールに貼り付けます。
  2. コード内のConst TARGET_FOLDER As String = "C:\Users\YourUser\Documents\TestFiles\"のパスを、実際に日付を追加したいファイルが保存されているフォルダのパスに変更してください。末尾の\を忘れないように注意してください。
  3. 必要に応じてDATE_FORMAT、DATE_POSITION、SEPARATOR、OVERWRITE_EXISTING_DATE、TARGET_EXTENSIONの定数を変更します。
  4. Excelに戻り、「開発」タブ → 「マクロ」をクリックします。
  5. AddDateToFilenamesInFolderを選択し、「実行」ボタンをクリックします。
  6. 処理が完了すると、完了メッセージが表示されます。

注意点

  • 必ず事前にバックアップを取ってください! ファイル名変更は元に戻すのが難しい操作です。予期せぬ事態に備え、対象フォルダのファイルをコピーしておくことを強く推奨します。
  • 対象フォルダのパスは正確に指定してください。パスが間違っていると、エラーになったり意図しないフォルダのファイルが処理されたりする可能性があります。
  • マクロ実行中は、対象フォルダ内のファイルを操作しないでください。
  • すでに日付が付加されているファイル名に対しては、OVERWRITE_EXISTING_DATEをFalseに設定していればスキップされます。意図的に上書きしたい場合はTrueに設定してください。
  • Microsoft Scripting Runtimeの参照設定を忘れると、CreateObject("Scripting.FileSystemObject")の行でエラーになります。

応用例:さらに便利に使うためのヒント

  • 日付以外の情報を追加: formattedDateの部分を、ユーザーが入力した文字列や、ファイルの内容から取得した情報などに変更すれば、日付以外の情報をファイル名に追加することも可能です。
  • 日付のフォーマット変更: DATE_FORMATの値を変更することで、yyyy-mm-ddやyyyy_mm_dd_hhmmssなど、様々な形式の日付をファイル名に含めることができます。
  • 特定の条件でファイル名を変更: If文を追加して、ファイル名に特定のキーワードが含まれる場合のみ処理を行う、といった条件分岐を追加することも可能です。
  • サブフォルダ内のファイルも対象にする: FileSystemObjectのSubFoldersプロパティを利用することで、サブフォルダ内のファイルも再帰的に処理できるようになります。

まとめ

今回は、Excel VBAを使って複数のファイル名に日付を一括追加する方法を解説しました。FileSystemObjectとNameステートメントを組み合わせることで、手作業では時間がかかる煩雑なファイル管理作業を劇的に効率化できます。

このマクロは、日々のファイル整理だけでなく、プロジェクトの成果物管理やデータバックアップなど、様々なシーンで役立つはずです。
ぜひ、あなたの業務にこのVBAマクロを取り入れて、作業効率を向上させてください!

コメント

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