「前の項目」のフォルダ参照に処理を追加して、ファイル名一覧(ファイルリスト)を作成するマクロについて考えていきます。
エクセルファイルの表面側はそのまま変更せず、コードのみを追加していきます。
シート側のマクロに下記を追加します。ファイル名一覧を出力するシート名を「filelist」としています。
Sub 実行_Click()
Dim strcond As String
Dim strtemp As Variant
'シートクリア
ThisWorkbook.Worksheets("filelist").UsedRange.Clear
'対象ファイルを取得
strcond = Range("D5").Value
'カンマで分割
strtemp = Split(strcond, ",")
If UBound(strtemp) > 0 Then
'一つ目のカンマより後ろの文字列を取得
strcond = strtemp(1)
End If
'フォルダパス、書き出しシート名、対象ファイル形式を渡す
'バグ対応 2023/8/28
Call GetAllFile(Range("B3").Value, "filelist", strcond)
End Sub
この関数を実行ボタンが押下されたときに動作するマクロとして登録します。
上記で呼び出しているGetAllFile関数を、標準モジュール側に記載します。
'**************************************
' ファイルリスト作成
' Path:フォルダパス
' outputSheetname:出力先シート名
' (存在しなければシートを作成します。
' 既に存在する場合は、シート全体を一度クリアします。)
' condition:対象ファイルの条件
'**************************************
Function GetAllFile(Path As String, outputSheetname As String, condition As String) As Long
Dim fname_str As String
Dim row_l As Long
Dim write_sheet As Worksheet
'書き出し行数の初期化
row_l = 0
fname_str = Dir(Path & "\" & condition, vbNormal)
On Error Resume Next
Set write_sheet = ThisWorkbook.Worksheets(outputSheetname)
If Err.Number <> 0 Then
'シートが存在しない場合、シートを新規作成(右端に追加)
ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets( _
Worksheets.Count)).Name = outputSheetname
Set write_sheet = ThisWorkbook.Worksheets(outputSheetname)
Else
'前のデータをクリア
write_sheet.Cells.Clear
End If
Do While fname_str <> ""
If InStr(fname_str, ".") = 0 Or StrComp(fname_str, ".") = 0 Or StrComp(fname_str, "..") = 0 Then
'フォルダ
ElseIf InStr(fname_str, "~$") <> 0 Then
'システムファイル
Else
'ファイル名をセルに書き出す
write_sheet.Cells(row_l + 1, 1) = Path & "\" & fname_str
row_l = row_l + 1
End If
fname_str = Dir()
Loop
GetAllFile = row_l
End Function
この処理では、指定フォルダ配下に格納されているファイルのみシートに書き出しています。
拡張子を持たないものをフォルダと判断しているため、拡張子のないファイルは無視されます。
指定フォルダ配下のフォルダをさらにたどりたい場合は、再帰関数にする必要があります。
ダウンロードしたエクセルファイルを起動し、コンテンツの有効化を行う。
マクロの有効化手順については、こちらも参考にしてください。
フォルダ参照(ファイル一覧出力)エクセルファイル(xlsm)のダウンロード
ファイル一覧を出力しているシートをエクセル側の操作で非表示に設定していても、マクロの動作に影響はないため、デバッグするためのログとして確認することができます。
ファイル数が多い場合は、一度ファイル一覧を作成後にファイルを開く処理に移行していくと処理すべきファイル数によってマクロの進捗率を表示させることができます。
逆に、ファイル名を書き出した後に、そのファイルを開くような処理順序とすると、問題が発生した場合にどのファイル内のデータを処理しているときに問題が起きたのかが明確になります。