ExcelVBA 別Bookのイベントの取得の仕方
アドイン創るに当たって、WorkSheetやWorkBookのイベントを取得するにはWithEventsを使わなきゃいけないことを理解。
サンプルコードまんま打ち込んでたんで、今まで使っていながらも理解してませんでしたよ〜。
アドインならWorkBookに書けばそれぞれのシートに反映されるのかと思いきや、アドインってそういう扱いじゃないんですね。
設定の仕方とか「アドイン」という言葉から、Excel自体に機能を追加するのかと思いきや、実行のされ方は普通にそのBookを開いているのと同じっぽいです。
たとえばイベントの呼び出しでも、Worokbook_openだったら、ただ単にアドインに書いただけではExcelを起動したとき(=そのアドインを読み込んだ時)のみにしか呼ばれません。
これらを解決するのが「WithEvents」ステートメント。
これは主にクラスモジュールで使うステートメントらしく、まずはクラスモジュールに
Public WithEvents App As Application Private Sub App_WorkbookOpen(ByVal Wb As Workbook) 'すべてのBookのOpenに対して、ココが呼ばれます。 End Sub
として、
Private X As New EventClassModule Private Sub Workbook_Open() Set X.App = Application End Sub
とすれば全てのBookに対してイベントの取得ができます。
Cライクな言語を使ってきた者としては、「App_WorkbookOpen」というアンダーバーで繋げたサブルーチンの名称で判定しているのが、なんとも不思議な感覚……。