トップページ

#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キーワード」という材料を流し込みます。その結果、インスタンスというタコ焼きが出来上がるのです。

さて、以上のまとめとして、もう一度先ほど作ったマクロを見てみましょう。