Excel VBAでシートを削除する方法

今回の目標

「マクロで警告を表示させずに削除したい!」や「安全にシートを削除するにはどうすれば良いの?」と思ったあなたへ。 この記事では、警告を表示させずにシートを削除する方法や、複数のシートを一度に削除する方法、安全にシートを削除する方法等を丁寧に解説します! 実務で使える具体例つきです。

目標リスト

  • 警告を表示させずにシートを削除できるようになる
  • 複数のシートを削除できるようになる
  • エラーを発生させずに、シートを削除できるようになる

説明

シートの削除について

Excelマクロでは、シートを削除できます。
マクロからシートの削除を行うこともでき、複数のシートを同時に削除、表示状態のシートが1枚の時にそのシートを削除しようとしていないかの確認をすることができます。
シートを削除すると復元できませんので、慎重に行ってください。

Worksheets("シート名").Delete

シートを削除する場合、Worksheets オブジェクトの Delete メソッドを使用します。 「Worksheets("シート名").Delete」とシート名を指定するか、「Worksheets(1).Delete」とインデックス番号をでシートを指定する方法が可能です。 Delete メソッドに、引数はありません。

削除したいシートオブジェクト.Delete

Application.DisplayAlerts

シートを削除する前に警告が表示されてしまいます。
プログラム実行後の画像
マクロで自動化している中、手動で回答するのは効率的でありません。 これを防ぐには警告を表示させない設定にします。 なお、設定を変更し手処理が完了したら、設定を元に戻して(警告を表示させる設定にして)ください。

・警告を表示させない設定にする。

Application.DisplayAlerts = False

・警告を表示させる設定にする。

Application.DisplayAlerts = True

ブック内のシートを削除する

警告を表示させず、シートを削除する

警告を表示させず、シートを削除する方法です。
サンプルコードでは、警告を表示させずに "Sheet2" を削除します。

サンプルコード

Sub SampleSheetDelete1_1()
    'シートを削除するときに、警告を表示させない
    Application.DisplayAlerts = False
    '"Sheet2" を削除する
    Worksheets("Sheet2").Delete
    '警告の設定を元に戻す(警告を表示させる設定) 
    Application.DisplayAlerts = True
End Sub
【実行サンプル】

● 実行前
プログラム実行前の画像

● 実行後
プログラム実行後の画像

警告を表示状態を保存して、シートを削除する

警告を表示状態を保存して、シートを削除する方法です。
警告の表示状態を False にする前に、値を取得します。シートの削除後に True ではなく、取得した値を代入して元に戻します。 これは他処理で、表示状態を False にしていた場合、シートの削除後に True にしてしまうと他処理で影響が生じることを防ぎます。
サンプルコードでは、警告を表示させずに "Sheet2" を削除、警告の表示状態を元に戻します。

サンプルコード

Sub SampleSheetDelete1_2()
    Dim alerts As Boolean
    '警告の表示状態(表示させる/表示させない)を取得する
    alerts = Application.DisplayAlerts
    '警告を表示させない
    Application.DisplayAlerts = False
    '"Sheet2" を削除する
    Worksheets("Sheet2").Delete
    '警告の表示状態を元に戻す
    Application.DisplayAlerts = alerts
End Sub
【実行サンプル】

● 実行前
プログラム実行前の画像

● 実行後
プログラム実行後の画像

ブックの一番左(先頭)のシートを削除する

ブックの一番左(先頭)のシートを削除する方法です。
「Worksheets(1)」とすることで、一番左(先頭)のシートを指定できます。
サンプルコードでは、一番左のシートを削除します。

サンプルコード

Sub SampleSheetDelete1_3()
    'シートを削除するときに、警告を表示させない
    Application.DisplayAlerts = False
    '"一番左(先頭)のシートを削除する
    Worksheets(1).Delete
    '警告の表示状態を元に戻す
    Application.DisplayAlerts = True
End Sub
【実行サンプル】

● 実行前
プログラム実行前の画像

● 実行後
プログラム実行後の画像

ブックの一番右(最後尾)のシートを削除する

ブックの一番右(最後尾)のシートを削除する方法です。
「Worksheets.Count」はブックのシート数を返します。 「Worksheets(Worksheets.Count)」とすることで、最後尾(一番右)のシートを指定できます。
サンプルコードでは、ブックの一番右(最後尾)のシートを削除します。

サンプルコード

Sub SampleSheetDelete1_4()
    'シートを削除するときに、警告を表示させない
    Application.DisplayAlerts = False
    '最後尾(一番右)のシートを削除する
    Worksheets(Worksheets.Count).Delete
    '警告の表示状態を元に戻す
    Application.DisplayAlerts = True
