フォルダ内のファイル名一覧取得

'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

'■フォルダ構成:thiswoorkbook(実行ブック)と同じ階層に処理対象フォルダ

'■パブリック変数を使いたくないので、直接「ファイル名一覧」シートに書き出す。

'■最後のFSO開放はループ重複するがが平気そうなので気にしないことにする。

’■microsoft runtime 事前に登録しておく。

’■sub ファイル名リスト作成([フォルダパス]、[サブフォルダ探索要否]、[拡張子

'■指定])。省略すると、処理対象フォルダ、サブフォルダ探索なし、拡張子指定なし。

’■本当は汎用性のために配列に入れていおいてから、シートに書き出す形にして、

’■シート書き出しは必要に応じてコメント化する形にしたかったが、サブフォルダまで

’■探査する場合に配列の要素数の求め方が分からずやめた。シートに書き出すのは実

’■現できたのでよしとする。

'■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

 

 

----------------------------------------------------------------------------------------------------------------------

Option Explicit

Sub TOTAL()
    Call ファイル名リスト作成準備
    Call ファイル名リスト作成(ThisWorkbook.path & "¥処理対象", 1, "")
End Sub

----------------------------------------------------------------------------------------------------------------------
Sub ファイル名リスト作成準備()
    '「ファイル名一覧」シートが存在しなかったら作る
    On Error Resume Next
    ThisWorkbook.Sheets("ファイル名一覧").Name = ThisWorkbook.Sheets("ファイル名一覧").Name
    On Error GoTo 0
    If Err.Number > 0 Then
        Sheets.Add(after:=Sheets(Sheets.Count)).Name = "ファイル名一覧"
        Err.Clear
    End If

    'ファイル名一覧シートを初期化して、1行目に見出しを作る
    With ThisWorkbook.Sheets("ファイル名一覧")
        .Cells.Clear
        .Range("A1") = "パス"
        .Range("B1") = "ファイル名"
        .Range("C1") = "ファイル名(拡張子なし)"
        .Range("D1") = "拡張子名"
    End With
End Sub

 -------------------------------------------------------------------------------------------------------------------

Sub ファイル名リスト作成(myPath As String, Optional SubFolderFlag As Long = 0, Optional myExtensionName As String = "")
    Dim FSO As New FileSystemObject

   

    'デフォルトフォルダは処理対象フォルダとする。
    If myPath = "" Then
        myPath = ThisWorkbook.path & "¥処理対象"
    End If

   

    'まず当該フォルダ直下のファイルについて全部書き出す
    Dim f As File
    For Each f In FSO.GetFolder(myPath).Files '当該フォルダ直下の全ファイル
        '拡張子指定なしのとき
        If myExtensionName = "" Then
        With ThisWorkbook.Sheets("ファイル名一覧").Cells(Rows.Count, 1).End(xlUp)
            .Offset(1, 0) = f.path 'ファイル名
            .Offset(1, 1) = f.Name 'ファイル名
            .Offset(1, 2) = FSO.GetBaseName(f.Name) 'ファイル名(拡張子なし)
            .Offset(1, 3) = FSO.GetExtensionName(f.Name) '拡張子名
        End With
        '拡張子指定ありのとき
        Else
            If LCase(FSO.GetExtensionName(f.Name)) = myExtensionName Then
                With ThisWorkbook.Sheets("ファイル名一覧").Cells(Rows.Count, 1).End(xlUp)  '見出し行がないと0件のときズレる
                    .Offset(1, 0) = f.path 'パス
                    .Offset(1, 1) = f.Name 'ファイル名
                    .Offset(1, 2) = FSO.GetBaseName(f.Name) 'ファイル名(拡張子なし)
                    .Offset(1, 3) = FSO.GetExtensionName(f.Name) '拡張子名
                End With
            End If
        End If
    Next f

    'サブフォルダ内も書き出す場合
    If SubFolderFlag = 1 Then
        Dim mySubFolder As Folder
        For Each mySubFolder In FSO.GetFolder(myPath).SubFolders 'サブフォルダがあったら
            Call ファイル名リスト作成(mySubFolder.path, 1, myExtensionName) 'そのサブフォルダを引数にして自分自身を呼び出す
        Next mySubFolder
    End If

    Set FSO = Nothing         '開放
End Sub

 

 

 

---------------------------------------------------------------------------------------------------------------

参考

Excel自動化の教科書(吉田拳)

 自動化ツール作成のやり方の根本。すべてはここから。

VBA コピペで使える!特定フォルダのファイル一覧を一括取得するコード | mMm Program

 サブフォルダを書き出すか選べるシステム。mmmさんのを元に自分に合ったものにしてみた。

Excel VBA を学ぶなら moug モーグ | 即効テクニック | 再帰呼び出しの考え方

  mmmさんのコードで再起呼出が分からなかったので調べた。 

officetanaka,net

 鉄板