この記事では、指定したフォルダに存在するファイルに対して、ファイル名を変更する機能について説明します。
手順としては、まずフォルダを指定して、そのフォルダに存在するファイルの名前を取得します。
次に、各ファイルの変更したいファイル名を入力します。
あとは、一気にファイル名を変更します。
それでは、EXCELで指定したフォルダに存在するファイルの名前を変更する機能を作成していきましょう。
困っている女性
解決する男性
困っている女性
解決する男性
困っている女性
似たような便利な「指定したフォルダに存在するファイル一覧を取得する」機能については、以下を参照してください。
ファイル名変更機能に必要なものを、1つ1つ順番に説明していきます。
もくじ
STEP1:フォルダ指定欄、ファイル一覧欄を準備する
まず、フォルダを指定する欄と取得したファイル一覧を書き込む欄を作成します。
「メイン」シートを作成する
メインシートを作成する
- 「メイン」という名前のシートを作成します。
- 1行目に「フォルダパス」のタイトル行を作成します。
- 2行目に「フォルダパス」を入力する欄を作成します。
- 3行目に「ファイル一覧」というタイトル行を作成します。
- 4行目に「NO」、「変更前ファイル名」、「変更後ファイル名」のタイトル行を作成します。
- 5行目以降は、取得したファイル一覧を書き込む欄になります。
5行目以降には、指定された「フォルダパス」に存在するファイル名をB列にVBAを使って、書込みます。
取得したファイル名に対して、C列に変更したいファイル名を入力します。
STEP2:VBAでファイル名を取得する機能を記入する
「Microsoft Visual Basic for Applications」を起動します。
VBAでファイル名を取得する機能を記入する
標準モジュールを追加して、以下のソースを書きます。
Public Sub GetFileName()
Dim shtMain As Worksheet
Dim fso As Object
Dim f As Object
Dim nowRow As Long
'①参照するシートを変数に格納する
Set shtMain = ThisWorkbook.Sheets("メイン")
'②セルの値をクリアする
shtMain.Range("A5:C10000").ClearContents
'③FileSystemObjectを変数に格納する
Set fso = CreateObject("Scripting.FileSystemObject")
nowRow = 4
'④指定されているフォルダに存在するファイル数分処理を繰り返す
For Each f In fso.GetFolder(shtMain.Range("A2")).Files
'⑤現在行を次の行に変更する
nowRow = nowRow + 1
'⑥NOをセットする
shtMain.Range("A" & nowRow) = nowRow - 4
'⑦変更前ファイル名を取得する
shtMain.Range("B" & nowRow) = f.Name
Next
'⑧FileSystemObjectをクリアする
Set fso = Nothing
MsgBox "完了"
End Sub
最後にEXCELを「◯◯◯.xlsm」というような感じでマクロ有効ブック形式で保存します。
STEP3:VBAでファイル名を変更する機能を記入する
引き続き、標準モジュールにVBAプログラムを記入します。
VBAでファイル名を変更する機能を記入する
以下のソースを書きます。
Public Sub ChangeFileName()
Dim shtMain As Worksheet
Dim fso As Object
Dim f As Object
Dim nowRow As Long
'①参照するシートを変数に格納する
Set shtMain = ThisWorkbook.Sheets("メイン")
'②FileSystemObjectを変数に格納する
Set fso = CreateObject("Scripting.FileSystemObject")
nowRow = 4
Do While True
'③現在行を次の行に変更する
nowRow = nowRow + 1
'④変更前ファイル名が空か確認する
If shtMain.Range("B" & nowRow) = "" Then
Exit Do
End If
'⑤変更後ファイル名が入力されているか確認する
If shtMain.Range("C" & nowRow) <> "" Then
'⑥変更前ファイルを取得する
Set f = fso.getfile(shtMain.Range("A2") & "\" & shtMain.Range("B" & nowRow))
'⑦変更後ファイル名に変更する
f.Name = shtMain.Range("C" & nowRow)
End If
Loop
'⑧FileSystemObjectをクリアする
Set fso = Nothing
MsgBox "完了"
End Sub
これで、すべての必要なものが作成できました。
【機能の使い方】ファイル一覧を取得し、変更ファイル名を指定する
それでは、フォルダを指定して、ファイル一覧を取得する方法を説明します。
ファイル名を変更したいファイルを格納したフォルダを準備します。
ファイル名を変更したいファイルを1つのフォルダに格納する
次に、A2セルにフォルダパスを入力します。
次に、「開発」タブの「マクロ」をクリックします。
ファイル名を取得する
先程作成した自作関数「GetFileName」が一覧に表示されていますので、選択します。
次に、「実行」ボタンをクリックしてファイル一覧を作成します。
GetFileNameを実行する
しばらく待つと、指定したフォルダに存在するファイル一覧が5行目以降に書き込まれます。
ファイル名取得結果
次に、C列に各ファイルの変更したいファイル名を入力します。
変更したいファイル名を入力する
再度、「開発」タブの「マクロ」をクリックします。
先程作成した自作関数「ChangeFileName」が一覧に表示されていますので、選択します。
次に、「実行」ボタンをクリックしてファイル名を変更します。
ChangeFileNameを実行する
しばらく待つと、指定したフォルダのファイル名が変更されます。
ファイル名変更結果
指定したフォルダには、5つファイルが存在しており、変更したいファイル名に変更されています。
【VBAプログラムの説明】ファイル名を取得する
それでは、VBAプログラムを説明します。
①参照するシートを変数に格納する
'①参照するシートを変数に格納する
Set shtMain = ThisWorkbook.Sheets("メイン")
ここでは、このあとの処理で何度も使う「メイン」シートを変数に格納しています。
そうすることにより、入力するプログラムを短くすることができるからです。
何度も「ThisWorkbook.Sheets(“メイン”)」と入力するより、「shtMain」と入力するほうが少なくすむからです。
②セルの値をクリアする
'②セルの値をクリアする
shtMain.Range("A5:C10000").ClearContents
ここでは、5行目以降に書き込みされたファイル一覧をクリアしています。
何度もファイル一覧を取得していると、前回取得したファイル一覧が残っていることがあります。
ですから、ファイル一覧を取得する前に、毎回5行目以降をクリアしています。
具体的には、5行目から10000行目までをクリアしています。
③FileSystemObjectを変数に格納する
'③FileSystemObjectを変数に格納する
Set fso = CreateObject("Scripting.FileSystemObject")
ここでは、「FileSystemObject」オブジェクトを変数に格納して、このあとの処理で利用できるようにします。
「FileSystemObject」はファイル操作やフォルダ操作をVBAで行うときに大変お世話になる便利なライブラリです、覚えておくと良いです。
④指定されているフォルダに存在するファイル数分処理を繰り返す
'④指定されているフォルダに存在するファイル数分処理を繰り返す
For Each f In fso.GetFolder(shtMain.Range("A2")).Files
ここでは、指定されたフォルダに存在するファイル数分、処理を繰り返しています。
⑤現在行を次の行に変更する
'⑤現在行を次の行に変更する nowRow = nowRow + 1
ここでは、現在行を次の行に変更するため、変数「nowRow」に格納している値+1を、変数「nowRow」に格納しています。
ループ処理の外側で、変数「nowRow」には4が格納されています。
ファイル一覧情報は、5行目から入力するので、ループ処理の内側に入ったときに変数「nowRow」を+1して、5を格納します。
もちろん、ループしてくると、さらに+1されて6が格納されます。
というように、ファイル情報を5行目以降に書き込みするようにします。
⑥NOをセットする
'⑥NOをセットする
shtMain.Range("A" & nowRow) = nowRow - 4
ここでは、A列(NO)に1からの連番を入力します。
変数「nowRow」に5が格納されている場合、-4してセルA5に1が入力されます。
⑥ファイル名をセットする
'⑥ファイル名をセットする
sht.Range("B" & nowRow) = f.Name
ここでは、B列(ファイル名)に「FileSystemObject」オブジェクトから取得したファイル名を書き込みします。
変数「f」には1つ1つファイル情報が格納されています。
⑦変更前ファイル名を取得する
'⑦変更前ファイル名を取得する
shtMain.Range("B" & nowRow) = f.Name
ここでは、取得してきたファイル名を現在行のB列に記入しています。
⑧FileSystemObjectをクリアする
'⑧FileSystemObjectをクリアする Set fso = Nothing
ここでは、これまで使ってきた「FileSystemObject」をクリアしています。
クリアしないと、ファイル情報をつかんだままになりますので、ご注意ください。
【VBAプログラムの説明】ファイル名を変更する
それでは、「ファイル名を変更するVBAプログラム」を説明します。
①参照するシートを変数に格納する
'①参照するシートを変数に格納する
Set shtMain = ThisWorkbook.Sheets("メイン")
ここでは、このあとの処理で何度も使う「メイン」シートを変数に格納しています。
②FileSystemObjectを変数に格納する
'②FileSystemObjectを変数に格納する
Set fso = CreateObject("Scripting.FileSystemObject")
ここでは、「FileSystemObject」オブジェクトを変数に格納して、このあとの処理で利用できるようにします。
「FileSystemObject」はファイル操作やフォルダ操作をVBAで行うときに大変お世話になる便利なライブラリです、覚えておくと良いです。
③現在行を次の行に変更する
'③現在行を次の行に変更する nowRow = nowRow + 1
ここでは、現在行を次の行に変更するため、変数「nowRow」に格納している値+1を、変数「nowRow」に格納しています。
ループ処理の外側で、変数「nowRow」には4が格納されています。
ファイル一覧情報は、5行目から入力するので、ループ処理の内側に入ったときに変数「nowRow」を+1して、5を格納します。
もちろん、ループしてくると、さらに+1されて6が格納されます。
というように、5行目以降の各セルの値を利用します。
④変更前ファイル名が空か確認する
'④変更前ファイル名が空か確認する
If shtMain.Range("B" & nowRow) = "" Then
Exit Do
End If
ここでは、B列(変更前ファイル名)が空か確認しています。
もし空の場合、ファイル名変更処理を終わらせます。
もし空でない場合、ファイル名変更処理を継続します。
⑤変更後ファイル名が入力されているか確認する
'⑤変更後ファイル名が入力されているか確認する
If shtMain.Range("C" & nowRow) <> "" Then
ここでは、C列(変更後ファイル名)が空か確認しています。
もし空でない場合、ファイル名変更処理を行います。
もし空の場合、ファイル名変更処理を行わず、次の行に移動します。
⑥変更前ファイルを取得する
'⑥変更前ファイルを取得する
Set f = fso.getfile(shtMain.Range("A2") & "\" & shtMain.Range("B" & nowRow))
ここでは、A2セル(フォルダパス)とB列(変更前ファイル名)を利用して、ファイルを取得して変数に格納します。
⑦変更後ファイル名に変更する
'⑦変更後ファイル名に変更する
f.Name = shtMain.Range("C" & nowRow)
ここでは、C列(変更後ファイル名)に入力されているファイル名に、取得したファイルを変更しています。
⑧FileSystemObjectをクリアする
'⑧FileSystemObjectをクリアする Set fso = Nothing
ここでは、これまで使ってきた「FileSystemObject」をクリアしています。
クリアしないと、ファイル情報をつかんだままになりますので、ご注意ください。
それでは、ファイル名を変更する機能を作って、作業を効率化してみましょう。
以上です。
最後まで読んでいただきありがとうございました。
この記事をシェアしていただけると喜びます。

