[ Excel-VBA ] Worksheet_Change イベントを無効にして処理を高速化する(Application.EnableEvents)

Pocket

ここでは、Excel-VBA の Worksheet_Change イベントを発生させないように抑制するサンプルを掲載しています。

スポンサーリンク

Worksheet_Change イベント

名前の通り、ワークシート上の値に変化があった場合に発生するイベントです。

インターフェース

次のインタフェースを持ち、変更された箇所がパラメータとして渡されます。

' 変更された場所が引数で渡される
Sub Worksheet_Change(ByVal Target As Range)

大量の変更があった場合

多くの変更があると、当然その変更分だけイベントが発生します。そのせいで、処理に時間がかかり終わらない、または変更の連鎖による無限ループが発生することがあります。

特に、手動での入力や変更時のみにイベントを発生させることを想定している場合には、このイベントを抑制する必要があります。

イベントを抑制する

VBA でこのイベントを抑制させるには、次のようにします。

Application.EnableEvents = False 'イベント抑制する

・・・  何か処理(この間、Worksheet_Change イベントは発生しない)

Application.EnableEvents = True 'イベントの発生を再開する

その他の高速化関連の設定

Application.EnableEvents 以外では、次のような高速化の手法に使用される設定には次のようなものがあります。

    ' 高速化が期待できる設定
    With Application
        .ScreenUpdating = False             ' 描画の更新を抑制する
        .Calculation = xlCalculationManual  ' セル値の手動計算
    End With

    ' 元に戻す
    With Application
        .ScreenUpdating = True                ' 描画の更新を行う
        .Calculation = xlCalculationAutomatic ' セル値の自動計算
    End With

最近暑くて、脂肪が溶けそうです。おっ、別にいいんじゃないかい?

スポンサーリンク


Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>