| 
    
     |  | ▼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 とタイプしてエンターしても復旧します。
 
 |  |