※本ブログのページには広告主との提携による広告や宣伝、プロモーションが含まれます。当ブログを経由しての商品の購入や、サービス申し込みが発生すると、それらの提携企業からの成果報酬を受けとる場合があります。

VBA|ファイル名を変更するマクロ(ファイルシステムオブジェクト)

VBA-ファイル名を変更するマクロ記事のトップ画像

マクロでファイル名を変更する方法

事務作業などでサーバー上や、パソコン内のファイル名を変更する場面があります。

名前を変更するファイルの数が多くないのであれば、手作業で変更していく方法でもいいですが、これが多数のファイルやフォルダとなった場合には大きな手間と時間がかかり負担になります。

また、せっかく作業するのであればファイルの名前のつけ方にルールを設けるなどでファイル名から内容が読み取りやすく、どういった情報が書かれているかを推測しやすいものにしておきたいものです。

マクロでファイル名を変更するためにはVBAのコード作成することになりますが、複数の方法が存在します。こちら記事ではその内のファイルシステムオブジェクト(FileSystemObject)を使った方法を紹介します。サンプルコードとともに解説をしていますので、コピペしてぜひご自身の環境にあわせてカスタマイズしてください。

独学でプログラミングをはじめてみたけど、このままの学習方法に不安を感じているのなら、
オンラインスクールで現役エンジニアのサポートがあるテックアカデミーがおすすめ。
スキマ時間に学べて仕事も保証。必ず副業、始められます。まずは無料でプログラミング体験

マクロでファイル名を変更するVBAの書きかた

ファイル名の変更で使えるオブジェクト、関数やメソッドには以下のものがあります。

ファイルシステムオブジェクト(FileSystemObject)はVBAであつかうことのできる外部ライブラリです。こちらの記事ではおすすめのファイルシステムオブジェクト(FileSystemObject)をつかったVBAコードの紹介と解説をしています。

Dir関数についてはほかの記事で紹介しているので、詳しく知りたい人は見てね♡

Dir関数についてはこちらのリンクをクリック

マクロでファイル名を変更するファイルシステムオブジェクトについて

ファイルシステムオブジェクトを使ったマクロでファイル名を変更するためのVBAコードでは、いくつかのステップがあります。こちらで紹介するマクロではこのステップごとのコードを順番に実行することでファイルやフォルダ名を変更します。

ファイル名を変更するマクロで実行する処理のステップ

ファイルシステムオブジェクト(FileSystemObject)について詳しく解説した記事は以下のリンクをクリック

マクロでファイル名を変更するサンプルコード

最もシンプルなファイル名を変更する場合と同じフォルダ内のファイル名をまとめて変更するサンプルコードを紹介します。

解説文の中のファイルシステムオブジェクト(FileSystemObject)のメソッドやプロパティの部分にはマーカーをつけています。

ファイルの名前を事前に指定したものに変更するマクロ

1つのファイルの名前を変更するサンプルコードです。こちらはVBAコード内に指定したファイル名に変更します。

  
Option Explicit

Sub ファイル名を変更するマクロ()

    'ファイルシステムオブジェクトを使うため準備
    '①事前バインディングの場合はVBEのツールより参照設定で「Microsoft Scripting Runtime」にチェックをしてください。
    Dim FSO As FileSystemObject
    Set FSO = New FileSystemObject

    '名前を変更したいファイルをオブジェクトとして参照する変数を宣言する
    Dim SampleFile As Object

    '名前を変更したいファイルをオブジェクトとして取得する(ファイルパスは環境にあわせて変更してください。)
    Set SampleFile = FSO.GetFile("C:\Users\XXXXXX\Desktop\テスト\サンプルワード.docx")

    '変更したいファイル名を右辺に記入する
    SampleFile.NAME = "SampleWord.docx"

End Sub

このマクロの実行結果は「サンプルワード.docx」のファイル名を「SampleWord.docx」に変更(リネーム)します。

14行目

GetFileメソッドを利用してテストフォルダの中に入っている「サンプルワード」という名前のファイルを代入します。

17行目

NAMEプロパティで「サンプルワード.docx」という名前を「SampleWord.docx」に変更します。

