シートが削除される直前にマクロを自動実行する方法を解説します。
シートモジュールのイベント「Worksheet_BeforeDelete」を使用します。
また、全シートのコードを一ヶ所に書きたい場合は、
「Workbook_SheetBeforeDelete」を使用する方法もあります。
処理をシートごとに記載したい場合 - Worksheet_BeforeDelete
以下のコードを設定したいシートモジュールに記載します。
Private Sub Worksheet_BeforeDelete() MsgBox Me.Name & "が削除されます。" End Sub
プロシージャ名を変更することはできません。
第1行は変更せずすべてこのままのコードを記述してください。
このWorksheet_BeforeDeleteなどイベントプロシージャは、
記述するシートモジュールの上部選択肢から選ぶことが出来ます。


これを選択すると、↓の状態で空のイベントプロシージャが挿入されます。
Private Sub Worksheet_BeforeDelete() End Sub
イベントプロシージャの構文はWEB検索で探したりする必要はなく、
使うときにこの選択肢から選べばよいことを覚えておきましょう。
なお、このBeforeDeleteプロシージャには引数Cancelがないため、
ストレートな方法でシートの削除を中止させることはできません。
代わりの手段として、「削除される直前にブックを保護する」という方法があります。
Private Sub Worksheet_BeforeDelete() If シートを削除してよい条件 Then ThisWorkbook.Unprotect Else ThisWorkbook.Protect End If End Sub
このコードをシートモジュールに書いておくことで、
条件を満たさなければ削除直前にブックが保護され、結果削除は失敗します。
状況によってシートを削除させたくない場合はこの方法を活用してください。
処理を全シート分まとめて書きたい場合 - Workbook_SheetBeforeDelete
今回の処理をひとつのプロシージャにまとめて書きたい場合は、
ThisworkbookモジュールのWorkbook_SheetBeforeDeleteイベント
を使用することも可能です。
Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object) MsgBox Sh.Name & "が削除されます。" End Sub
プロシージャ名、引数名を変更することはできません。
第1行は変更せずすべてこのままのコードを記述してください。
引数「sh」は判定用の引数で、
このプロシージャを呼び出した=削除されようとしているシートがSetされています。
例えば上記のコードのように「Sh.Name」を使ってコードを書けば、
削除直前のシートの名称をMsgBoxに表示できます。
シートごとに処理を分岐したい場合はSelectCaseを用いて、
以下のようなコードを記載してください。
Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object) Select Case Sh.Name Case "Sheet1" ' Sheet1が削除される直前の処理 Case "sheet2", "Sheet3" ' Sheet2、Sheet3が削除される直前の処理 End Select End Sub
このように、Workbook_SheetBeforeDeleteイベントを用いると、
ブック内の全シートのBeforeDeleteイベントをまとめて書くことが出来ます。
- 同じ処理であれば1回書くだけで済む
- 全シートの処理の違いが一目瞭然になる
などのメリットがある代わりに、シートモジュールを見るだけではそのシートのイベントを一覧できなくなるデメリットもあります。
状況に応じて使い分けてください。