【VBAマクロ(Excel)】サブフォルダ(下階層フォルダ)への再帰的処理【Office】

Software

はじめに

このフォルダにあるExcel全てに〇〇の処理したいな。なんて事がありますが、VBAマクロで簡単にサブフォルダを含む全てのファイルに対して処理する方法を記載します。

サブフォルダ(下階層フォルダ)への再帰的処理(Excel VBA マクロ)

サブフォルダを含む全てのファイルを処理する方法

  1. Excelを開き、Alt + F11を押します。
サブフォルダ(下階層フォルダ)への再帰的処理(Excel VBA マクロ)
  1. ThisWorkbookをダブルクリックします。
サブフォルダ(下階層フォルダ)への再帰的処理(Excel VBA マクロ)
  1. 以下のコードを貼り付けます。
Dim cnt As Long
Dim tExcelN As String

Sub folderProc()

    On Error GoTo myError
    
    '画面の描画OFFにする
    Application.ScreenUpdating = False
    'アラートを非表示にする
    Application.DisplayAlerts = False
    
    Dim FSO As Object, f As Object
    Dim Path As String
    tExcelN = ThisWorkbook.Name
    cnt = 0
    
    '対象フォルダを選択する
    With Application.FileDialog(msoFileDialogFolderPicker)
        .AllowMultiSelect = False
        If .Show = True Then
            Path = .SelectedItems(1)
        Else
            Exit Sub
        End If
    End With

    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    '再帰的処理
    Call recurProc(Path)
    
    Set FSO = Nothing
    MsgBox (cnt & "ファイル 処理完了")
    Exit Sub
    
myError:
  MsgBox ("エラー内容:" & Err.Description)
 
End Sub

Function recurProc(Path)

    Set FSO = CreateObject("Scripting.FileSystemObject")

    For Each f In FSO.GetFolder(Path).Files
      
        '各ファイルへ処理実行
        Call fileProc(f)
        cnt = cnt + 1
        
    Next f
    
    'サブフォルダがあれば再帰的に処理
    For Each d In FSO.GetFolder(Path).SubFolders
        Call recurProc(d.Path)
    Next d
    
End Function

Function fileProc(f)

    'このExcel自身への処理はskip
    If f <> tExcelN Then
    
        'ここへ各ファイルへ実行したい処理を記述する
        Debug.Print f
        
        'Excelへのみ処理をしたい場合は以下の通り拡張子で条件分岐させる
        'If Right(f, 4) = ".xls" Or Right(f, 5) = ".xlsx" Or Right(f, 5) = ".xlsm" Then
        '    Debug.Print f
        'End If
    
    End If

End Function
  1. 「Sub folderProc()」の行を選択しカーソルを当て、▶ボタンを押します。
サブフォルダ(下階層フォルダ)への再帰的処理(Excel VBA マクロ)
  1. ダイアログが表示されるので、処理したいフォルダを選択しOKを押すと処理を開始します。
サブフォルダ(下階層フォルダ)への再帰的処理(Excel VBA マクロ)
  1. 処理が終わると「○ファイル 処理完了」と表示されます。
サブフォルダ(下階層フォルダ)への再帰的処理(Excel VBA マクロ)

以上です。

処理結果

今回はDドライブ配下の以下のような階層フォルダに対して処理をしました。

サブフォルダ(下階層フォルダ)への再帰的処理(Excel VBA マクロ)

今回はファイル名を出力する(ソースのDebug.Printの部分)だけの処理にしたのですが、サブフォルダ含めた全7ファイルのファイル名が表示されています。

サブフォルダ(下階層フォルダ)への再帰的処理(Excel VBA マクロ)

ソースの「’ここへ各ファイルへ実行したい処理を記述する」の部分へ実行したい処理を記述することでサブフォルダ含む全てのフォルダ内のファイルへ処理を実行できます。

応用編

Excelにボタンを設置しボタンを押すことで処理を開始することができます。

  1. 「開発」リボンの「挿入」から「ボタン」を選択します。
サブフォルダ(下階層フォルダ)への再帰的処理(Excel VBA マクロ)
  1. マクロ名は先ほど貼り付けた「folderProc」を入力(選択)します。
サブフォルダ(下階層フォルダ)への再帰的処理(Excel VBA マクロ)
  1. ボタン名を「テキストの編集」にて変更します。
サブフォルダ(下階層フォルダ)への再帰的処理(Excel VBA マクロ)

以上でボタンを押すことで処理を開始できるようになりました。

再帰的処理とは?

再帰的処理は、関数が自身の中で自身を呼び出すプログラミング手法です。再帰的な処理では、処理を小さな部分処理に分割し、それぞれ処理するために同じ関数を再帰的に呼び出します。

再帰的なプログラミングは、特に処理が再帰的な構造を持つ場合や、処理が自身のサブ処理に分割される場合に有効です。例えば、ツリー構造を使用する場合に再帰的なプログラミングがよく使われます。

再帰的処理のメリットは?

  1. コードの簡潔さ: 再帰的なプログラミングは、コードが簡潔になります。同じ処理を反復的に行う場合、再帰的な関数がより簡潔で読みやすいことがあります。これは、再帰的な関数が自身を呼び出すことによって、同じコードブロックを繰り返し書く必要がないためです。
  2. 抽象化とモジュール化: 再帰的なプログラミングは、処理を小さなサブ処理に分割し、抽象化とモジュール化の考え方に基づいています。このため、再帰的なプログラミングは大規模で複雑なプログラミングを扱う際に、コードの構造をよりシンプルかつ管理しやすくすることができます。

まとめ

再帰的プログラミングは、適切な状況で使用されると非常に強力であり、コードの理解や保守性を向上させることができます。ただし、再帰的なアプローチは適切に扱わなければならず、無限ループやスタックオーバーフローのリスクがあることにも注意が必要です。

コメント

タイトルとURLをコピーしました