web-dev-qa-db-ja.com

VBAワークシート変更イベントバイパス?

スプレッドシートを修正しています。プログラマーは、シートが変更されたときに起動する各シートのマクロを作成しました。これは、新しい情報が追加されたときにシートの詳細を色で調整するので、この機能を維持したいと思います。

データを並べ替え、新しい従業員の削除と追加を可能にするマクロを作成しました。これは、変更イベントマクロと競合し、両方が動作している場合にマクロでエラーが発生します。

Q.マクロの実行中にワークシート変更イベントをバイパスし、マクロが終了したら再びそれを配置する方法はありますか?

変更イベントのコードは次のとおりです。

Private Sub Worksheet_Change(ByVal target As Excel.Range, skip_update As Boolean)
If skip_update = False Then
    Call PaintCell(target)
End If
End Sub

ワークシートまたは範囲を参照すると、マクロでエラーが発生します。

16
user1545643

EnableEventsオブジェクトのApplicationプロパティが必要だと思います。 EnableEventsをFalseに設定すると、コードは何もイベントをトリガーせず、他のイベントコードは実行されません。たとえば、コードがセルを変更した場合、通常はChangeイベントまたはSheetChangeイベントをトリガーします。ただし、このように構成すると

Application.EnableEvents = False
    Sheet1.Range("A1").Value = "new"
Application.EnableEvents = True

その後、A1を変更してもイベントはトリガーされません。

コードでイベントコードをトリガーすることが有益な場合とそうでない場合があります。防止したい場合はEnableEventsを使用してください。

35
Dick Kusleika

これは、@ Dick Kusleikaからの回答に対する重要な変更です。

EnableEvents設定をオフにするときは、EnableEventsをオンに戻すためのエラー処理を含めることをお勧めします。そうしないと、スクリプトがエラーをスローすると、EnableEventsを手動でオンに戻すまで、変更イベントトリガー(スクリプト)は機能しなくなります。

理想的には、変更イベントを再トリガーしたコードの直前に次の行を配置します。 1行目は、エラーが発生したときに「enableEventsOn」というラベルに移動するようにVBAに指示しています。 2行目は変更イベントをバイパスします。

On Error Goto enableEventsOn:
Application.EnableEvents = False

次に、変更イベントを再トリガーしたコードの直後にこのコードを配置します。これにより、変更イベントトリガーが再びオンになり、通常のエラー処理がスクリプトに返されます。

Application.EnableEvents = True
On Error Goto 0

最後に、このコードをスクリプトの最後に配置します。上記のラベルです。 "On Error Goto enableEventsOn:"と "On Error Goto 0"の間にエラーが発生した場合、スクリプトはここに移動してEnableEventsをオンに戻し、次回ワークシートを変更したときにスクリプトを開始する準備ができたままにします。

EnableEventsOn:
Application.EnableEvents = True
8
ChrisB

私の意見では危険すぎる。

各マクロの先頭で「True」に設定され、終了時にfalseに設定される「skip_update」という名前の変数を使用します。

例:

dim skip_update as Boolean = False

sub auto_macro_when_modify()
   if skip_update == True then
      exit sub ' NO CHANGE !
   end if
end sub

sub other_macro
    skip_update = True
    ' ( do stuff)
    skip_update = False
end sub
1
mansuetus

CTRLキーを押しながら、イベントルーチンの変更をトリガーするエントリを実行できます。特定の列の選択された範囲の値を合計するルーチンがあります。 1行目から5行目までカーソルをドラッグして強調表示すると、これらの合計がクリップボードに保存されます。この列のセルにエントリがあると、ルーチンがトリガーされます。 CTRLキーを押したまま目的のアクションを実行するか、列のセルに入力すると、ルーチンが開始されません。より複雑なChangeEventシナリオでは機能しない場合があります。

0
Malcolm