Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10570 / 76734 ←次へ | 前へ→

【71710】Re:なぜでしょうか
発言  UO3  - 12/4/1(日) 7:39 -

引用なし
パスワード
   ▼隼 さん:

おはようございます

実は、今回、差し上げたコードでは、
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 とタイプしてエンターしても復旧します。

8 hits

【71700】なぜでしょうか 12/3/31(土) 11:26 質問
【71704】Re:なぜでしょうか UO3 12/3/31(土) 16:01 回答
【71708】Re:なぜでしょうか 12/4/1(日) 6:29 お礼
【71710】Re:なぜでしょうか UO3 12/4/1(日) 7:39 発言
【71711】Re:なぜでしょうか 12/4/1(日) 8:07 お礼

10570 / 76734 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free