【ツールDL可】Excel VBAでフォルダ内のファイル名とパス一覧を取得する

フォルダにあるファイル名やパスを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


ツールのダウンロード

今回説明した処理をボタンワンクリックでできるツールを無料公開します。



ダウンロード

さいごに

いかがでしょうか。
ファイル名をまとめる作業に覚えておくととても便利な内容なので、ぜひツールで活用いただければとおもいます。



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です