Excelイベントの作成・使用方法についてと使用時コード。イベントの中でも特殊なものです
コードコピー 'Excelのアプリを代入する変数、イベント作成が可能
Dim WithEvents エクセル As Excel.Application
コードコピー '変数とExcelの紐付け(イベントが発生する)
Set エクセル = Excel.Application
コードコピー '紐付けの解除(イベントは発生しない)
Set エクセル = Nothing
Excelオブジェクトの作成
Excelイベントを作成するには、Excel自体をまずオブジェクトとして作成を行う 必要があります これには、1つ目のコードをオブジェクトモジュール内の最上部に挿入する だけで可能です
コードコピー 'Excelのアプリを代入する変数、イベント作成が可能
Dim WithEvents エクセル As Excel.Application
このコードを入れたモジュール内では、オブジェクトボックスに変数名が表示されます それがExcelのオブジェクトになります これは処理を実行しなくても、この変数名のオブジェクトは使用可能ですコードを入力した時点で使用可能になっています
オブジェクトが作成されている状態
ここで使用しているWithEventsキーワード は、変数でイベントの作成を行うことが出来るようにするステートメントです このステートメントは、オブジェクトモジュール内でしか使用できません オブジェクトモジュールとは、要は標準モジュール以外の全てになります
コーディング時点でエラーが発生するので、エラーが発生しないモジュールに移動してもらえばいいです
基本的には、ThisWorkbookかUserForm内に作成すればいいです 元々はクラスモジュールで、コントロールなどを動的作成する際に使用するもので、多くはクラスモジュールで使用されますが、このステートメント自体がクラスモジュール内限定のものでは無いので、使用するモジュール内で良いと思います
イベントの作成と変数の紐付け
イベントの作成に関しては、通常のイベント作成と同様 に行えます イベント名も引数も全て自動的に作成されます
イベントの作成
画像の様にオブジェクトボックスから選んだ時点で既定のイベントが作成されますので、違うイベントを作成したい場合は通常通りです
さらに、もう一つ作業が必要になります それが紐付け作業 です
コードコピー '変数とExcelの紐付け(イベントが発生する)
Set エクセル = Excel.Application
このコードを実行する事で、変数のExcelとコードを実行したExcelが紐付けられます これ以降、この紐付けたExcelで作成したイベントが実行されるようになります
基本的には、WorkbookイベントのOpenイベントであったり、UserFormのInitializeイベントの初期イベントで実行しておきます 動きは後述します
コードコピー '紐付けの解除(イベントは発生しない)
Set エクセル = Nothing
そして、この紐付けを解除するには変数を初期化 します このコードを実行する事で、以降はExcelのイベントは発生しなくなります
オブジェクト変数なので、この解除(解放)までをセットで使用するようにしてください
基本的には、WorkbookのCloseイベントやUserFormのTerminateイベントの終了イベントで実行するようにします
イベント発生時の動き
上記のコードで紐付けが完了したら、イベントが発生するようになります 実際に動きを確認してみましょう
Private Sub エクセル_NewWorkbook(ByVal Wb As Workbook)
MsgBox Wb.Name
End Sub
-------------------------------------------------------------------------
Private Sub Workbook_Activate()
'変数とExcelの紐付け(イベントが発生する)
Set エクセル = Excel.Application
End Sub
-------------------------------------------------------------------------
Private Sub Workbook_Deactivate()
'紐付けの解除(イベントは発生しない)
Set エクセル = Nothing
End Sub
今回の例では上記のようなコードを作成しています Workbookイベントで、アクティブになったら紐付けして、非アクティブになったら紐付けを解除します このブックでしか、イベントが発生しないような作りです
イベントは、新規ブック作成時に発生するイベントです 内容はそのブック名をメッセージ表示します
イベントが発生する動き
まずは、新規作成によりイベントが発生している動きです コード実行ブックで、新規作成を行う事で新規作成された「Book1」の名前がメッセージに表示 されます
紐付けが解除されている動き
次に、そのBook1でさらに新規作成を行った時の動きです
ここではイベントが発生していません 元々コードの実行されていたブックが、Book1作成時点で非アクティブになったためExcelの紐付けが解除されたため です
再度紐付けされた動き
最後に、また元のブックに戻って再度新規作成を実行します 今回はメッセージが表示されました
元のブックがアクティブ状態になったことで、また紐付けが行われたため イベントが発生するようになりました 今回はBook3のメッセージが表示されました
Excelイベントの使用について
上記の通りに、Excelのイベントを作成して実行できます
例で挙げたような、新規作成ブックの名前を表示する処理は非常に単純な処理ですが、これをイベントを使用せずにする場合はいろいろな事を考慮して作成する必要があり面倒です
イベントを使用すれば、作成したブックが引数としてオブジェクトに取得される ため、その後の新規作成ブックに対する処理が非常に簡単に行えるようになります
また、このExcelイベントの強力な利点 は、Excel自体のイベントプロシージャの作成をマクロブックに行うことで、そのマクロブックを開いて紐付けをしておけば、マクロ無しの標準ブックであってもイベント処理を実行することが出来る点 です もちろんイベントではなく、通常の処理であればブックを指定すれば可能 です
会社の規定などにより、マクロ有効ブックが作成できない場合があります とはいえ、入力処理などが面倒でイベント処理で楽にできればええなぁと感じることはあります
そんな時に、このExcelイベントの出番になります これは同じExcelアプリで開くブック全てに対して有効なイベント なので、シートのセルをダブルクリックするイベントなどを標準形式保存のマクロ無しブックでも実行する事が出来るようになります
SheetBeforeDoubleClickイベント は、シートのセルをダブルクリックすると発生するイベントです このイベントに処理を作成すれば、Excelで開いているブック全てに同じイベント処理を実行する事ができます
WorkbookOpenイベント を利用すれば、ブックのOpenイベントも必要ありません
考えれば考えるほど、応用力があるイベントになります あんなことや、こんなこと・・・えぇっ!?そんなことまでっ!!? とは、まさにこのことです
ただ、イベント特有の注意点が便利なほど重要になってきます 全てのブックに適用されて、なおかつ紐付けが解除されるまで無条件で発動し続けるイベントになるので非常に要注意です
基本的には、このイベントでしか実現できない処理にだけ使用します Workbook以下のイベントで対応できるものを作成する事だけは止めておきましょう