Excel VBA質問箱 IV

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

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


55244 / 76732 ←次へ | 前へ→

【26266】暴走の理由
発言  [名前なし]  - 05/6/29(水) 23:10 -

引用なし
パスワード
   ▼いのっち さん:
暴走する理由は、Changeイベントが何度も呼ばれてしまうためです。

>下記は正常動作しています。
>----------------------------------------------------------------------
>Private Sub Worksheet_Change(ByVal Target As Range)
>   
>Dim hen As integer
>
>hen = 7
>     Select Case ActiveSheet.Cells(hen, 4).Value
>      Case 1
>      ActiveSheet.Cells(hen, 5).Value = 1
>      
>      Case 2
>      ActiveSheet.Cells(hen, 5).Value = 2
>     
>      Case 3
>      ActiveSheet.Cells(hen, 5).Value = 3
>      
>      Case Else
>      ActiveSheet.Cells(hen, 5).Value = 0
>      
>    End Select
>   
>End Sub

「正常動作している」のではなく、「正常動作しているように見える」だけです。
シートモジュールに以下のコードを書いて、適当なセルに1を入力してみてください。

Private Sub Worksheet_Change(ByVal Target As Range)
  Range("A1").Value = Range("A1").Value + 1
End Sub

おそらくA1の値が200超くらいで止まると思いますが、このイベントが何度も呼ばれている
証拠です。なんで途中で止まるのかはよくわかりませんが・・・。
Changeイベントは、「あるセルの値を変更した時」に実行されます。これは、マクロで
値を変更しても例外ではありません。

>ところが、D7に1を入れた時、E7に1,F7を10にしたいようにマクロを修正しましたが、
>暴走してしまいます。

今度はChangeイベントを以下のように変更して、またどこかのセルの値を変更してみて
ください。

Private Sub Worksheet_Change(ByVal Target As Range)
  Range("A1").Value = Range("A1").Value + 1
  Range("A2").Value = Range("A2").Value + 1
End Sub

おそらくカウントアップが止まらなくなるので、途中でEscキーでキャンセルして
ください。

このように、マクロによるセルの値変更時にChangeイベントを発生するのを防ぐため
には、値を変更するコードの前に

Application.EnableEvents = False

の一行を追加します。ただし、このまま放置しておくとイベントが発生しないままなので、
値を変更するコードの後に

Application.EnableEvents = True

の一行を追加します。つまり、

Private Sub Worksheet_Change(ByVal Target As Range)
  Application.EnableEvents = False
  Range("A1").Value = Range("A1").Value + 1
  Range("A2").Value = Range("A2").Value + 1
  Application.EnableEvents = True
End Sub

のようになるわけです。
これで試してみてください。セルの値が1増えて終わりになるはずです。

1 hits

【26257】マクロの暴走について いのっち 05/6/29(水) 18:41 質問
【26259】Re:マクロの暴走について Kein 05/6/29(水) 19:18 回答
【26289】Re:マクロの暴走について いのっち 05/6/30(木) 16:30 発言
【26317】Re:マクロの暴走について Kein 05/7/1(金) 11:54 発言
【26328】Re:マクロの暴走について いのっち 05/7/1(金) 14:42 お礼
【26266】暴走の理由 [名前なし] 05/6/29(水) 23:10 発言
【26290】Re:暴走の理由 いのっち 05/6/30(木) 16:31 お礼
【26300】Re:暴走の理由 [名前なし] 05/6/30(木) 22:26 回答
【26307】Re:暴走の理由 いのっち 05/7/1(金) 9:43 お礼

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