Worksheet Changeが反応しなくなった時

エラー

はじめに

 イベントプロシージャのWorksheet_Changeは、セルの変更で発生するイベントになります。
 注意しなければならないのは、Worksheet_Change内で対象のセルを操作すると、Worksheet_Changeが再帰で呼び出される形になり無限ループとなってしまう点です。

 上記のようなエラーが出た場合は、Worksheet_Changeが再帰で呼び出されて無限ループになっている可能性が高いと言えます。

Worksheet_Changeの使い方

 Worksheet_Changeイベントプロシージャは、処理したいシートオブジェクトを開いて、上のタブからWorksheet、Changeを選択すると記述されます。

 引数のTargetに変更されたセルが入っています。
このセルの値に変更を加えると、再度、Worksheet_Changeイベントが発生して再帰呼び出しになってしまいます。

 再帰呼び出しの無限ループを避けるには、Application.EnableEvents プロパティでイベントの発生を一旦止めるようにします。
 Application.EnableEvents プロパティでイベントの発生を止めた後に、必要な処理をして、その後、元に戻すのが定石です。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address <> "$A$1" Then Exit Sub
    
    Application.EnableEvents = False    'イベントを無効化
    
    Target = Target.Text & "+@"
    
    Application.EnableEvents = True 'イベントを有効化

End Sub

 上のプログラムでは、まずTarget.Addressで変更されたセルがA1でない場合は、プログラムを終えるようにしています。
 いくつかのセルを対象としたい場合は、Intersect関数と良いでしょう。
 
セルの重なった部分を返す Intersect 

 続いて一旦イベント発生を無効にして、ターゲットのセルに”+@”とい文字列を追加しています。
 最後にイベント発生を有効にして終了します。

Worksheet Changeが反応しなくなるケース

 プログラム開発中に、エラーを挟んだりした時、その後の動作が反応しなくなることがあります。
 そのような場合は、一旦Excelを保存して終了し、再度立ち上げると直る場合があります。
 
 これは、イベント発生を有効にする前にプログラムを終了させてしまった場合に起こります。
 以下のような簡単なプログラムを用意しておいて、反応しなくなった時に実行してみるのも良いでしょう。

Sub myEvent()
    Application.EnableEvents = True 'イベントを有効化
End Sub

まとめ

 Worksheet_Changeを使用する場合は、再帰で呼び出されてしまう事を念頭においてプログラムする必要があります。
 プログラムを間違えると、無限ループなどの面倒なトラブルが起こるため、初心者はある程度プログラムに慣れてきてから使った方が良いでしょう。
 
 また、イベント内部で複雑な処理をすると動作が重くなることもあります。
 上手く使えるようになれば、便利なイベントですが使い方は少々厄介です。

コメント

タイトルとURLをコピーしました