Excelのイベント発生を抑止する

Application.EnableEventsプロパティはイベントの実行を抑止する設定です。イベント実行を無効にするコード

'Excelのイベントを抑止する
Application.EnableEvents = False
'Excelのイベント抑止の解除
Application.EnableEvents = True

Excelのイベント発生を抑止するには「Application.EnableEvents」プロパティ「False」を設定します

イベントとは、保存や印刷、セルの選択などユーザーのなんらかの動作に応じて自動的に発生するプロシージャです
このイベントに何らかの処理を作成した場合、他の処理を実行中でも対象の操作が発生すればイベント処理が実行されます

このプロパティを「False」にしておくことで、このイベントプロシージャの実行を抑止することが出来ます
抑止する場面は、ユーザーの操作ではなく処理中に行った処理での発生を抑止する目的で使用します

イベント抑止の使用場面

イベント作成時のコード
イベント作成時

まず、イベントを作成します
画像のようにシートのイベントにより、指定のシートのみで「UserForm1」を表示させたいのでこの様にActivateイベントではフォームの表示処理を実行します
Deactivateイベントではフォームを終了させます

このイベントはそれぞれ、シートがアクティブになったときと非アクティブになったときに発生するイベントです

ただ、この処理を作成したときに問題となるのはフォームの処理で別のシートのデータを扱ったりする場合にシートを移動させる必要があります
この時にフォームの処理中でありますが、シートが切り替えられた時点でDeactivateイベントが発生しフォームは強制終了されます

フォームが終了しても処理中はデータがメモリ上に保持されているため、入力することは出来ます
ただ、入力が完了して元のシートに戻ってきたときにActivateイベントが発生するためフォームが起動しますが、この時に表示されるデータは初期値になっています

入力をすると、コントロールのデータが全て初期リセットされるフォームになってしまいます、これは使い勝手最悪です

そこで使用するのがこのプロパティです
入力処理のシートを切り替える前に「False」に設定しておけばシート切替によるフォームの起動・終了が実行されなくなります

Excelのイベントを抑止するので、ブックイベントもシートイベントも実行されなくなりますので、使用後は必ず設定を解除しておきましょう

ただ、ユーザーフォームはExcelとは別のようでこの設定を行ってもイベントの実行は抑止されませんので注意が必要です
ユーザーフォームのイベントに対しては、フラグで抑止処理を自作する必要があります