|
▼BON8021 さん 今日は
【28616】の問いは解決されたと読みました。もしそうでないなら、また連絡してください。
>先程より無限ループ云々という質問をさせて頂きましたが、
>Application.EnableEvents = False
>〜
>Application.EnableEvents = True
>
>で〜にあったFor文内の無限ループが解消されました。
>
>上記文、どのような意味があるか教えてください。
Private Sub Worksheet_Change(ByVal Target As Range)
はChangeがあるようにチェンジイベントのプロージャ(Sub)です。
これは、ワークシート内のセルの値が変化したとき動くプロージャです。
たとえば、キーボードからセルの値を変えたとき、このプロージャは動きます。
また、VBAのコードでセルの値を変えたときも、このプロージャは動きます。
今回のコードでいうと、
mr = dicM(Cells(行, "A").Value & Cells(行, "K").Value)
If mr > 0 Then Cells(行, "M").Resize(, 2).Value = _
Sheets("Sheet2").Cells(mr, "M").Resize(, 2).Value
この部分はセルの値を変えていますので、この変化に対して、チェンジイベントが発生して、
Private Sub Worksheet_Changeをまた実行しようとします。
そうすると、このコードよって同じコードを繰り返し、無限ループが発生するようになります。
この無限ループを避けるために、
Application.EnableEvents = False
mr = dicM(Cells(行, "A").Value & Cells(行, "K").Value)
If mr > 0 Then Cells(行, "M").Resize(, 2).Value = _
Sheets("Sheet2").Cells(mr, "M").Resize(, 2).Value
Application.EnableEvents = True
とします。
こうすると、
Application.EnableEvents = False
〜
Application.EnableEvents = True
の間のコードによって値が変化してもの、チェンジイベントが発生しないようにるわけです。
Application.EnableEvents = False
によって、コードによって値が変化してもの、チェンジイベントが発生しないようにしています。
しかし、このまま放っておくと、Private Sub Worksheet_Changeが、それ以降全く動かなくなり
ますので、チェンジイベントを発生させたくない部分が終わったところで、
Application.EnableEvents = True
を宣言して、チェンジイベントを発生させるようにします。
詳しくはEnableEventsをヘルプで調べてみてください。
Private Sub Worksheet_Changeなどのチェンジイベントはすごい能力を持っていますが、
今回のように無限ループに入ることがあるので、扱いが難しい面もありますので気をつけ
てください。
|
|