下層のファイルパス取得

2020/05/25

Excel2003

ファイルの位置より下層のファイル一覧を作成するVBA

Dim cnt As Long 'ファイル数カウント

'ファイルリスト作成
Sub CreateFileList()

    Dim rc As Integer
    msg = "本ファイルから下層のファイルリストを作成します。よろしいですか?"
    msg = msg & Chr(13) & "・ファイル数によっては長時間かかります"
    msg = msg & Chr(13) & "・処理を中断するにはEscを連打してください"

    rc = MsgBox(msg, vbYesNo + vbQuestion, "確認")
    If Not rc = vbYes Then
         MsgBox "処理を中断しました"
        Exit Sub
    End If

    '自動計算・警告表示の無効化
    Application.DisplayAlerts = False
    Application.Calculation = xlCalculationManual

    'リスト作成開始
    Dim WS As Worksheet
    Set WS = Worksheets.Add()

    'ファイルリスト作成
    cnt = 1
    Call FileListLower(ThisWorkbook.Path, WS)

    '自動計算・警告表示の有効化
    Application.StatusBar = False
    Application.DisplayAlerts = True
    Application.Calculation = xlCalculationAutomatic

    MsgBox ("処理が完了しました")

End Sub

Sub FileListLower(SearchPath As String, WS As Worksheet)
    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")

    'ファイルをリストに追加
    For Each f In FSO.GetFolder(SearchPath).Files
        WS.Cells(cnt, 1) = f.Path
        cnt = cnt + 1
        DoEvents 'フリーズ回避
    Next f

    'ステータスバー表示
    msg = cnt & "個のファイル発見。検索:"
    If Len(SearchPath) < 150 Then '文字数制限対策
        Application.StatusBar = msg & SearchPath
    Else
        Application.StatusBar = msg & "(略)"
    End If

    '行数制限
    If cnt >= 65535 Then 'Excel2003 max.65536
        Application.StatusBar = False
        Exit Sub
    End If

    'フォルダ取得
    For Each f In FSO.GetFolder(SearchPath).SubFolders
        '下層制限
        If StrCount(f.Path, "\") <= 12 Then
            Call FileListLower(f.Path, WS)
        End If
    Next f

End Sub

Function StrCount(Source As String, Target As String) As Long
    Dim n As Long, cnt As Long
    Do
        n = InStr(n + 1, Source, Target)
        If n = 0 Then
            Exit Do
        Else
            cnt = cnt + 1
        End If
    Loop
    StrCount = cnt
End Function