0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Excel VBA 特定のシートの削除を防止するマクロ

0
Last updated at Posted at 2026-08-11

まず、下記コードを標準モジュールに配置してください。

'-----------------------------------------------------------------------------
' 標準モジュール
'-----------------------------------------------------------------------------
Option Explicit

'-----------------------------------------------------------------------------
' グローバル変数
'-----------------------------------------------------------------------------
Public IsDelBlock As Boolean    ' WBモジュールでシートの誤削除防止処理の多重発火防止用変数

'-----------------------------------------------------------------------------
' シート関係定数(TopSheet向け)
'-----------------------------------------------------------------------------
Public Const TopSheet As String = "目次"                    ' 請求情報をまとめたデータを取り扱うメインシート名
Public Const InputPDFSheet As String = "PDF取込"     ' 指定されたファイルの情報を書き込むシート名

'-----------------------------------------------------------------------------
' 配列の初期化に関する関数(定数用)
'-----------------------------------------------------------------------------
' 削除禁止シート名を返す関数
' 本配列の最後にあるシートを発見した際にB列の10~30行目あたりのセルを自動選択するような内部処理がある可能性が高いため"hoge"を残す方針とした。(""の空白では対策不可だった)

Public Function GetBlockList() As Variant
    Dim blockList As Variant
    blockList = Array(TopSheet, InputPDFSheet, "hoge")
    GetBlockList = blockList
End Function

' 誤削除防止用関数(WBモジュール用)
Public Sub ブック保護の解除()
    ThisWorkbook.Unprotect
    IsDelBlock = False
End Sub

その次に下記に記載するコードをワークブックモジュールに配置してください

'-----------------------------------------------------------------------------
' wbモジュール
'-----------------------------------------------------------------------------

'いずれかのシートを削除した時
Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object)
    If IsDelBlock = True Then Exit Sub
    Dim blockList As Variant
    blockList = GetBlockList() ' 本配列の最後にあるシートを発見した際にB列の6~30行目あたりのセルを自動選択する内部処理になっている可能性が高いため"hoge"を残す方針とした。(""の空白での対応は不可だった)

    Dim v As Variant
    For Each v In blockList
        If Sh.Name = v Then
            ' 削除禁止
            MsgBox "削除禁止シートが含まれているため、ブックを保護して削除を停止します。", vbExclamation

            ' ブック構造を保護して削除を物理的に不可能にする
            ThisWorkbook.Protect Structure:=True
            IsDelBlock = True ' 多重発火防止

            ' 少し後に解除(削除操作はキャンセルされる)
            Application.OnTime Now + TimeValue("0:00:01"), "ブック保護の解除"
            Exit Sub
        End If
    Next v
End Sub

このコードでGetBlockList関数に登録したシート名があれば削除を防止できます。
必要に応じて変更してください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?