ExcelVBAを使っていると、次のような場面に遭遇することが多いはずです。
- すべてのシートに同じ処理をしたい
- 1枚ずつシートを読み取って値を集計したい
- 最後のシートまで繰り返して、最終結果を出したい
こうしたケースでは、「最後のシートまで繰り返す」仕組みを理解することが重要です。
VBAでは、ブック内のシートをループ処理(繰り返し)で順番に操作することができます。
この記事では、基本構文から実務レベルの応用まで、全シート処理の考え方と最終シートまで正確に繰り返す方法を丁寧に解説します。
目次
- ✅ 「最後のシートまで繰り返す」とは?VBAでの考え方
- ✅ 基本構文:For Eachを使ってすべてのシートを繰り返す
- 🔹 基本構文
- 🔹 実行結果
- ✅ 最後のシートまで繰り返して特定処理を行う例
- 🔹 例①:すべてのシートのA1セルに日付を入力
- 🔹 例②:すべてのシートのデータを1つのシートに集計
- ✅ For i構文を使って「シート数」をもとに繰り返す方法
- 🔹 コード例
- 🔹 逆順で最後のシートから最初まで繰り返す
- ✅ 最後のシートまで繰り返して条件処理を行う(If文との組み合わせ)
- 🔹 コード例:名前に「集計」を含むシートだけ処理
- ✅ 最後のシートまで繰り返す応用:PDF出力・保存処理
- 🔹 コード例:全シートをPDF化して保存
- ✅ Do Until構文で「最後のシートに達するまで」繰り返す方法
- 🔹 コード例
- 🔹 応用:途中で条件一致したら終了する
- ✅ ループで全シートを扱う際の注意点
- ⚠ 1. グラフシートを含めるかどうかを確認
- ⚠ 2. 非表示シート(Hidden / VeryHidden)は対象外?
- ⚠ 3. シートの削除・追加中にループするとエラー
- ✅ 実務で役立つ応用例まとめ
- ■ まとめ:VBAで最後のシートまで繰り返す方法をマスターしよう
✅ 「最後のシートまで繰り返す」とは?VBAでの考え方
VBAで「最後のシートまで繰り返す」とは、
ブック内に存在するすべてのシート(Worksheet)を順に処理するという意味です。
Excelのブックは、次のように複数のシートで構成されています。
| シート名 | 内容 |
|---|---|
| Sheet1 | 元データ |
| Sheet2 | 集計用 |
| Sheet3 | グラフ |
| Sheet4 | 出力結果 |
このとき「Sheet1→Sheet2→Sheet3→Sheet4」と、最後(Sheet4)まで順番に繰り返すのが目的です。
参考:【VBA】最後のシートの後ろにコピーする方法|基本構文から自動命名・応用まで完全ガイド
✅ 基本構文:For Eachを使ってすべてのシートを繰り返す
最も簡単で確実な方法が、For Each構文を使う方法です。
VBAでシートを順に処理する場合は、ほぼこの方法で十分です。
🔹 基本構文
Sub LoopAllSheets()
Dim ws As Worksheet
For Each ws In Worksheets
' 各シートで実行する処理
MsgBox ws.Name
Next ws
End Sub
🔹 実行結果
ブック内のシートを1枚ずつ順に読み取り、シート名を表示します。
たとえばシートが4枚ある場合、メッセージボックスが4回(Sheet1~Sheet4)順に表示されます。
💡ポイント
Worksheetsはワークシートのみを対象にします。
グラフシートなどを含めたい場合は、Sheetsを使います。wsは「Worksheet型」の変数で、シートを順に参照します。Next wsで1つ次のシートに進みます。
✅ 最後のシートまで繰り返して特定処理を行う例
単に名前を表示するだけではなく、実務では次のような処理を行うことが多いです。
- 各シートの最終行を求める
- 各シートから値を集計する
- すべてのシートをPDF出力する
以下で具体的な応用例を紹介します。
🔹 例①:すべてのシートのA1セルに日付を入力
Sub WriteDateToAllSheets()
Dim ws As Worksheet
For Each ws In Worksheets
ws.Range("A1").Value = Date
Next ws
MsgBox "すべてのシートに日付を入力しました。"
End Sub
解説
For Each ws In Worksheetsにより、ブック内すべてのシートを順番に参照。
ws.Range("A1")でA1セルに今日の日付を自動入力します。
業務日報や月報フォーマットの一括更新に使えるコードです。
参考:【VBA】For Each ステートメントの使い方と活用例
🔹 例②:すべてのシートのデータを1つのシートに集計
Sub CollectData()
Dim ws As Worksheet
Dim dest As Worksheet
Dim lastRow As Long
Dim nextRow As Long
Set dest = Worksheets("集計") ' 集約先シート
For Each ws In Worksheets
If ws.Name <> dest.Name Then
lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
nextRow = dest.Cells(Rows.Count, 1).End(xlUp).Row + 1
ws.Range("A1:C" & lastRow).Copy dest.Range("A" & nextRow)
End If
Next ws
MsgBox "すべてのシートを集計しました。"
End Sub
処理内容
- すべてのシートを対象にループ
- 「集計」シートだけは除外
- 各シートのA列~C列をコピーし、集約シートに順次貼り付け
複数部署や月別データを一括まとめたいときに重宝します。
✅ For i構文を使って「シート数」をもとに繰り返す方法
For Eachではなく、シート番号(インデックス)で制御することも可能です。
この方法では、シート数をSheets.Countで取得します。
🔹 コード例
Sub LoopByIndex()
Dim i As Long
For i = 1 To Sheets.Count
MsgBox Sheets(i).Name
Next i
End Sub
解説
Sheets.Countはシートの総数を表します。- シートは1から順に番号が振られており、最後は
Sheets(Sheets.Count)で参照可能。 - シート削除や順番変更に影響を受けるため、順序を意識した処理をしたいときに便利です。参考:【VBA】末尾にシートを追加する方法
🔹 逆順で最後のシートから最初まで繰り返す
Sub LoopReverse()
Dim i As Long
For i = Sheets.Count To 1 Step -1
MsgBox Sheets(i).Name
Next i
End Sub
実行結果
最後のシートから順に、名前が逆順で表示されます。
これは「後ろから順に削除・コピー」などの処理を行う場合に有効です。
参考:【VBA】「前の処理に戻る」方法を徹底解説|途中から再開・前ステップへ戻すテクニック
✅ 最後のシートまで繰り返して条件処理を行う(If文との組み合わせ)
繰り返し処理では、単に全シートを回すだけでなく、
特定条件を満たすシートだけ処理するように絞り込むこともできます。
🔹 コード例:名前に「集計」を含むシートだけ処理
Sub ProcessSpecificSheets()
Dim ws As Worksheet
For Each ws In Worksheets
If InStr(ws.Name, "集計") > 0 Then
ws.Range("A1").Value = "対象シート"
End If
Next ws
End Sub
実行結果
名前に「集計」が含まれるシート(例:「売上集計」「月次集計」など)のA1セルに文字を書き込みます。
このように、If文と組み合わせることで柔軟な処理が可能です。
参考:【VBA】文字列検索を部分一致で行う方法|Find・InStr・ループを使った実務サンプル
✅ 最後のシートまで繰り返す応用:PDF出力・保存処理
実務でよく使われる応用として、「すべてのシートをPDFで保存」するケースがあります。
VBAのループ構文で最後のシートまで順に処理すれば、自動化が簡単にできます。
🔹 コード例:全シートをPDF化して保存
Sub ExportSheetsToPDF()
Dim ws As Worksheet
Dim path As String
path = ThisWorkbook.Path & "\PDF出力\"
' 保存フォルダがなければ作成
If Dir(path, vbDirectory) = "" Then MkDir path
For Each ws In Worksheets
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=path & ws.Name & ".pdf", _
Quality:=xlQualityStandard
Next ws
MsgBox "全シートをPDF出力しました。"
End Sub
実務ポイント
ExportAsFixedFormatメソッドでPDF形式を指定- 各シートを名前付きで出力
- すべてのシートを最後まで自動処理
月次帳票や部署別レポートを一括出力するときに非常に便利です。
✅ Do Until構文で「最後のシートに達するまで」繰り返す方法
別の書き方として、「条件が満たされるまで繰り返す」構文でも実現できます。
参考:【VBA】CSVファイルを開く方法|基礎から実務応用まで徹底解説
🔹 コード例
Sub LoopUntilLastSheet()
Dim i As Long
i = 1
Do Until i > Sheets.Count
MsgBox Sheets(i).Name
i = i + 1
Loop
End Sub
ポイント
Do Until i > Sheets.Count→ 最後のシートまでループ- 柔軟な条件設定が可能で、「途中で中断」も簡単に実装できます。
🔹 応用:途中で条件一致したら終了する
Sub StopWhenFound()
Dim i As Long
For i = 1 To Sheets.Count
If Sheets(i).Name = "集計" Then
MsgBox "対象シートが見つかりました。"
Exit For
End If
Next i
End Sub
このように、「最後まで繰り返すが、途中で目的のシートが見つかったら終了」という処理も簡単に作れます。
参考:【VBA】Exit Forの入れ子(ネスト)する方法:For文
✅ ループで全シートを扱う際の注意点
「最後まで繰り返す」処理を書く際は、以下のポイントに注意してください。
⚠ 1. グラフシートを含めるかどうかを確認
Worksheetsは通常のワークシートのみを対象としますが、Sheetsを使うとグラフシートも含まれます。
不要なシートを誤って処理しないように区別しましょう。
⚠ 2. 非表示シート(Hidden / VeryHidden)は対象外?
For Eachでのループでは、非表示シートも含まれます。
ただしユーザーには見えないため、操作系マクロでは除外したほうが安全です。
If ws.Visible = xlSheetVisible Then
' 表示中のシートだけ処理
End If
⚠ 3. シートの削除・追加中にループするとエラー
ループ内でシートを削除したり追加したりすると、
シート数が変わるため「インデックス範囲外」エラーが起こることがあります。
この場合は逆順ループを使うか、削除対象を一時的にリスト化してから処理する方法が安全です。
✅ 実務で役立つ応用例まとめ
| 処理内容 | 方法 |
|---|---|
| 各シートのA1セルに日付を入力 | For Each ws In Worksheets |
| シートごとにデータ集計 | For Each+Copy構文 |
| 特定文字を含むシートだけ処理 | If InStr(ws.Name, "○○") |
| 最後のシートまでPDF出力 | ExportAsFixedFormatをループ内で実行 |
| 最後のシート名を取得 | Sheets(Sheets.Count).Name |
| 最後のシートから逆順に削除 | For i = Sheets.Count To 1 Step -1 |
■ まとめ:VBAで最後のシートまで繰り返す方法をマスターしよう
For Each ws In Worksheetsが最もシンプルで安全Sheets.Countを使えば最後のシートを明示的に扱えるStep -1で逆順ループも可能- 条件付き・非表示除外など応用も自在
- 全シート集計・PDF出力・日付入力など、実務で応用範囲が広い
ブック内すべてのシートを扱うスキルは、VBA自動化の基礎中の基礎です。
1枚ずつの手作業を自動化し、「すべてのシートを自動で処理する」仕組みを構築できれば、
月次報告書作成や大量データ処理が驚くほど効率化します。