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