|
▼いのっち さん:
暴走する理由は、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増えて終わりになるはずです。
|
|