Application.EnableEventsとはどんな機能なのか??
例えば
Application.EnableEvents = Falseにしたらどうなるのか??
簡単に言うとに今まで気にせずに動かしていた体の一部が動かなくなること
要するに強制的に挙動を止められます。
VBE画面のChangeイベントで説明したいと思います。
※Changeイベントはシート上でセルを選択したり、セル内を変更したときのイベント
シートモジュールにWorksheet_Changeというプロシージャを用意した場合、
シート上のセルが変化するたびに、プロシージャが呼び出されます。
試しにVBE画面からA1セルに1という数字を書き込むプログラムを組んでみます。
VBE画面(Changeイベント)
次にブレークポイントを設定します。
ブレークポイントのつけ方は下記の赤枠部分を左クリック
次はエクセルシート内の任意の場所に文字を打ち込んでみます。
VBE画面をみると処理がブレークポイントで止まっているはずなのでF8を何度も押してみてください。
恐らく何度も1を代入していると思います。
シートモジュールより、Application.EnableEvents = Trueの場合(デフォルトはTrue)
イメージ
上記のイメージのように無限に処理が繰り返されます。
無限ループを避けるため、
シートモジュール上のプロシージャを呼び出す契機となるイベントを、
一旦止める必要があります。
そう、ここでApplication.EnableEventsです。
Application.EnableEvents = Falseにすることによって処理が止められます。
シートモジュールより、Application.EnableEvents = Falseの場合
イメージ
これで無限ループを回避できます!
ではApplication.EnableEvents をソースに追加してもう一度実行してみてください。
ソース
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Range(“A1”).Value = 1
Application.EnableEvents = True
End Sub
きっと今回は無限ループせずにうまくいくはずです!!
再びApplication.EnableEvents = Trueとしているのはデフォルトの状態に戻しているだけです。
Falseの状態のままだとプロシージャが呼び出せないので・・・
今回は無限ループをを例にApplication.EnableEventsの説明をさせていただきました。
こんにちは
加納と申します。
そのソースはどのイベントでも効くのでしょうか。
フォームの コンボボックスを記入後コンボボックスの Worksheet_Changeで プロシージャを呼び出さしてApplication.EnableEvents = Falseををソースに追加して処理をおこない、そのあとMe.ComboBox1.Value=””でコンポボックスをクリアすると再びプロシージャを呼び出さしているのですが、どうしてだろうか。
Private Sub ComboBox2_Change()
Application.EnableEvents = False
Dim i As Integer
For i = 1 To 8
UserForm1(“TextBox” & i).Value = _
Worksheets(“sheet1”).Cells(Me.ComboBox2.ListIndex + 2, i).Value
Next i
Me.ComboBox2.Value = “”
Application.EnableEvents = True
End Sub
解決よろしくお願いします。