|
▼UO3 さん:
分かりやすい解説を、ありがとうございます。
感謝いたします。
>▼隼 さん:
>
>おはようございます
>
>実は、今回、差し上げたコードでは、
>Application.EnableEvents = False
>Application.EnableEvents = True
>この処理はしなくても(たまたま)OKです。
>ただ、以下に説明しますが、Worksheet_Change を使う場合は、
>「お約束」のような感じで、処理前に False、処理後に「必ず」True にするような
>コードを書くことを、強く強く推奨します。
>
>
>Private Sub Worksheet_Change(ByVal Target As Range)
>
> さまざまな処理1
> さまざまな処理2
>
> ★シート状のセルの値の変更
>
> さまざまな処理3
> さまざまな処理4
>
>End Sub
>
>こんなコードだとします。
>そうしますと、★のコードを実行したとたんに、またChangeイベントが発生し
>VBAは、その下の、さまざまな処理3 を実行する前に、変更されたセルを対象にして、
>「新たに」このWorksheet_Changeに入ってきます。
>で、また★を実行して、「新たに」・・
>
>永久に、さまざまな処理3 にはいかず、さまざまな処理1 〜 ★ の間を
>ぐるぐる回り続けます。これをイベントの連鎖といいます。
>これを回避するために、★の実行前に、エクセルによるイベントの検知機能を止め
>★が終わった後、イベント検知機能を復活させます。
>
>注意しなければいけないのは、さまざまな処理3 以降で、エラーで中断したり
>あるいは、ロジックの不備で、Application.EnableEvents = True が実行されなかった場合。
>もう、エクセルは、ずっとイベント検知をしないままですので、そのあとセルを変更しても
>うんともすんとも言わなくなります。
>
>このような状態になった場合、
>・エクセルを終了して、再度立ち上げると復旧します。
>・Application.EnableEvents = True を実行します。
> これは、この1行だけの臨時のマクロを標準モジュールに書いて実行させてもいいですし
> あるいはVBE画面で、表示->イミディエイトウィンドウ で下のほうにでてくるウィンドウで
> Application.EnableEvents = True とタイプしてエンターしても復旧します。
|
|