はじめに
このフォルダにあるExcel全てに〇〇の処理したいな。なんて事がありますが、VBAマクロで簡単にサブフォルダを含む全てのファイルに対して処理する方法を記載します。
サブフォルダを含む全てのファイルを処理する方法
- Excelを開き、Alt + F11を押します。
- ThisWorkbookをダブルクリックします。
- 以下のコードを貼り付けます。
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
- 「Sub folderProc()」の行を選択しカーソルを当て、▶ボタンを押します。
- ダイアログが表示されるので、処理したいフォルダを選択しOKを押すと処理を開始します。
- 処理が終わると「○ファイル 処理完了」と表示されます。
以上です。
処理結果
今回はDドライブ配下の以下のような階層フォルダに対して処理をしました。
今回はファイル名を出力する(ソースのDebug.Printの部分)だけの処理にしたのですが、サブフォルダ含めた全7ファイルのファイル名が表示されています。
ソースの「’ここへ各ファイルへ実行したい処理を記述する」の部分へ実行したい処理を記述することでサブフォルダ含む全てのフォルダ内のファイルへ処理を実行できます。
応用編
Excelにボタンを設置しボタンを押すことで処理を開始することができます。
- 「開発」リボンの「挿入」から「ボタン」を選択します。
- マクロ名は先ほど貼り付けた「folderProc」を入力(選択)します。
- ボタン名を「テキストの編集」にて変更します。
以上でボタンを押すことで処理を開始できるようになりました。
再帰的処理とは?
再帰的処理は、関数が自身の中で自身を呼び出すプログラミング手法です。再帰的な処理では、処理を小さな部分処理に分割し、それぞれ処理するために同じ関数を再帰的に呼び出します。
再帰的なプログラミングは、特に処理が再帰的な構造を持つ場合や、処理が自身のサブ処理に分割される場合に有効です。例えば、ツリー構造を使用する場合に再帰的なプログラミングがよく使われます。
再帰的処理のメリットは?
- コードの簡潔さ: 再帰的なプログラミングは、コードが簡潔になります。同じ処理を反復的に行う場合、再帰的な関数がより簡潔で読みやすいことがあります。これは、再帰的な関数が自身を呼び出すことによって、同じコードブロックを繰り返し書く必要がないためです。
- 抽象化とモジュール化: 再帰的なプログラミングは、処理を小さなサブ処理に分割し、抽象化とモジュール化の考え方に基づいています。このため、再帰的なプログラミングは大規模で複雑なプログラミングを扱う際に、コードの構造をよりシンプルかつ管理しやすくすることができます。
まとめ
再帰的プログラミングは、適切な状況で使用されると非常に強力であり、コードの理解や保守性を向上させることができます。ただし、再帰的なアプローチは適切に扱わなければならず、無限ループやスタックオーバーフローのリスクがあることにも注意が必要です。
コメント