ここではファイル名の「サンプルワード.docx」を「SampleWord.docx」変更するよ。

ファイルの名前を入力ボックスで指定したものに変更するマクロ

1つのファイルのファイル名を変更するサンプルコードです。こちらは入力ボックスに記入した任意のファイル名に変更します。

  
Option Explicit

Sub 任意のファイル名に変更するマクロ()
    'ファイルシステムオブジェクトを使うため準備
    '①事前バインディングの場合はVBEのツールより参照設定で「Microsoft Scripting Runtime」にチェックをしてください。
    Dim FSO As FileSystemObject
    Set FSO = New FileSystemObject

    '名前を変更したいファイルをオブジェクトとして参照する変数を宣言する
    Dim SampleFile As Object

    '拡張子名を代入する変数を宣言する
    Dim ExtensionName As String

    '名前を変更したいファイルをオブジェクトとして取得する(ファイルパスは環境にあわせて変更してください。)
    Set SampleFile = FSO.GetFile("C:\Users\XXXXXX\Desktop\テスト\サンプルワード.docx")

    '拡張子名.docxを変数に代入する(ファイルパスは環境にあわせて変更してください。)
    ExtensionName = "." & FSO.GetExtensionName("C:\Users\XXXXXX\Desktop\テスト\サンプルワード.docx")

    '変更したい名前を代入する変数を宣言する
    Dim NewName As String

    '宣言した変数に入力ボックスの文字列を代入する
    NewName = Application.InputBox("新しいファイル名を入力してください。", "ファイル名を入力", Type:=1 + 2)

    'インプットボックスに入力した文字列にファイル名を変更する
    SampleFile.NAME = NewName & ExtensionName

End Sub

このマクロでは、指定したファイルの名前を入力ボックスに入力したファイル名に変更します。例えば、入力ボックスに「SampleWord」と入力した場合は、「サンプルワード.docx」→「SampleWord.docx」に変更します。

13行目

ファイルの拡張子名(.docx)を代入するための変数ExtensionNameを宣言します。

16行目

GetFileメソッドを利用してテストフォルダの中に入っている「サンプルワード」という名前のファイルを代入します。

19行目

GetExtensionNameメソッドを利用して「サンプルワード」という名前の拡張子名「docx」を変数ExtensionNameに代入します。このメソッドで取得できる拡張子名には、直前にあるドット(.)が含まれないので付け加えておきます。

25行目

Application.InputBoxメソッドで入力ボックスを表示します。この入力ボックスでユーザーから入力された値を変数NewNameに代入します。Application.InputBoxメソッドのType引数で入力できる文字種を限定しています。

28行目

NAMEプロパティで「サンプルワード.docx」のファイルの名前を変更します。新しいファイルは変数NewNameに入っている値と変数ExtensionNameに入っている値をつなぎ合わせた文字列です。例えば、入力ボックスに「SampleWord」と入力した場合は「.docx」とつなげて新しいファイル名は「SampleWord.docx」に変更されます。

このマクロでは入力ボックスに指定したファイル名に変更するよ。

フォルダの中に入っているすべてのファイルの名前を変更するマクロ

指定したフォルダに入っているファイルの名前をまとめて変更(リネーム)するサンプルコードです。

  
Option Explicit

