【Excel VBA】特定の1シート以外をすべて削除する方法

マクロの実行前に、前回の処理で作成された多数のレポートシートを一度にすべてクリアしたい、しかし「ひな形」シートだけは残しておきたい、という場面はよくあります。

VBAで複数のシートを削除する際に注意すべきなのが、ループの順番です。この記事では、特定の1シートを安全に残しつつ、他の全シートを効率的に削除するための、確実なVBAコードの書き方を解説します。


目次

削除ループは「後ろから」が鉄則

複数のアイテムをコレクションから削除する場合、Forループは後ろから前へ(例: 10番目→9番目→…)と実行するのが鉄則です。

もし前から順番に(1番目→2番目→…)削除しようとすると、例えば2番目のシートを削除した瞬間に、3番目だったシートが新しい2番目に繰り上がります。しかし、ループのカウンターは次に3番目に進むため、新しい2番目のシートは処理されずにスキップされてしまいます。

For i = Worksheets.Count To 2 Step -1 のように、後ろからループすることで、インデックスの繰り上がりを気にする必要がなくなり、安全にすべての対象シートを削除できます。


完成したVBAコード

以下が、「マスター」という名前のシート1枚だけを残し、他のすべてのワークシートを削除するVBAコードです。

Sub DeleteAllSheetsExceptOne()

    ' 変数を宣言します
    Dim sheetToKeep As Worksheet
    Dim i As Long
    
    ' --- 1. 残したいシートを特定 ---
    On Error Resume Next ' 残したいシートが存在しない場合のエラーを回避
    Set sheetToKeep = ThisWorkbook.Worksheets("マスター")
    On Error GoTo 0
    
    If sheetToKeep Is Nothing Then
        MsgBox "残すべき「マスター」シートが見つかりません。", vbCritical
        Exit Sub
    End If
    
    ' --- 2. シートが1枚しかない場合は処理を終了 ---
    ' Excelでは最後の1枚のシートは削除できないため
    If ThisWorkbook.Worksheets.Count <= 1 Then
        MsgBox "シートが1枚しかないため、削除処理は行いません。", vbInformation
        Exit Sub
    End If

    ' --- 3. 警告メッセージを非表示にし、削除処理を実行 ---
    Application.DisplayAlerts = False
    
    ' 残したいシートを一番左に移動させる
    sheetToKeep.Move Before:=ThisWorkbook.Worksheets(1)
    
    ' 後ろから2番目のシートまでループして削除
    For i = ThisWorkbook.Worksheets.Count To 2 Step -1
        ThisWorkbook.Worksheets(i).Delete
    Next i
    
    ' --- 4. 警告メッセージを元に戻す(最重要) ---
    Application.DisplayAlerts = True
    
    MsgBox "「" & sheetToKeep.Name & "」以外のシートをすべて削除しました。"

End Sub

コードのポイント解説

① 残したいシートを先頭に移動

sheetToKeep.Move Before:=ThisWorkbook.Worksheets(1)

削除ループを開始する前に、残したいシートを.Moveメソッドでブックの一番左(インデックス番号1の位置)に移動させます。こうすることで、後のループ処理が「2番目から最後までをすべて削除する」という非常にシンプルなロジックで済むようになります。

② 警告メッセージの非表示

Application.DisplayAlerts = False

シートを削除する.Deleteメソッドは、通常「選択したシートは完全に削除されます。」という警告メッセージを表示し、マクロを一時停止させます。Application.DisplayAlerts = Falseを宣言することで、この警告をすべて非表示にし、処理をスムーズに進めることができます。

③ 後ろからループして削除

For i = ThisWorkbook.Worksheets.Count To 2 Step -1
    ThisWorkbook.Worksheets(i).Delete
Next i

これが、安全な削除処理の核心部分です。

  • For i = Worksheets.Count To 2: ループのカウンターiを、シートの総数からスタートし、2になるまで繰り返します。
  • Step -1: ループ1回ごとに、カウンターを1ずつ減らすことを意味します。 これにより、一番右端のシートから順番に、2番目のシートまでが削除され、先頭に移動させた「残したいシート」だけが処理の対象外となります。

④ 警告メッセージの再表示

Application.DisplayAlerts = True

処理が終わったら、必ずDisplayAlertsTrueに戻すことが極めて重要です。これを忘れると、マカロンの実行後もExcel全体の警告が表示されなくなり、ユーザーが意図しない操作をしてしまう危険があります。


まとめ

特定の1シート以外をすべて削除する、安全で確実な手順は以下の通りです。

  1. 残したいシートを一番左に移動させる。
  2. **Application.DisplayAlerts = False**で警告をオフにする。
  3. 後ろから2番目までのシートをループで削除する。
  4. 最後に必ず**Application.DisplayAlerts = True**で警告をオンに戻す。

このパターンは、マクロの初期化処理などでブックをクリーンな状態に戻したい場合に、非常に役立つテクニックです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次