このページの最初でも説明したように、マクロでの仕組みを実装した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やクラスモジュール | 必要に応じて利用する。 | ||
ThisworkbookやSheet | イベント記述は全く使用しない。 ※アドイン側のワークシートはExcel上でウィンドウ表示されませんが、アドイン側のマクロ記述からはアクセス可能です。 |
メニューバーの 「ツール」の「マクロ」から 直接起動する。 |
アドイン側のプロシージャは「マクロ」のウィンドウに表示されないので、ワークブック側にアドイン内のプロシージャを呼び出すだけの記述を入れたプロシージャを用意しておく。 |
ワークシート内に 起動用の「ボタン」を 貼り付けて起動する。 |
上記同様にボタンから起動されるプロシージャを用意し、そのプロシージャからアドイン内のプロシージャを呼び出す。 |
ワークブック起動時に この仕組み専用の ツールバーを表示させ、 その上のボタンから起動する。 |
ワークブック起動時(Workbook_OpenやAuto_Open)に呼び出されるアドイン側プロシージャでカスタムツールバーを追加させる。ここで追加したツールバーのボタン等からの起動プロシージャは同じアドイン内にある(Privateスコープで良い)ため、ワークブック側に起動用プロシージャを置く必要がありません。別ページの「アドイン動作のサンプル」はこの方法です。 動的に配置・撤去させることや、複数の同機能のワークブックが同時に開かれるケースに対応するためにそれぞれのワークブック毎にツールバーを別名称で作成したりするので、 リボンに直接タブを作って操作させることはできませんが、ツールバー作成時にアドインタブを選択させることはできるようになりました。 |