Attribute VB_Name = "Module1" '■ マクロ500連発<第2段> ' ' クラスモジュールを利用する (2) WorkbookBeforeCloseイベント ' ' Copyright(C) 2000 Sunago ' ' Applicationレベルのイベントは次のものが用意されています。 ' ' WindowActivate(ByVal Wb As Excel.Workbook, ByVal Wn As Excel.Window) ' WindowDeactivate(ByVal Wb As Excel.Workbook, ByVal Wn As Excel.Window) ' WindowResize(ByVal Wb As Excel.Workbook, ByVal Wn As Excel.Window) ' WorkbookActivate(ByVal Wb As Excel.Workbook) ' WorkbookAddinInstall(ByVal Wb As Excel.Workbook) ' WorkbookAddinUninstall(ByVal Wb As Excel.Workbook) ' WorkbookBeforeClose(ByVal Wb As Excel.Workbook, Cancel As Boolean) ' WorkbookBeforePrint(ByVal Wb As Excel.Workbook, Cancel As Boolean) ' WorkbookBeforeSave(ByVal Wb As Excel.Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean) ' WorkbookDeactivate(ByVal Wb As Excel.Workbook) ' WorkbookNewSheet(ByVal Wb As Excel.Workbook, ByVal Sh As Object) ' WorkbookOpen(ByVal Wb As Excel.Workbook) ' Option Explicit 'クラス変数の定義 'Newキーワードを使ってクラスモジュールのオブジェクト名を定義します。 Public x As New Class1 Sub Macro1() Set x.App = Application 'イベント動作確認のため、新規ブックを追加し、閉じる Workbooks.Add Range("A1") = "New Book" 'ブック終了時、Excelのメッセージではなく、 'カスタムメッセージが表示される ActiveWorkbook.Close End Sub Attribute VB_Name = "Class1" ' ' Excel(Application)オブジェクトのイベントを外部に対する処理を ' 行うためにプロパティ変数を定義します。WithEventsキーワードを ' 使って定義するとイベントプロシージャを利用することができます。 ' このプロパティ変数は外部に対し公開するためにPublic変数として ' 定義しますが、クラス内だけで用いる場合はPrivate変数で定義します。 ' ただし、標準モジュールからPrivate変数へはアクセスできないため、 ' プロパティ変数はオブジェクトへの参照を設定することができません。 ' その場合は、Classのイベントプロシージャを用いて作成することに ' なります。 ' ※WithEventsキーワードを用いると、New Applicationのように記述 ' できないために実行時にオブジェクトへの参照を設定する必要がある ' のです ' Public WithEvents App As Application Private Sub App_WorkbookBeforeClose(ByVal Wb As Excel.Workbook, Cancel As Boolean) Dim ret If Not Wb.Saved Then ret = MsgBox(Wb.Name & "は変更されています" & vbCr & _ "保存しますか", vbYesNoCancel, "カスタムメッセージ") If ret = vbYes Then Wb.Save ElseIf ret = vbNo Then Wb.Saved = True Else Cancel = True End If End If End Sub