#15_4 アプリケーションのイベント
アプリケーションに関するイベントの種類
イベントマクロの最後はアプリケーションに関するイベントです。これもブックやシートと同じくオブジェクトとして扱われます。
アプリケーションとはExcelのことで、ブックのさらに親のオブジェクトということになります。
ここまで理解できれば完全に上級者です。
Applicationオブジェクト
| イベント | イベントの発生時期 |
|---|---|
| AfterCalculate | 計算が完了した時に発生 |
| NewWorkbook | 新しいブックを作成した時発生 |
| ProtectedViewWindowActivate | [保護されたビュー]のウィンドウがアクティブになった時に発生 |
| ProtectedViewWindowBeforeClose | [保護されたビュー]のウィンドウが閉じる時に発生 |
| ProtectedViewWindowBeforeEdit | [保護されたビュー]のウィンドウでブックの編集が有効になった時に発生 |
| ProtectedViewWindowDeactivate | [保護されたビュー]のウィンドウが非アクティブになった時に発生 |
| ProtectedViewWindowOpen | [保護されたビュー]のウィンドウでブックを開いた時に発生 |
| ProtectedViewWindowResize | [保護されたビュー]のウィンドウの差異ぞを変更した時に発生 |
| SheetActivate | シートがアクティブになった時に発生 |
| SheetBeforeDelete | シートが削除される前に発生 |
| SheetBeforeDoubleClick | シートをダブルクリックした時に発生 |
| SheetBeforeRightClick | シートを右クリックした時に発生 |
| SheetCalculate | 再計算した時に発生 |
| SheetChange | セルの値が変更された時に発生 |
| SheetDeactivate | シートが非アクティブになった時に発生 |
| SheetFollowHyperlink | シート上のハイパーリンクをクリックした時に発生 |
| SheetLensGalleryRenderComplete | シートの引き出し線ギャラリーの表示が完了した後に発生 |
| SheetPivotTableAfterValueChange | ピボットテーブル内のセル範囲が編集された後に発生(再計算後でも発生) |
| SheetPivotTableBeforeAllocateChanges | ピボットテーブルが変更される前に発生 |
| SheetPivotTableBeforeCommitChanges | ピボットテーブルのOLAPデータが変更される前に発生 |
| SheetPivotTableBeforeDiscardChanges | ピボットテーブルの変更が破棄される前に発生 |
| SheetPivotTableChangeSync | ピボットテーブルが変更された後に発生 |
| SheetPivotTableUpdate | ピボットテーブルレポートのシートが更新された後に発生 |
| SheetSelectionChange | シートで選択範囲を変更した後に発生 |
| SheetTableUpdate | シートテーブルが更新された後に発生 |
| WindowActivate | ウィンドウがアクティブになった時に発生 |
| WindowDeactivate | ウィンドウが非アクティブになった時に発生 |
| WindowResize | ウィンドウサイズを変更した時に発生 |
| WorkbookActivate | ブックがアクティブになった時に発生 |
| WorkbookAddinInstall | ブックがアドインとして組み込まれた時発生 |
| WorkbookAddinUninstall | ブックのアドイン組み込みを解除した時発生 |
| WorkbookAfterSave | ブックが保存された後に発生 |
| WorkbookAfterXmlExport | ブックをXMLデータファイルにエクスポートした後に発生 |
| WorkbookAfterXmlImport | XMLデータがブックにインポートされた後に発生 |
| WorkbookBeforeClose | ブックを閉じる前に発生 |
| WorkbookBeforePrint | ブックを印刷する前に発生 |
| WorkbookBeforeSave | ブックを保存する前に発生 |
| WorkbookBeforeXmlExport | ブックをxmlデータファイルにエクスポートする前に発生 |
| WorkbookBeforeXmlImport | XMLデータがブックにインポートされる前に発生 |
| WorkbookDeactivate | ブックが非アクティブになった時に発生 |
| WorkbookModelChange | Excelデータモデルが変更された後に発生 |
| WorkbookNewChart | 新しくグラフを作成した後に発生 |
| WorkbookNewSheet | 新しくシートを作成した後に発生 |
| WorkbookOpen | ブックを開いた時に発生 |
| WorkbookPivotTableCloseConnection | ピボットテーブルレポート接続が閉じた後に発生 |
| WorkbookPivotTableOpenConnection | ピボットテーブルレポート接続が開いた後に発生 |
| WorkbookRowsetComplete | OLAPピボットテーブルに対する行セットアクションを呼び出した後に発生 |
アプリケーションのイベントマクロ
これまでExcel VBAには3種類のモジュールが出てきました。ほとんどのマクロを記述することのできる「標準モジュール」、数々のコントロールを配置することのできる「ユーザーフォーム」。さらに本章で解説してきたイベントマクロを記述する「オブジェクトモジュール」。
Applicationオブジェクトに関するイベントマクロを作成するのはこのいずれでもありません。実はVBAにはもう一つ「クラスモジュール」というモジュールが存在し、Applicationオブジェクトのイベントマクロはこのクラスモジュールに記述します。
ではApplicationの既定イベントであるNewWorkbookイベントについて実例で解説していきます。
Newworkbookイベントから始めよう
まず、下記のようにクラスモジュールを挿入しましょう





ここで、変数の宣言ステートメントを見てみると
Public WithEvents App As Application
と記載されています。これはApplication型のオブジェクト変数Appを定義していることを意味します。WithEventsキーワードはイベントを検知することのできる特殊な変数(この場合はApp)を定義するときに必要なキーワードです。WithEventsキーワードはクラスモジュールでのみ使用できます。
では[オブジェクト]ボックスで「App」を選択し、[プロシージャ]ボックスで「NewWorkbook」を選択しましょう。そのイベントマクロの中に、以下のように記述してください。

さて、これで終わりと言いたいのですが、実はApplicationオブジェクトのイベントマクロはまだ完成ではありません。
今作成したのは「クラス」と呼ばれる「オブジェクトの雛形」です。この「クラス」から「インスタンス」を生成するためのマクロを作成する必要があります。(クラスとインスタンスについては後述しますが、タコ焼き機とタコ焼きの関係と同じです。)
ではインスタンス生成のためのマクロを、標準モジュールを挿入して以下のように作成してください。



クラスとインスタンスはタコ焼きと同じ
改めてクラスとインスタンスについて解説します。クラスとは上記の通り、「オブジェクトの雛形」です。さて、皆さんきっと疑問に思っているはずです。最初にクラスモジュールに記述した変数とイベントだけでマクロはなぜ完成ではないのかと。今までならその手順で完成だったはずだと。
その理由はクラスモジュールに記述した変数宣言部にあります。
Public WithEvents App As Application
ここで定義されたAppは厳密ではオブジェクト変数ではないのです。標準モジュールであればこの宣言ステートメントによって、変数「App」はApplicationの意味のオブジェクト変数となりますが、クラスモジュールの場合、変数「App」はオブジェクトではなく「オブジェクトの雛形」になるのです。したがって、クラスモジュールだけでは十分な動作をしないのです。
私たちがオブジェクトとして活用できるのは、あくまでオブジェクトの雛形から作られた本当のオブジェクト(インスタンス)なのです。よくクラスとインスタンスはタコ焼き機とタコ焼きに例えられますが、私たちが食べるのはあくまでタコ焼きであって、タコ焼き機ではないですよね。それと同じ理屈です。
クラスモジュールでタコ焼き機を作った後は、標準モジュールという器を使って、「Newキーワード」という材料を流し込みます。その結果、インスタンスというタコ焼きが出来上がるのです。
さて、以上のまとめとして、もう一度先ほど作ったマクロを見てみましょう。


