他グループ「イベント有効無効切替」の解説
- yuji fukami
- 10月28日
- 読了時間: 6分
更新日:6 日前
概要
書籍「Excel VBA開発を超効率化するプログラミングテクニック」の特典であるIkiKaiso2.xlamのリボン登録マクロの解説のための特設ページです。
出版社の書籍のページ⇒https://gihyo.jp/book/2024/978-4-297-14023-6
リボン登録マクロ全体解説ページ⇒https://www.softex-celware.com/post/ikikaiso2
本ページではIkiKaiso2.xlamの「ボタン設置」グループの「イベント有効無効切替」の解説をします。

解説
用途
イベント機能の有効/無効を切り替える。
イベント処理VBAコードの構築中に、一旦はイベントを無効にした状態にしたり、マクロ処理が途中で止まった関係でイベントが無効になってしまった状態を有効に戻すときに利用。
使い方
実際に使っている様子の動画を下記でご確認ください。
使い方は簡単で、イベントの有効/無効を切替が出来るようになっています。
動画ではイベント処理の例として、セルを選択するとそのセルのアドレスをメッセージで表示するようなイベントプロシージャを記述しています。
イベントが有効の状態だと、任意のセルを選択するとそのセルのアドレスがメッセージで表示されるのが分かりますが、イベントを無効に切り替えるとそのような処理は実行されなくなり、イベントが有効⇄無効の切り替えが出来ているのが確認できます。
「イベント有効⇄無効」の手動での設定方法
紹介しているリボン登録マクロの「イベント有効無効切替」を利用せずにイベントを有効化/無効化するには、VBEのイミディエイトウィンドウで下記の記述を行って実行します。
これを毎回記述するのは若干面倒ですので、リボン登録マクロの「イベント有効無効切替」をクリックするだけにしとくことで効率化が図れます。


コピー用のコードも下記で用意しておきます。
「イベント有効⇄無効」の切替が必要な場面
上記の「用途」でも少し触れましたが、イベントの有効⇄無効の切り替えが必要な場面について詳しく説明します。
場面①:何らかのマクロが完遂せずに途中で止まってしまいイベント処理が無効な状態になってしまった場合に、イベントを有効設定で復活させる
例えばVBAコードで次のようなプロシージャがよく記述されます。
シートへの出力等の処理の前にイベントを無効にして、処理を行ってから、イベントを有効に戻すようなもので、理由として次のようなものです。
セルの値を出力した時にイベントを発動してほしくない
イベントを無効にすることで処理を高速化する
このような処理が何らかの理由で途中で止まったり、デバッグで停止中にリセットして終了させてしまうとイベントは無効な状態が残ってしまいます。
この際にイベントを有効に戻すために「イベント有効無効切替」が便利に使えたりします。
場面②:特定のブックをイベントが起動時のイベントプロシージャを発動させずに起動する。
マクロ付ブックでThisWorkbookのコードウィンドウに「Workbook_Opon」のように起動時に発動するイベントプロシージャが記述してある場合は、そのマクロ付ブックを起動すると自動的にマクロが発動します。
この発動をさせないように起動させるには、先に別のブックを起動した状態でイベントを無効にしてから、対象のマクロ付ブックを起動するような手順が必要です。
場面③:イベントを無効にした状態でVBAを構築したい
イベントプロシージャはボタンのクリック等で特定のマクロを実行ではなく、セルの選択や、シートの切り替え時などで「意図せずに実行」してしまう危険性をはらんだ処理でもあります。このような危険性を排除した状態でVBAを構築したい時に、イベントを無効に切り替えておくと安心な時があります。
実際のコード
「イベント有効無効切替」に登録してあるマクロの解説と、それ以外の用途について説明します。
実際に登録してあるマクロのコードは次の通りです。
登録してあるマクロのプロシージャ名は「SetEventEnableForRibbon」で、その中で「SetEventEnable」を実行しています。
この「SetEventEnable」は「Enable強制」「Message」の2つの引数がありますが、今回の「イベント有効無効切替」での実行時ではそれぞれ
Enable強制 = False (強制的にイベントを有効にはしない)
Message = True (メッセージを表示する)
とデフォルト値に基づいて実行されます。
この引数の設定は別の用途のために用意されていて例えば
Enable強制 = True (強制的にイベントを有効にする)
Message = False (メッセージを表示しない)
として実行すれば「イベントは強制的に有効になって、メッセージは表示しない」ような処理となります。
これは何らかのマクロで「処理の前にイベントを有効にしておきたい」という場面で使用したりします。実際にそんなケースはそこまで経験ありません。
イベントを強制的に有効にするテクニック
今回紹介しているリボン登録マクロの「イベント有効無効切替」とは直接関係ありませんが、別のテクニックとして強制的にイベントを有効にするテクニックというのがあるのでここで紹介します。
上記の「イベント有効⇄無効」の切替が必要な場面でも場面①で説明しましたが、何らかのエラーで「イベントがいつの間にか無効に!?」ってことが起きたりします。もしユーザーが「イベント機能」を知らないでこのエラーが発生するとユーザーは、「急に正常に動作しなくなった!」と戸惑うことは必至です。
このようなことを避けるためにイベントを強制的に有効にするテクニックが便利になってきます。
具体的には次のようなプロシージャ「F_イベント有効化」を標準モジュールに用意しておきます。
次にどこかのセルで「F_イベント有効化()」をユーザー定義関数として利用します。
すると、このセルに記述した「F_イベント有効化」プロシージャは再計算時に自動的に実行されて、イベントが強制的に有効化されます。
ちなみに再計算時とは「どこかのセルを編集する」と自動的に発動するので、その発動を利用してイベントを有効化するというテクニックです。

もう一つちなみに説明すると、次のように「セル選択時に発動するイベントプロシージャ(Worksheet_SelectionChange)」でイベントを有効化しようとします。VBAに慣れた人はまずこれが思いつくかもしれません。
カラクリ上「セルを選択するだけでイベントが有効化できる!」と思うかもしれませんが、そもそもイベントが無効状態の場合だとイベントプロシージャは実行されないのでこの「Worksheet_SelectionChange」は実行されることはなく、残念ながらイベントは有効になりません。

紹介した「再計算」を利用する方法は、この抜け道を通るようなやり方です。


コメント