End Sub
【実行サンプル】

● 実行前
プログラム実行前の画像

● 実行後
プログラム実行後の画像

複数のシートを削除する

複数のシートを削除する方法です。
「Worksheets(Array("Sheet1", "Sheet2"))」とすることで、"Sheet1" と "Sheet2" を指定できます。
サンプルコードでは、"Sheet2" と "Sheet3" を削除します。

サンプルコード

Sub SampleSheetDelete1_5()
    'シートを削除するときに、警告を表示させない
    Application.DisplayAlerts = False
    '"Sheet2" と "Sheet3" のシートを削除する
    Worksheets(Array("Sheet2", "Sheet3")).Delete
    '警告の表示状態を元に戻す
    Application.DisplayAlerts = True
End Sub
【実行サンプル】

● 実行前
プログラム実行前の画像

● 実行後
プログラム実行後の画像

アクティブなシート以外を全て削除する

アクティブなシート以外を全て削除する方法です。
「Worksheets.Count」はブックのシート数を返します。 「シートを1枚ずつ、アクティブなシートか判断して、違うならシートを削除する」処理を行うのですが、後ろのシートから削除してください。 一番左(先頭)のシートから削除すると、インデックス番号がズレてしまい、正しく処理が出来ません(下図参照)。

プログラム実行後の画像

サンプルコードでは、アクティブなシート以外を一番右(最後尾)のシートから削除します。

サンプルコード

Sub SampleSheetDelete1_6()
    Dim i As Long
    Dim activeSheetName As String
    
    'シートを削除するときに、警告を表示させない
    Application.DisplayAlerts = False
    'アクティブなシートのシート名を取得する
    activeSheetName = ActiveSheet.name
    
    'シートを削除するとインデックス番号がズレるので、
    ' 一番右(最後尾)のシートから削除する
    For i = Worksheets.Count To 1 Step -1
        'アクティブでないシートを削除する
        If Worksheets(i).name <> activeSheetName Then
            Worksheets(i).Delete
        End If
    Next i
    '警告の表示状態を元に戻す
    Application.DisplayAlerts = True
End Sub
【実行サンプル】

● 実行前
プログラム実行前の画像

● 実行後
プログラム実行後の画像


他のブックにあるシートを削除する

他のブックにあるシートを削除する

他のブックにあるシートを削除する方法です。
マクロを実行しているブックと別のブックのシートを削除したい場合は、ブックオブジェクトを指定して、シートを削除します。 サンプルコードでは、例として「Book2.xlsx」を指定しています。この Book2.xlsx の ”Sheet3” を削除します。

サンプルコード

Sub SampleSheetDelete2_1()
    'シートを削除するときに、警告を表示させない
    Application.DisplayAlerts = False
    '"Book2.xlsx" にある "Sheet3" を削除する
    Workbooks("Book2.xlsx").Worksheets("Sheet3").Delete
    '警告の表示状態を元に戻す
    Application.DisplayAlerts = True
End Sub
【実行サンプル】

● 実行前(Book2.xlsx のシートの見出し)
プログラム実行前の画像

● 実行後(Book2.xlsx のシートの見出し)
プログラム実行後の画像

安全にシートを削除する

削除できるか確認してから、シートを削除する

シートを安全に削除するには、次の項目の確認が必要です。

  • 削除対象のシートは存在するか
  • 削除対象のシートがあるブックに「ブックの保護」が設定されていないか
  • 表示されているシートが1枚の時、そのシートを削除しようとしていないか

サンプルコードでは、上記のチェックをそれぞれ関数化して、真偽を確認しています。 シートを削除できなかったとき、理由をメッセージボックスに表示します。

サンプルコード

Sub SampleSheetDelete3_1()
    Dim deleteSheetName As String   '削除対象のシート名
    
    deleteSheetName = "Sheet1"

    If DeleteWorksheet(deleteSheetName, ThisWorkbook) Then
        'シートを削除できた時の処理
    
    Else
        'シートを削除できなかった時の処理
    
    End If
End Sub

