|    | 
     ▼隼 さん: 
 
おはようございます 
 
実は、今回、差し上げたコードでは、 
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 とタイプしてエンターしても復旧します。 
 | 
     
    
   |