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