📋
DeleteEmptySheets
シート管理空のシート(一括でデータがないシート)を削除する
データが入力されていない空のワークシートをVBAで自動削除するマクロです。UsedRangeのRowsCountとColumnsCountを確認し、1行1列のみ(実質空)のシートを検出して削除します。Application.DisplayAlertsをFalseに設定することで確認ダイアログなしで一括削除できます。ブック整理や不要シートのクリーンアップに便利で、ファイルサイズの削減にも効果的です。内部ではUsedRangeのプロパティを確認して実質的にデータが存在しないシートを判定しており、判定条件をカスタマイズすれば「1行のみ」ではなく「特定セルが空欄」など、より細かい基準での削除にも対応できます。GroupSheetsで大量作成したテンプレートのうち使われなかった分を、運用終了後にまとめて整理する際にも活躍します。

📖 使い方
- VBAエディタを開く(Alt + F11)
- モジュールを挿入(挿入 > モジュール)
- 下記VBAコードをコピー&ペースト
- ブック上で実行(Alt + F8 でマクロ選択)
💡 実行例: 実行すると空のシートがリストされ、確認後に削除される
🎯 活用シーン
- ✓テンプレートから大量生成したシートの不要なものを一括削除
- ✓データ整理後に残った空シートをまとめてクリーンアップ
- ✓ファイル共有前に未使用シートを削除してブックを軽量化
- ✓大量のテンプレートシートを事前生成しておき、実際に使われなかった分を後からまとめて削除したいとき
- ✓長期間運用したブックに溜まった検証用の空シートを、定期メンテナンスとして一括整理したいとき
💡 実装のヒント
- ▸削除前にApplication.DisplayAlerts = Falseで確認ダイアログを非表示にします
- ▸最低1枚のシートが必要なため削除前にシート数を確認します
- ▸UsedRange.Rows.Count = 1かつUsedRange.Columns.Count = 1で空判定できます
- ▸削除前に対象シート名をログとして書き出しておくと、誤って必要なシートを削除した場合の復元判断がしやすくなります。
- ▸「空判定」の基準はUsedRangeだけでなくCells.SpecialCells(xlCellTypeConstants)でも代用でき、状況に応じて使い分けられます。
💻 VBAコード
' DeleteEmptySheets
' -----------------
' Macro Name: DeleteEmptySheets
' Description: 空のシート(一括でデータがないシート)を削除する
' Parameters: なし
' Returns: なし
' Usage: 実行すると空のシートがリストされ、確認後に削除される
' -----------------
Sub DeleteEmptySheets()
Dim ws As Worksheet
Dim emptySheets As Collection
Dim sheetName As String
Dim confirmMsg As String
Dim i As Long
Dim keepAtLeastOne As Boolean
On Error GoTo ErrorHandler
Set emptySheets = New Collection
For Each ws In Worksheets
If IsSheetEmpty(ws) Then
emptySheets.Add ws.Name
End If
Next ws
If emptySheets.Count = 0 Then
MsgBox "空のシートはありません。", vbInformation
Exit Sub
End If
confirmMsg = "以下の空シートを削除します:" & vbCrLf & vbCrLf
For i = 1 To emptySheets.Count
confirmMsg = confirmMsg & " " & i & ": " & emptySheets(i) & vbCrLf
Next i
confirmMsg = confirmMsg & vbCrLf & "宜しいですか?"
If Worksheets.Count - emptySheets.Count < 1 Then
MsgBox "すべてのシートが空白です。全削除は禁止されています。", vbExclamation
Exit Sub
End If
If MsgBox(confirmMsg, vbYesNo + vbExclamation, "空シート削除") = vbNo Then
Exit Sub
End If
Application.DisplayAlerts = False
For i = emptySheets.Count To 1 Step -1
Worksheets(emptySheets(i)).Delete
Next i
Application.DisplayAlerts = True
MsgBox emptySheets.Count & "枚の空シートを削除しました。", vbInformation
Exit Sub
ErrorHandler:
Application.DisplayAlerts = True
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub
Private Function IsSheetEmpty(ws As Worksheet) As Boolean
Dim usedRange As Range
Set usedRange = ws.UsedRange
If usedRange Is Nothing Then
IsSheetEmpty = True
Exit Function
End If
If Application.WorksheetFunction.CountA(usedRange) = 0 Then
IsSheetEmpty = True
Else
IsSheetEmpty = False
End If
End Function