フォルダにあるファイル名やパスをExcelへまとめる作業はないでしょうか。
特にファイルがたくさんあったり、フォルダが何階層もあったりすると手間ですよね。
そこで今回はそのようなときに一発でフォルダ名とそのパスを取得し、Excelシートへ出力する方法をご紹介したいと思います。
もくじ
サンプルの準備をする
今回のサンプルは適当なディレクトリにテストフォルダを4階層作成し、各フォルダごとに2ファイルづつ格納しています。
次に新規作成したExcelシートを開き、C1へ上記フォルダのパスを入力し、D1へ1か2を入力します。サブフォルダを含める場合は2、含めない場合は1を指定してください。
これで準備は完了です!
ではさっそくやってみましょう。
VBAを実装する
続いてVBAを実装します。
今回VBAは以下の通りとなります。
Sub ファイル名取得起動()
Dim cnt As Long
Dim Subfolder As Long
Dim strPath As String
'ファイル名出力開始の行指定
cnt = 2
'サブフォルダ対象要否フラグ取得 含める:2 含めない:1
Subfolder = Cells(1, 4)
'抽出対象パスを取得
strPath = Cells(1, 3)
' 一旦、シート保護を解除
'ActiveSheet.Unprotect
'A~D列値のみクリア
Range("A:B").ClearContents
' ファイル名取得呼び出し
Call ファイル名取得(strPath, cnt, Subfolder)
MsgBox cnt - 2 & "件取得しました。"
End Sub
Sub ファイル名取得(strPath As String, cnt As Long, Subfolder As Long)
Dim objFolder As Object
Dim objSubfolder As Object
Dim Maxoutput As Long
'出力件数最大値指定
Maxoutput = 65000
'エラー停止を無効化
On Error Resume Next
With CreateObject("Scripting.FileSystemObject")
'パス入力がある場合に処理開始
If strPath = "" Then
MsgBox "ファイル格納フォルダのパスを入力してください。"
Else
'フォルダ内のファイル名、パス取得
For Each objFolder In .GetFolder(strPath).Files
cnt = cnt + 1
Cells(cnt, 1) = objFolder.Name
Cells(cnt, 2) = objFolder.Path
If cnt > Maxoutput Then
MsgBox Maxoutput & "件を超えましたので終了します。"
Exit For
End If
Next objFolder
'サブフォルダ内のファイル名、パス取得
If Subfolder = 2 Then
For Each objSubfolder In .GetFolder(strPath).Subfolders
If objSubfolder.Name <> "" Then
cnt = cnt + 1
Cells(cnt, 1) = objSubfolder.Name
Cells(cnt, 2) = objSubfolder.Path
Call ファイル名取得(objSubfolder.Path, cnt, Subfolder)
Else
Exit For
End If
If cnt > Maxoutput Then
MsgBox Maxoutput & "件を超えましたので終了します。"
Exit For
End If
Next objSubfolder
End If
End If
End With
End Sub
実装手順は以下の通りです。今回はExcel側にこのVBAを実装します。
①Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。
もしくはショートカットキー「Alt」+「F11」でもOKです。
②標準モジュールを追加します。
左ペインのVBAProjectを右クリックし、「挿入」、「標準モジュール」を選択します。
③右ペインのウインドウに上記のマクロを入力します。
こちらで完了です。
なお、実行にあたりスケジュールの登録数が多い場合は処理に時間がかかることがありますのでご注意ください。
早速実行してみよう
①「開発」タブの「マクロ」をクリックし「 ファイル名取得起動」を選択し、「実行」をクリックします。
②Excelのワークシートに書き込まれたら完成です!
今回のVBAについて説明
今回は2つのSubプロシージャを利用しています。
一つは呼び出し先の「ファイル名取得起動」
2つ目は内部処理用の「ファイル名取得」となります。
マクロ実行時に指定するSubプロシージャは「ファイル名取得起動」となります。
Subプロシージャは「ファイル名取得起動」について
ファイル名取得にあたり、設定情報をまとめたSubプロシージャです。
処理自体はなく、「ファイル名取得」側で行われます。
ソースコードの説明です。
ファイル名出力開始の行を指定します。あとで買えて頂いても問題ありません。
cnt = 2
サブフォルダ対象要否フラグ取得します。セルD1に1か2を入れてください。
フラグの意味はサブフォルダを含める場合は2 含めない場合は1となります。
Subfolder = Cells(1, 4)
フォルダか格納されているパスを指定します。セルC1にパスを入力してください。
strPath = Cells(1, 3)
A~D列の値のみクリアします。前に入力されている値はすべて消去されますので、気を付けてください。
Range(“A:B”).ClearContents
ファイル名取得プロシージャを呼び出します。引数にパス、行数、サブフォルダ対象フラグを指定しています。
Call ファイル名取得(strPath, cnt, Subfolder)
Subプロシージャは「ファイル名取得」について
ファイル名を取得する関数です。
最大出力件数を指定します。今回は65000件としており、これを超えると集計処理は中断されます。
Maxoutput = 65000
エラー停止は無効化します。途中でファイルが読み込めなかったりした場合などスキップされます。
On Error Resume Next
抽出先のパスがあるか確認しています。あれば次の処理へ進みます。
If strPath = “” Then
MsgBox “ファイル格納フォルダのパスを入力してください。”
Else
フォルダ内のファイル名、パスを取得します。
For Each objFolder In .GetFolder(strPath).Files
cnt = cnt + 1
Cells(cnt, 1) = objFolder.Name
Cells(cnt, 2) = objFolder.Path
If cnt > Maxoutput Then
MsgBox Maxoutput & “件を超えましたので終了します。”
Exit For
End If
Next objFolder
サブフォルダ内のファイル名、パスを取得します。
If Subfolder = 2 Then
For Each objSubfolder In .GetFolder(strPath).Subfolders
If objSubfolder.Name <> “” Then
cnt = cnt + 1
Cells(cnt, 1) = objSubfolder.Name
Cells(cnt, 2) = objSubfolder.Path
このプロシージャを再帰的に呼び出します。サブフォルダを引数にし、さらにサブフォルダがあれば情報を取得します。
Call ファイル名取得(objSubfolder.Path, cnt, Subfolder)
Else
Exit For
ツールのダウンロード
今回説明した処理をボタンワンクリックでできるツールを無料公開します。
さいごに
いかがでしょうか。
ファイル名をまとめる作業に覚えておくととても便利な内容なので、ぜひツールで活用いただければとおもいます。
コメントを残す