VBAで自動化 VBA一覧 シート操作 セル・シート・ブック操作

【VBA】最後のシートまで繰り返す方法|全シート処理・応用・エラー対策を徹底解説

ExcelVBAを使っていると、次のような場面に遭遇することが多いはずです。

  • すべてのシートに同じ処理をしたい
  • 1枚ずつシートを読み取って値を集計したい
  • 最後のシートまで繰り返して、最終結果を出したい

こうしたケースでは、「最後のシートまで繰り返す」仕組みを理解することが重要です。
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)順に表示されます。

参考:【VBA】範囲指定を最終行まで:指定する方法


💡ポイント

  • 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

処理内容

  1. すべてのシートを対象にループ
  2. 「集計」シートだけは除外
  3. 各シートの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 EachCopy構文
特定文字を含むシートだけ処理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枚ずつの手作業を自動化し、「すべてのシートを自動で処理する」仕組みを構築できれば、
月次報告書作成や大量データ処理が驚くほど効率化します。

    -VBAで自動化, VBA一覧, シート操作, セル・シート・ブック操作