【仕事効率爆上げ】VBAでフォルダ内の全Excelファイルを一括処理する方法

複数のExcelファイルに対して同じ処理を繰り返すのは面倒…そんな時は、VBAで自動化して一括処理しましょう! この記事では、フォルダ内の全ファイルを対象に、開いて処理し、保存して閉じる方法を解説します。仕事効率アップ間違いなし!


この記事でわかること

  • フォルダ内のExcelファイルをループ処理するVBAコード
  • 各ファイルで指定の処理を実行するカスタマイズ方法
  • エラーハンドリング・最後の集計処理も追加可能
  • 仕事利用に適した安定したサンプル

第1章|フォルダ内全ファイルを順番に処理する土台

まずは基本コード。以下の処理をフォルダ内の全.xls*ファイルに対して実行します。

Sub ProcessAllWorkbooks()
    Dim folderPath As String
    Dim wb As Workbook
    Dim fName As String
    
    ' 処理対象のフォルダを指定(末尾に \ が必要)
    folderPath = "C:\data\excel_files\"
    
    ' 最初のファイル取得
    fName = Dir(folderPath & "*.xls*")
    
    Do While fName <> ""
        ' ファイルを開く
        Set wb = Workbooks.Open(folderPath & fName)
        
        ' ▼ ▼▼ ここに処理内容を記述 ▼▼▼
        Call SampleProcess(wb)
        ' ▲ ▲▲ ここまで処理内容 ▼▲▲▲
        
        ' 保存して閉じる
        wb.Close SaveChanges:=True
        
        ' 次のファイルへ
        fName = Dir()
    Loop
    
    MsgBox "全ファイルの処理が完了しました!"
End Sub

第2章|実際の処理例:シート追加&特定セルにスタンプ

共通処理はSampleProcessとして分岐。例として、各ファイルに「処理済み」シートを追加し、A1セルにタイムスタンプを記入します。

Sub SampleProcess(ByRef wb As Workbook)
    Dim ws As Worksheet
    Dim tSheet As Worksheet
    
    ' 新規シート「処理済み」を挿入(既存なら削除)
    On Error Resume Next
    wb.Worksheets("処理済み").Delete
    On Error GoTo 0
    
    Set tSheet = wb.Worksheets.Add(After:=wb.Worksheets(wb.Worksheets.Count))
    tSheet.Name = "処理済み"
    
    ' タイムスタンプの記入
    tSheet.Range("A1").Value = "処理日時:" & Format(Now, "yyyy/mm/dd hh:nn:ss")
    
    ' 例:B列にファイル名を記入
    tSheet.Range("B1").Value = "ファイル名:" & wb.Name
End Sub

第3章|ステップアップ:集計用マスターブックで記録する方法

すべてのファイルから集計情報を一元管理したいなら、マスターブックに出力しましょう。以下は処理内容を新規ブックにまとめるサンプルです。

Sub BatchProcessAndCollect()
    Dim folderPath As String
    Dim fName As String
    Dim masterWb As Workbook
    Dim masterWs As Worksheet
    Dim nextRow As Long
    
    folderPath = "C:\data\excel_files\"
    fName = Dir(folderPath & "*.xls*")
    
    ' 集計用ブックとシートを作成
    Set masterWb = Workbooks.Add
    Set masterWs = masterWb.Worksheets(1)
    masterWs.Range("A1:C1").Value = Array("ファイル名", "処理日時", "リザルト値")
    nextRow = 2
    
    Do While fName <> ""
        Dim wb As Workbook
        Set wb = Workbooks.Open(folderPath & fName)
        
        ' 個別処理と結果取得(例としてA2セルを取得)
        Call SampleProcess(wb)
        Dim resultValue As Variant
        resultValue = wb.Worksheets("処理済み").Range("A2").Value
        
        ' マスターへ記録
        masterWs.Cells(nextRow, 1).Value = fName
        masterWs.Cells(nextRow, 2).Value = Format(Now, "yyyy/mm/dd hh:nn:ss")
        masterWs.Cells(nextRow, 3).Value = resultValue
        
        nextRow = nextRow + 1
        
        wb.Close SaveChanges:=True
        fName = Dir()
    Loop
    
    ' マスターブックを保存
    masterWb.SaveAs Filename:=folderPath & "master_report.xlsx"
    MsgBox "集計が完了し、master_report.xlsx に出力されました!"
End Sub

Tips:エラーハンドリングと進行状況表示

' 処理中ダイアログ更新の例
Application.StatusBar = "処理中:" & fName

' エラー時でもループ継続する例
On Error Resume Next
' ...処理内容...
If Err.Number <> 0 Then
    Debug.Print "エラー:" & fName & " - " & Err.Description
    Err.Clear
End If
On Error GoTo 0

まとめ:効率化のポイント

  • Dirでファイルループ、Workbooks.Open/Closeで操作、Callで処理を分離
  • 処理内容は別Subへ切り出して柔軟性UP
  • マスターブック集計を組み込むだけで現場導入もスムーズ
  • エラー処理とステータス表示で使い勝手も抜群

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