'--------------------------------------------------------------
' シートを削除できるか確認してから削除する
'     ※ 削除できない場合はメッセージボックスを表示する
'   deleteSheetName:削除したいシート名
'   wb             :削除したいシートがあるブックオブジェクト
'   戻り値:True /シートが削除できた
'       False/シートが削除できなかった
'--------------------------------------------------------------
Function DeleteWorksheet(ByRef deleteSheetName As String, _
                            ByRef wb As Workbook) As Boolean
    On Error Goto ErrHandler
    Dim flag1 As Boolean
    Dim flag2 As Boolean
    Dim flag3 As Boolean
    Dim errMsg As String
    Dim alerts As Boolean
    
    alerts = Application.DisplayAlerts
    
    '削除対象のシートが存在するか
    flag1 = IsSheetNameUsed(wb, deleteSheetName)
    '削除対象のブックにブックの保護が掛けられていないか
    flag2 = IsWorkbookUnprotected(wb)
    '表示されているシートが1枚の時、そのシートが削除対象か
    If flag1 Then flag3 = IsAllowedToDeleteSheet(wb, deleteSheetName)
    
    '1つでも成立していないフラグがあると、シートを削除できない
    If Not (flag1 And flag2 And flag3) Then
        'エラーメッセージの生成1
        errMsg = "エラーが発生しました。" & vbNewLine & _
            "この画面をキャプチャして、" & vbNewLine & _
            "システム管理者にご連絡ください。" & vbNewLine & _
            "ーーーーーーーーーーーーーーーー" & vbNewLine & _
            "シートを削除できませんでした。" & vbNewLine & _
            "(削除対象のシート名:" & deleteSheetName & ")"
        'エラーメッセージの生成2
        If Not flag1 Then errMsg = errMsg & vbNewLine & _
            "・削除対象のシート名[" & deleteSheetName & "]がありません"
        If Not flag2 Then errMsg = errMsg & vbNewLine & _
            "・ブックの保護を解除してください"
        If Not flag3 And flag1 Then errMsg = errMsg & vbNewLine & _
            "・表示されているシートが1枚のとき、そのシートは削除できません"
    End If
    
    If errMsg = "" Then
        Application.DisplayAlerts = False
        wb.Worksheets(deleteSheetName).Delete
        Application.DisplayAlerts = alerts
        DeleteWorksheet = True
    Else
        MsgBox errMsg, vbCritical
        DeleteWorksheet = False
    End If
    
    Exit Function
    
ErrHandler:
    Application.DisplayAlerts = alerts
End Function

'--------------------------------------------------------------
' ブックに同名のシート名が存在しているか確認する
'   wb           :確認対象のブックオブジェクト
'   deleteSheetName:削除したいシート名
'   戻り値:True/同名のシート名が存在している
'--------------------------------------------------------------
Function IsSheetNameUsed(ByRef wb As Workbook, _
                ByRef deleteSheetName As String) As Boolean
    Dim buf As Worksheet
    
    'ブックのシートを1シートずつ、名前が一致している確認する
    For Each buf In wb.Worksheets
        If buf.name = deleteSheetName Then
            IsSheetNameUsed = True
            Exit Function
        End If
    Next buf
    IsSheetNameUsed = False
End Function

'--------------------------------------------------------------
' ブックが保護されていないか
' ※ ブックの保護時、シートの追加・削除・移動・名前変更 ができない
'   戻り値:True/ブックが保護されていない
'--------------------------------------------------------------
Function IsWorkbookUnprotected(ByRef wb As Workbook) As Boolean
    IsWorkbookUnprotected = Not wb.ProtectStructure
End Function

'--------------------------------------------------------------
' 表示されているシートが1枚の時、そのシートが削除対象か
'   ※表示シートが1枚のとき、表示されているシートを削除できない
'  wb             :確認対象のブックオブジェクト
'  deleteSheetName:削除したいシート名
'  戻り値:True/削除可能(表示シートが2枚以上 or 削除対象が非表示)
'--------------------------------------------------------------
Function IsAllowedToDeleteSheet(ByRef wb As Workbook, _
                    ByRef deleteSheetName As String) As Boolean
    Dim i As Long
    Dim showSheetCount As Long
    
    'シートの存在確認は呼び出し元で行うこと!
    
    '非表示のシートなら、削除可能
    If wb.Worksheets(deleteSheetName).Visible <> xlSheetVisible Then
        IsAllowedToDeleteSheet = True
        Exit Function
    End If
    
    '表示されているシートをカウントする
    For i = 1 To wb.Worksheets.Count
        If wb.Worksheets(i).Visible Then
            showSheetCount = showSheetCount + 1
        End If
    Next i
    '表示されているシートが2枚以上なら、シートを削除可能
    IsAllowedToDeleteSheet = (showSheetCount >= 2)
End Function
【実行サンプル】

● 実行前("Sheet1" のみ表示されている場合)
プログラム実行前の画像

● 実行後("Sheet1" のみ表示されている場合)
プログラム実行前の画像


● 実行前("Sheet1" と "Sheet2" が表示されている場合)
プログラム実行後の画像

● 実行後("Sheet1" と "Sheet2" が表示されている場合)
プログラム実行後の画像

ページの先頭へ