📊 Excel VBA Top100
📋

DeleteEmptySheets

シート管理

空のシート(一括でデータがないシート)を削除する

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

DeleteEmptySheets デモ

📖 使い方

  1. VBAエディタを開く(Alt + F11)
  2. モジュールを挿入(挿入 > モジュール)
  3. 下記VBAコードをコピー&ペースト
  4. ブック上で実行(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