マクロの実行前に、前回の処理で作成された多数のレポートシートを一度にすべてクリアしたい、しかし「ひな形」シートだけは残しておきたい、という場面はよくあります。
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
処理が終わったら、必ずDisplayAlerts
をTrue
に戻すことが極めて重要です。これを忘れると、マカロンの実行後もExcel全体の警告が表示されなくなり、ユーザーが意図しない操作をしてしまう危険があります。
まとめ
特定の1シート以外をすべて削除する、安全で確実な手順は以下の通りです。
- 残したいシートを一番左に移動させる。
- **
Application.DisplayAlerts = False
**で警告をオフにする。 - 後ろから2番目までのシートをループで削除する。
- 最後に必ず**
Application.DisplayAlerts = True
**で警告をオンに戻す。
このパターンは、マクロの初期化処理などでブックをクリーンな状態に戻したい場合に、非常に役立つテクニックです。