特定のセルの値が変更されるたびに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