Sub 複数のファイル名に変更するマクロ()

    'ファイルシステムオブジェクトを使うため準備
    '①事前バインディングの場合はVBEのツールより参照設定で「Microsoft Scripting Runtime」にチェックをしてください。
    Dim FSO As FileSystemObject
    Set FSO = New FileSystemObject

    '名前を変更したいファイルをオブジェクトとして参照する変数を宣言する
    Dim SampleFile As Object

    '変更したい名前を代入する変数を宣言する
    Dim NewName As Variant

    '拡張子名を代入する変数を宣言する
    Dim ExtensionName As String

    '名前を変更したいファイルが入ったフォルダを参照する変数を宣言する
    Dim TargetFolder As Object

    '名前を変更したいフォルダをオブジェクトとして取得する(ファイルパスは環境にあわせて変更してください。)
    Set TargetFolder = FSO.GetFolder("C:\Users\XXXXXX\Desktop\テスト")

    'フォルダ配下のすべてファイルの数だけファイル名変更をくり返す
    For Each SampleFile In TargetFolder.Files
        '拡張子名を取得して変数に代入する
        ExtensionName = "." & FSO.GetExtensionName(SampleFile)

        '宣言した変数に入力ボックスの文字列を代入する。入力ボックスが空白やキャンセルではなくなるまでくり返す。
        Do
            NewName = Application.InputBox _
            (SampleFile.NAME & " の新しいファイル名を入力してください。", "ファイル名を入力", Type:=1 + 2)
        Loop Until NewName <> "" And NewName <> False

        'FileExistsメソッドを利用して新しいファイル名が既に存在するかを判定する
        If FSO.FileExists(TargetFolder & "\" & NewName & ExtensionName) Then

            'ファイルが重複している場合はメッセージを表示してマクロを終了する
            MsgBox "ファイル名が重複しています。" & vbCrLf & " マクロを終了します。", vbCritical, "ファイル名の重複"
            Exit Sub
        Else
            'インプットボックスに入力した文字列にファイル名を変更する
            SampleFile.NAME = NewName & ExtensionName

            '入力ボックスに入力した新しいファイル名をリセット
            NewName = ""
        End If
    Next SampleFile

End Sub

このマクロの実行結果では、指定したパスのフォルダに入っているファイル名をすべて変更します。

マクロを実行すると入力ボックスが表示されるため、任意の名前を入力します。入力ボックスに名前が新しいファイル名になり、これらの処理をファイルの数分だけくり返します。

14行目

新しいファイル名を代入する変数としてNewNameを宣言します。
※バリアント型にしているのは入力ボックスでキャンセルをされたときのことを想定しているためです。

16行目

ファイルの拡張子名(.docx)を代入するための変数ExtensionNameを宣言します。

20行目・21行目

名前を変えたいファイルが入っているフォルダを代入する変数TargetFolderを宣言します。GetFolderメソッドを利用して、デスクトップの「テスト」という名前のフォルダをTargetFolderに代入します。

26行目

TargetFolderのFilesプロパティを利用して「テスト」フォルダの中に入っているすべてのファイルを対象にくり返し文を指定しています。オブジェクトを対象にくり返し処理をするのでForEachステートメントを使っています。

28行目

GetExtensionNameメソッドで変数ExtensionNameに拡張子名を代入します。このメソッドで取得できる拡張子名には、直前にあるドット(.)が含まれないので付け加えておきます。

31行目から34行目

Application.InputBoxメソッドで入力ボックスを表示します。この入力ボックスでユーザーから入力された値を変数NewNameに代入します。Application.InputBoxメソッドのType引数で入力できる文字種を限定しています。

また、入力ボックスで何も入力されなかったり、キャンセルされた場合は入力ボックスの表示をループします。こちらはファイル名が空欄になってしまうことを予防するための処理です。

新しいファイル名を入力する画面
新しいファイル名を入力するための入力ボックス画像

入力されるまでそれ以降の処理に進めないようにしているよ。

37行目

FileExistsメソッドで入力ボックスでユーザーによって入力されたファイル名がすでに同じフォルダに存在しているかを判定しています。

40行目・41行目

新しいファイル名が名前を変更するファイルと同じフォルダ内にある場合は、エラーメッセージを表示してマクロを終了します。

44行目

NAMEプロパティでファイルの名前を変更します。新しいファイルは変数NewNameに入っている値と変数ExtensionNameに入っている値をつなぎ合わせた文字列です。

拡張子名となるExtensionNameは、名前を変更する前のファイルから取得しており、それぞれのファイル種別のものをそのまま新しいファイル名につなげる処理にしています。

例えば、ワードファイルであれば「.docx」をつなげて、エクセルファイルのときは「.xlsx」をつなげるといった処理をおこなうことでファイルの種類に関係なく名前の変更を実現しています。

フォルダの中に入っている特定の種類のファイル名を変更する

特定の種類のファイルの名前を変更します。直前に紹介したマクロのコードを少し変更することで名前を変えるファイルの種類を限定できます。例えば、エクセルファイルのみを対象として名前を変更したいときなどはこちらのサンプルコードが有効です。

フォルダに入っている特定の種類のファイルだけ名前を変えられるよ。

  
Option Explicit

Sub 特定の種類のファイル名を変更するマクロ()
    'ファイルシステムオブジェクトを使うため準備
    '①事前バインディングの場合はVBEのツールより参照設定で「Microsoft Scripting Runtime」にチェックをしてください。
    Dim FSO As FileSystemObject
    Set FSO = New FileSystemObject

    '名前を変更したいファイルをオブジェクトとして参照する変数を宣言する
    Dim SampleFile As Object

    '変更したい名前を代入する変数を宣言する
    Dim NewName As Variant

    '拡張子名を代入する変数を宣言する
    Dim ExtensionName As String

    '名前を変更したいファイルが入ったフォルダを参照する変数を宣言する
    Dim TargetFolder As Object
    Set TargetFolder = FSO.GetFolder("C:\Users\ETLC02\Desktop\テスト")

    'フォルダ配下のすべてファイルの数だけファイル名変更をくり返す
    For Each SampleFile In TargetFolder.Files

        '拡張子名を取得して変数に代入する
        ExtensionName = "." & FSO.GetExtensionName(SampleFile)

       'ファイル名を変更する処理をエクセルファイルに限定する
        If ExtensionName = ".xlsx" Then 'ワードなら".docx"、テキストなら".txt"、画像なら".jpg",".png",".bmp"を指定する

            '宣言した変数に入力ボックスの文字列を代入する。入力ボックスが空白でなくなるまでくり返す。
            Do
                NewName = Application.InputBox _
                (SampleFile.NAME & " の新しいファイル名を入力してください。", "ファイル名を入力", Type:=1 + 2)
            Loop Until NewName <> "" And NewName <> False

            'FileExistsメソッドを利用して新しいファイル名が既に存在するかを判定する
            If FSO.FileExists(TargetFolder & "\" & NewName & ExtensionName) Then

                'ファイルが重複している場合はメッセージを表示してマクロを終了する
                MsgBox "ファイル名が重複しています。" & vbCrLf & " マクロを終了します。", vbCritical, "ファイル名の重複"
                Exit Sub
            Else

                'インプットボックスに入力した文字列にファイル名を変更する
                SampleFile.NAME = NewName & ExtensionName

                '入力ボックスに入力した新しいファイル名をリセット
                NewName = ""
            End If
        End If
    Next SampleFile
End Sub

このマクロの実行結果では、指定したパスのフォルダに入っているエクセルファイルの名前をすべて変更できます。

ファイルの種類を限定するために追記した部分を解説していくよ。

29行目

変数ExtensionNameには、名前を変更するファイルの拡張子名が代入されているので、IF文で指定した拡張子名なのであれば名前を変更する処理に分岐し、そうでなければ次のファイルの判定に移ります。

ここで紹介したマクロでは「.xlsx」を指定しるので、名前を変更するの対象がエクセルファイルであったときに限定されることになります。

なお、プログラムコードの中にもコメントアウトで記入していますが、ここの判定式の値をワードファイル(.docx)やテキスト(.txt)、画像ファイル(.jpg、.png、.bmp)などの拡張子名に変更すれば、指定した種類のファイル名を変更するマクロに応用が可能です。ほかにも、判定式の”=”を”<>”に変更することでエクセルファイル以外を対象にファイル名の変更をする内容に変わりますので、目的にあわせて書きかえればとても便利なマクロとなります。

これで特定のファイルだけの名前をまとめて変更することもできるね。

この記事ではファイルシステムオブジェクト(FileSystemObject)を使ってファイルの名前を変更するマクロを紹介しました。ここで利用したファイルシステムオブジェクトを使えばファイル名と同じくフォルダ名を変更するマクロが作れます。

マクロでファイル名を変更するメリット

この記事ではファイルシステムオブジェクト(FileSystemObject)を利用したマクロをつかって、ファイル名を変更する方法をお伝えしました。

さいごにファイル名の変更をマクロで実行するメリットは以下のとおりです。

1度マクロを作ってしまえば少しの変更でくり返し使えるのも良いよね。

コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。

コメント