データの入ったExcelブック(ファイル)と機能モジュールを切り分ける。

このページの最初でも説明したように、マクロでの仕組みを実装したExcelワークブックは多くの配布先で運用が始まってからマクロだけを入れ替えることが手間となります。このためマクロ部分をできるだけアドインに実装させて、データが登録されるワークブックとは分離させるようにします。
データが登録されるワークブック側のマクロ記述を100%削除することはできませんが、アドイン側のプロシージャを呼び出す単純なものにすることで事後の修正の対象になることを防ぐようにします。分けるポイントは以下のようになります。

種別 ページ イベント 登録する内容
ワークブック This
Workbook
Workbook_
Open
①アドインを読み取り専用で開く。同じExcel上で既に他のワークブックから同じアドインが開かれている場合はエラーとなるが、この場合は無視して②に進む。
②アドインの初期処理を呼ぶ。
Workbook_
BeforeClose
①非保存確認はExcelまかせにせずここで行ない、キャンセル時はCancel=Trueとする。
②アドインの「終了処理」を呼ぶ。
③開いているワークブックが複数の場合で、同じアドインで処理を行なっている場合は④は行なわない。
④アドインを閉じる。
Workbook_
WindowActivate
同時に複数のワークブックが開かれていて、他のブックから本ブックにウィンドウが切り替わる時のイベント。
ツールバーの処理を行なっている場合は、アドインの「ツールバー制御処理」を呼ぶ。ツールバーの表示/非表示もこのアドイン側処理内で行なう。
Workbook_
WindowDeactivate
同時に複数のワークブックが開かれていて、本ブックから他のブックにウィンドウが切り替わる時のイベント。
ツールバーの処理を行なっている場合は、アドインの「ツールバー制御処理」を呼ぶ。ツールバーを非表示にする。
Workbook_
SheetActivate
本ブック内でワークシートが切り替わる時のイベント。
ツールバーの処理を行なっている場合は、アドインの「ツールバー制御処理」を呼ぶ。ここではActiveとなるシートに合わせてEnabled,Visible等のコントロールを行なうのが目的。
その他イベント 「印刷前」「保存前」「再計算」など有益なイベントがある。
必要に応じて記述するが、全てアドイン側の対応するプロシージャを呼び出すようにする。
Sheet 各イベント シート内のセルの選択位置の変化やセルの値の変化等のイベント。
必要に応じて記述するが、全てアドイン側の対応するプロシージャを呼び出すようにする。
アドイン 標準モジュール ①ワークブック側から呼び出されるプロシージャはPublicで記述する。この場合、ワークブック名を引数にすると、アドイン側で処理対象のワークブックが特定できる。
②それ以外のサブプロシージャは極力Privateで記述する。Publicで記述する場合は不要でも引数をダミーで用意しておくこと(「マクロの起動」に表示させないため)。
UserFormやクラスモジュール 必要に応じて利用する。
ThisworkbookSheet イベント記述は全く使用しない。
※アドイン側のワークシートはExcel上でウィンドウ表示されませんが、アドイン側のマクロ記述からはアクセス可能です。
ワークブック、ワークシート、ウィンドウなどのイベントが発生して起動される処理については、上記のようにワークブック側にプロシージャを実装させて、そのプロシージャからアドイン側のプロシージャを呼び出します。
呼び出し方が確立してしまえば記述は1様式なので、新しい仕組みのワークブック・アドインを新規作成する場合にもそのまま転用できます。

一方、イベントからの起動ではなく、操作運用する人(オペレータ)が任意にマクロを起動したい場合はどのようにするのでしょう。
メニューバーの
「ツール」の「マクロ」から
直接起動する。
アドイン側のプロシージャは「マクロ」のウィンドウに表示されないので、ワークブック側にアドイン内のプロシージャを呼び出すだけの記述を入れたプロシージャを用意しておく。
ワークシート内に
起動用の「ボタン」を
貼り付けて起動する。
上記同様にボタンから起動されるプロシージャを用意し、そのプロシージャからアドイン内のプロシージャを呼び出す。
ワークブック起動時に
この仕組み専用の
ツールバーを表示させ、
その上のボタンから起動する。
ワークブック起動時(Workbook_OpenAuto_Open)に呼び出されるアドイン側プロシージャでカスタムツールバーを追加させる。ここで追加したツールバーのボタン等からの起動プロシージャは同じアドイン内にある(Privateスコープで良い)ため、ワークブック側に起動用プロシージャを置く必要がありません。別ページの「アドイン動作のサンプル」はこの方法です。
動的に配置・撤去させることや、複数の同機能のワークブックが同時に開かれるケースに対応するためにそれぞれのワークブック毎にツールバーを別名称で作成したりするので、 リボンに直接タブを作って操作させることはできませんが、ツールバー作成時にアドインタブを選択させることはできるようになりました。
これらのような方式が考えられます。
もうお解りだと思いますが、最後のツールバー方式ならワークブック側に起動の仕組みを用意する必要がないので、後から機能改変の必要が発生してもワークブック側の記述を変更することなく進めることができます。

このように、ワークブック側に実装させるマクロはイベントプロシージャのみで、そこからアドイン側のプロシージャを呼び出し、以後はアドイン側の処理記述で各種処理を行なうのが良いでしょう。ワークブック側のマクロは記述が画一化でき、修正の影響を受けにくくなるばかりではなく、新たな仕組みを作成する時に転用が簡単になります。これ以降の章で、ワークブックとアドインの関係をサンプルを使って説明していきます。