Workbook_BeforeCloseイベントと、
Auto_Closeプロシージャの違いを解説します。
同じところ
どちらも「ブックを閉じる直前にマクロを自動実行する」仕組みです。
以下のコードはどちらもブックを閉じる直前にメッセージを表示します。
Private Sub Workbook_BeforeClose(Cancel as Boolean) MsgBox "ブックが閉じられようとしています。" End Sub
Sub Auto_Close() MsgBox "ブックが閉じられようとしています。" End Sub
違うところ
最も大きな違いは「引数:Cancel」の存在で、
BeforeCloseはこの引数を使って「やっぱり閉じるのをやめる」ことが出来ます。
例えば「未保存だった場合は閉じるのを中止する」機能を作りたいときは、
Workbook_BeforeCloseを使って以下のようにコードを記述できます。
Private Sub Workbook_BeforeClose(Cancel as Boolean) If ThisWorkbook.Saved = False Then MsgBox "未保存のためブックを閉じれませんでした。" Cancel = True End If End Sub
この「ブックを閉じるのを中止する」機能はAuto_Closeにはありません。
その他の違いとしては、まずコードを記載するところが違います。
Workbook_BeforeCloseはイベントプロシージャであるため、
ThisWorkbookモジュールに記載する必要があります。
対してAuto_Closeプロシージャは特殊な(昔の)機能で、
標準モジュール内に記載しないと動きません。
(ThisWorkbookモジュールでは動かない)
続いての違いは「マクロからブックを開いたときの挙動」で、
Workbook_BeforeCloseはマクロから開いても実行されるのに対し、
Auto_Closeはマクロから開いた場合は実行されません。
' Workbook_BeforeCloseは実行されるがAuto_Closeは実行されない。 マクロ記載ブック.Close False
最後は「両方とも記載した場合の挙動」で、
両方記載した場合はまずWorkbook_BeforeCloseが先に実行され、
その後にAuto_Closeが実行されます。
使い分け
基本的にWorkbook_BeforeCloseを使用しておけばOKです。
引数Cancelの存在があってほぼ上位互換といってよいですし、
「他のイベントプロシージャ同様ThisWorkbookにある」という点で、
コードの読みやすさや管理しやすさもBeforeCloseに軍配が上がります。
Auto_Closeを使用するのは、
- マクロからブックを閉じた場合は発火しないイベントを実装したい
- 標準モジュールで作るライブラリ・アドインの一部に組み込みたい
あたりの特殊な仕様を実装したいときだけと捉えておけばOKです。