セルの変更時にExcelマクロを自動的に実行する
-
03-07-2019 - |
質問
特定のセルの値が変わるたびにExcelマクロを自動的に実行するにはどうすればよいですか
今、私の作業コードは次のとおりです。
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("H5")) Is Nothing Then Macro
End Sub
" H5"
は監視対象の特定のセル、 Macro
はマクロの名前です。
もっと良い方法はありますか?
解決
あなたのコードはかなり良く見えます。
ただし、 Range(" H5")
への呼び出しは、 Application.Range(" H5")
へのショートカットコマンドであることに注意してください。 Application.ActiveSheet.Range(" H5")
と同等です。変更がユーザー変更(これが最も一般的)である場合、これは問題ない可能性がありますが、プログラムによる変更を介してアクティブシートでない場合、ワークシートのセル値が変更される可能性があります。 VBA。
これを念頭に置いて、 Target.Worksheet.Range(" H5")
を利用します:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Target.Worksheet.Range("H5")) Is Nothing Then Macro
End Sub
または Me.Range(" H5")
を使用できます。イベントハンドラーが問題のワークシートのコードページにある場合(通常は):
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("H5")) Is Nothing Then Macro
End Sub
これが役立つことを願っています...
他のヒント
Worksheet_Change
イベントまたは Workbook_SheetChange
イベントを処理します。
イベントハンドラは引数" Target As Range"を受け取るので、変化する範囲に目的のセルが含まれているかどうかを確認できます。
セルではなく範囲を使用して、この方法を好みます
Dim cell_to_test As Range, cells_changed As Range
Set cells_changed = Target(1, 1)
Set cell_to_test = Range( RANGE_OF_CELLS_TO_DETECT )
If Not Intersect(cells_changed, cell_to_test) Is Nothing Then
Macro
End If
実際にイベントトリガーを台無しにした後、これを調査し、それがどのように機能するかを学ぶのに多くの時間を費やしました。非常に多くの情報が散在していたため、私は見つけたものをすべて1か所で共有することにしました。
1)VBAエディターを開き、VBAプロジェクト(YourWorkBookName.xlsm)でMicrosoft Excelオブジェクトを開き、変更イベントが関係するシートを選択します。
2)デフォルトのコードビューは「一般」です。上部中央のドロップダウンリストから、「ワークシート」を選択します。
3)Private Sub Worksheet_SelectionChangeはすでにあるはずなので、そのままにしておきます。 Mike Rosenblumのコードを上からコピーして貼り付け、変更を監視しているセル(私の場合はB3)への.Range参照を変更します。ただし、まだマクロを配置しないでください(" Then"の後に" Macro"という単語を削除しました):
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
End Sub
または左上のドロップダウンリストから[変更]を選択します。 Private SubとEnd Subの間のスペースに、 If Not Intersect(Target、Me.Range(" H5"))Is Nothing Then
4)" Then"の後の行マクロを呼び出すときにイベントをトリガーしないようにイベントをオフにし、Excelをクラッシュさせたり、すべてを台無しにしたりすることのない終わりのないサイクルでこのWorksheet_Changeを再度実行しようとします。
Application.EnableEvents = False
5)マクロを呼び出す
Call YourMacroName
6)次の変更(および他のすべてのイベント)がトリガーされるように、イベントをオンに戻します:
Application.EnableEvents = True
7)IfブロックとSub:
を終了します End If
End Sub
コード全体:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("B3")) Is Nothing Then
Application.EnableEvents = False
Call UpdateAndViewOnly
Application.EnableEvents = True
End If
End Sub
これにより、モジュールでイベントのオン/オフを切り替えることで問題が発生し、変更のトリガー、イベントのオフ、マクロの実行、イベントのオンの再起動が可能になります。
オンライン在庫データベースにリンクされ、頻繁に更新されるセルがあります。セルの値が更新されるたびにマクロをトリガーしたい。
これは、プログラムまたは外部データの更新によるセル値の変更に似ていますが、上記の例はどういうわけかうまくいきません。問題は、Excelの内部イベントがトリガーされないためだと思いますが、それは私の推測です。
次のことを行いました
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Target.Worksheets("Symbols").Range("$C$3")) Is Nothing Then
'Run Macro
End Sub