複数の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
- マスターブック集計を組み込むだけで現場導入もスムーズ
- エラー処理とステータス表示で使い勝手も抜群