マクロでファイル名を変更する方法
事務作業などでサーバー上や、パソコン内のファイル名を変更する場面があります。
名前を変更するファイルの数が多くないのであれば、手作業で変更していく方法でもいいですが、これが多数のファイルやフォルダとなった場合には大きな手間と時間がかかり負担になります。
また、せっかく作業するのであればファイルの名前のつけ方にルールを設けるなどでファイル名から内容が読み取りやすく、どういった情報が書かれているかを推測しやすいものにしておきたいものです。
マクロでファイル名を変更するためにはVBAのコード作成することになりますが、複数の方法が存在します。こちら記事ではその内のファイルシステムオブジェクト(FileSystemObject)を使った方法を紹介します。サンプルコードとともに解説をしていますので、コピペしてぜひご自身の環境にあわせてカスタマイズしてください。
オンラインスクールで現役エンジニアのサポートがあるテックアカデミーがおすすめ。
スキマ時間に学べて仕事も保証。必ず副業、始められます。まずは無料でプログラミング体験
マクロでファイル名を変更するVBAの書きかた
ファイル名の変更で使えるオブジェクト、関数やメソッドには以下のものがあります。
1.ファイルシステムオブジェクト(FileSystemObject)
2.Dir関数
ファイルシステムオブジェクト(FileSystemObject)はVBAであつかうことのできる外部ライブラリです。こちらの記事ではおすすめのファイルシステムオブジェクト(FileSystemObject)をつかったVBAコードの紹介と解説をしています。
Dir関数についてはほかの記事で紹介しているので、詳しく知りたい人は見てね♡
Dir関数についてはこちらのリンクをクリック
マクロでファイル名を変更するファイルシステムオブジェクトについて
ファイルシステムオブジェクトを使ったマクロでファイル名を変更するためのVBAコードでは、いくつかのステップがあります。こちらで紹介するマクロではこのステップごとのコードを順番に実行することでファイルやフォルダ名を変更します。
ファイル名を変更するマクロで実行する処理のステップ
ファイルシステムオブジェクト(FileSystemObject)を利用する準備
ファイルシステムオブジェクト(FileSystemObject)をバインディングする
ファイルシステムオブジェクト(FileSystemObject)のメソッドやプロパティを利用する
ファイルシステムオブジェクト(FileSystemObject)について詳しく解説した記事は以下のリンクをクリック
マクロでファイル名を変更するサンプルコード
最もシンプルなファイル名を変更する場合と同じフォルダ内のファイル名をまとめて変更するサンプルコードを紹介します。
解説文の中のファイルシステムオブジェクト(FileSystemObject)のメソッドやプロパティの部分にはマーカーをつけています。
ファイル名を変更する
1つのファイルの名前を変更するサンプルコードです。こちらはVBAコード内に指定したファイル名に変更します。
サンプルコード
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」に変更(リネーム)します。
ポイントとなるコードの解説
Set SampleFile = FSO.GetFile(“C:\Users\XXXXXX\Desktop\テスト\サンプルワード.docx”)
ファイルシステムオブジェクト(FileSystemObject)のGetFileメソッドを使って変数の「SampleFile」に対象となるファイルオブジェクトを代入しています。
SampleFile.NAME = “SampleWord.docx”
SampleFileに代入したファイル名「サンプルワード.docx」をNAMEプロパティを使って「SampleWord.docx」に変更します。
ここではファイル名の「サンプルワード.docx」を「SampleWord.docx」変更するよ。
入力ボックスで指定したファイル名に変更する
1つのファイルのファイル名を変更するサンプルコードです。こちらは入力ボックスに記入した任意のファイル名に変更します。
サンプルコード
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」に変更します。
ポイントとなるコードの解説
Dim ExtensionName As String
ファイルの拡張子名を代入するための変数を宣言しています。
ExtensionName = “.” & FSO.GetExtensionName(“C:\Users\XXXXXX\Desktop\テスト\サンプルワード.docx”)
文字列型の変数である「ExtensionName」に「.docx」を代入します。ファイルシステムオブジェクト(FileSystemObject)のGetExtensionNameメソッドは指定したファイルの拡張子名を文字列として取得します。このマクロの場合、指定したファイルがワードファイルであるため「docx」が取得できます。ただし、取得した文字列にはドット(.)が含まれないためアンパサンド(&)を使って補っています。
NewName = Application.InputBox(“新しいファイル名を入力してください。”, “ファイル名を入力”, Type:=1 + 2)
変更したい名前を入力ボックスを表示して、ユーザーから受けとった文字列を変数の「NewName」に代入します。Application.InputBoxではType引数を指定することで入力内容の制限ができます。Type:=1+2は数値と文字列の入力に制限しています。詳しくは以下の記事をご確認ください。
\InputBoxメソッドについてはこちらをクリック/
SampleFile.NAME = NewName & ExtensionName
SampleFileに代入したファイル名「サンプルワード.docx」をNAMEプロパティを使って変数の「NewName」と「ExtensionName」をつなげた名前に変更します。
このマクロでは入力ボックスに指定したファイル名に変更するよ。
複数のファイル名をまとめて変更する
指定したフォルダに入っているファイルの名前をまとめて変更(リネーム)するサンプルコードです。
サンプルコード
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
このマクロの実行結果では、指定したパスのフォルダに入っているファイル名をすべて変更します。
マクロを実行すると入力ボックスが表示されるため、任意の名前を入力します。入力ボックスに名前が新しいファイル名になり、これらの処理をファイルの数分だけくり返します。
ポイントとなるコードの解説
Dim NewName As Variant
新しい名前を代入する変数を宣言しています。
ここでは入力ボックスが表示されているときにユーザーによりキャンセルボタンがクリックされた場合を想定して、文字列型ではなくバリアント型で宣言しています。
For Each SampleFile In TargetFolder.Files ~ Next SampleFile
For Each文によるくり返し処理の指定です。
サンプルコードでは「TargetFolder」で指定したフォルダの中に入っているファイル全てに対して処理をくり返します。
具体的には、変数「TargetFolder」が参照している場所はデスクトップにある「テストフォルダ」であり、フォルダオブジェクトのFilesプロパティによって「テストフォルダ」に入っているファイル全てが処理の対象の範囲です。
もう一つの変数「SampleFile」は個別のファイルを指しています。つまり、テストフォルダの中に入っているファイルを1つずつ代入して処理を実行していきます。
ForEach文についての詳しい内容はくり返し文を解説した記事を参考にしてね。
Do ~ Loop Until NewName <> “” And NewName <> False
Do Loop文による条件指定のくり返し処理の指定です。
サンプルコードでは、新しいファイル名を代入した変数「NewName」が空白ではなく、Falseではなくなるまで入力ボックスを表示し続けます。
これらの条件をつけた理由は、以下の入力ボックスでユーザーが何も文字を入力しないときや、キャンセルボタンをクリックした場合は、それ以降の処理に進めないようにするためです。
ファイル名が空白であったり、キャンセルされたときの処理だね。
Do~Loop文はLoopをDoとセットで書いたときと、Loopとセットで書いたときで動作が異なることをご存知ですか?DoLoop文を含めたくり返し文の詳しい解説は以下のリンクよりご覧ください。
\くり返し文の書きかたについてはこちらをクリック/
If FSO.FileExists(TargetFolder & “\” & NewName & ExtensionName) Then
ファイルシステムオブジェクトのFileExistsメソッドでファイルの存在をチェックしています。変数の「TargetFolder」にはフォルダのパスが代入されており、また別の変数「NewName」に代入された新しいファイル名がこのフォルダに重複しないかの判定をしています。
If文をつかった条件分岐の解説については以下のリンクより記事をご覧ください。
\条件分岐処理の書きかたについてはこちらをクリック/
特定の種類のファイル名を変更する
特定の種類のファイルの名前を変更します。直前の「複数のファイル名をまとめて変更する」に少し追記することで名前を変えるファイルの種類を限定できます。例えば、エクセルファイルのみを対象として名前を変更したいときなどはこちらのサンプルコードが有効です。
フォルダに入っている特定の種類のファイルだけ名前を変えられるよ。
サンプルコード
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
このマクロの実行結果では、指定したパスのフォルダに入っているエクセルファイルの名前をすべて変更できます。
ファイルの種類を限定するために追記した部分の解説をしていくよ。
ポイントとなるコードの解説
If ExtensionName = “.xlsx” Then
上記のIf文による判定式をFor Each SampleFile In TargetFolder.Files ~ Next SampleFileの中に追記します。これにより変数「ExtensionName」に代入された拡張子名が”.xlsx”であるファイルのみがファイル名を変更する対象となります。
コメントアウトにも記載していますが、ワードファイル(.docx)やテキスト(.txt)、画像ファイル(.jpg、.png、.bmp)などの拡張子名に変更すれば、指定したファイルの名前を変更するマクロに応用が可能です。また、判定式の”=”を”<>”に変更すればエクセルファイル以外を対象にファイル名の変更をする内容に変わります。
※拡張子名はウィンドウズの設定で表示有無の切替が可能です。ファイル名を変えたいファイルの拡張子がわからない場合は、ファイルのプロパティで確認するか表示の切替を実行してください。
これで特定のファイルだけの名前をまとめて変更することもできるね。
フォルダの名前を変更する方法は?
この記事ではファイルシステムオブジェクト(FileSystemObject)を使ってファイルの名前を変更するマクロを紹介しました。ここで利用したファイルシステムオブジェクトを使えばファイル名と同じくフォルダ名を変更するマクロが作れます。
フォルダ名を変更するマクロについてはこちらの記事をご確認ください。
マクロでファイル名を変更するメリット
この記事ではファイルシステムオブジェクト(FileSystemObject)を利用したマクロをつかって、ファイル名を変更する方法をお伝えしました。
さいごにファイル名の変更をマクロで実行するメリットは以下のとおりです。
多数のファイルの名前を変更(リネーム)するための作業時間を減らせる
多数のファイルの名前を変更(リネーム)するための作業負担を減らせる
ファイルの名前を変更(リネーム)をするときのファイル名の入力誤りを防止できる
多数のファイルの名前を変更(リネーム)をするときに命名規則を守りやすい
特定のファイルに限定した名前の変更(リネーム)が実行しやすい
1度マクロを作ってしまえば少しの変更でくり返し使えるのも良いよね。
コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。
コメント