フォルダ内ループ

2019年9月26日

VBAまんが  再帰呼び出し(リカーシブコール)

バッチ処理をする場合、複数のExcelデータがフォルダ内にまとめられており、それらを順次読み込んで該当シートを処理することがよくあります。サブフォルダを読む必要がある場合もあります。下記のコードはこれらの見本です。
●フォルダ内繰り返し(単層)

Dim ファイル As Object
Dim wb As Workbook
Dim ws As Worksheet
With CreateObject("Scripting.FileSystemObject")
    For Each ファイル In .GetFolder("C:\Sample").Files
        Set wb = Workbooks.Open(Filename:=ファイル.Path)
        For Each ws In wb.Worksheets
           '*** やりたいこと ***
        Next
        wb.Close SaveChanges:=True
        Set wb = Nothing
    Next ファイル
End With

●フォルダ内繰り返し2(下層全部 再帰呼び出し版)

Sub 一括更新()
    Call 再帰更新("C:\Users\sys01\Documents\予算表数式更新\TEST")
End Sub
Sub 再帰更新(パス As String) 'フォルダの下の全ファイルを処理
    Dim FSO As Object
    Dim フォルダ As Object
    Dim サブフォルダ As Object
    Dim ファイル As Object
    Dim wb As Workbook
    Dim ws As Worksheet
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set フォルダ = FSO.GetFolder(パス)
    For Each サブフォルダ In フォルダ.SubFolders 'フォルダ内のサブフォルダを処理
        再帰更新 サブフォルダ.Path '再帰的呼び出し
    Next サブフォルダ
    For Each ファイル In フォルダ.Files 'カレントフォルダ内のファイルを処理
        If (InStr(ファイル.Name, "xlsm") > 0) Then
            Set wb = Workbooks.Open(Filename:=ファイル.Path)
            For Each ws In wb.Worksheets
               '*** やりたいこと ***
            Next
            wb.Close SaveChanges:=True
            Set wb = Nothing
        End If
    Next ファイル
    Set フォルダ = Nothing
    Set FSO = Nothing
End Sub