例えば、ブックを閉じるボタン「×」をクリックすると、変更させれている場合は、「○○○.xlsへの変更を保存しますか?」というメッセージが表示されます。このとき、[キャンセル]ボタンがクリックされたことを判断するには、次のような方法があります。
○
まず、
Public myFlag As Boolean
のようなグローバル変数を定義して、念の為にFalseをどこかで代入して初期化しておきます。そして、ブックが閉じるときに実行される次のイベントプロシージャを作成します。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
myFlag = True
End Sub
この場合、ブックが閉じられればそれで問題ありませんが、キャンセルボタンが押されてブックが閉じられなかった時にはmyFlagにはTrueが格納されたまま残ります。つまり、このmyFlagがTrueのときには、ユーザーがブックを閉じようとしたけれどやっぱりやめたというように判断が可能です。
○
[×]ボタンでExcelを終了するイベントはApplicationオブジェクトのWorkbookBeforeCloseイベントを利用します。この方法だと、マクロがないブックで×ボタンをクリックされた場合にも対処できますが、使い方はちょっとむずかしいです。
MSサポートの[XL97]Excel 97 のイベントについて
http://www.microsoft.com/mscorp/worldwide/japan/support/kb/articles/j028/5/63.htm
にイベントに関する情報があります。
具体的にはつぎのようなコードになります。
・標準モジュール
Dim X As New Class1
Sub InitializeApp()
Set X.App = Application
End Sub
・クラスモジュール(Class1)
Public WithEvents App As Application
Private Sub App_WorkbookBeforeClose _
(ByVal Wb As Excel.Workbook, Cancel As Boolean)
:(ここに処理を記述します)
End Sub
注意しなければならないのは、変数Xが有効な間しかイベントを取得できないということです。エラー発生などで変数が破棄されるとイベントが取得できなくなります。