web-dev-qa-db-ja.com

セルの変更時にExcelマクロを自動的に実行する

特定のセルの値が変更されるたびにExcelマクロを自動的に実行するにはどうすればよいですか?

現在、私の作業コードは次のとおりです。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("H5")) Is Nothing Then Macro
End Sub

ここで、"H5"は監視対象の特定のセル、Macroはマクロの名前です。

もっと良い方法はありますか?

87
namin

あなたのコードはかなり良く見えます。

ただし、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

お役に立てれば...

105
Mike Rosenblum

Worksheet_ChangeイベントまたはWorkbook_SheetChangeイベントを処理します。

イベントハンドラーは引数 "Target As Range"を受け取るため、変化する範囲に目的のセルが含まれているかどうかを確認できます。

7
Joe

私はこの方法を好みます。セルではなく範囲を使用します

    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
3
Javier Torón

イベントトリガーを実際に台無しにした後、私はこれを調査し、すべてがどのように機能するかを学ぶのに多くの時間を費やしました。散らばった情報が非常に多かったので、私は見つけたものをすべて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

これにより、モジュールからイベントのオン/オフを切り替えることができます。これにより、問題が発生し、変更のトリガー、イベントのオフ、マクロの実行、イベントのオンの再起動が可能になります。

2

オンライン在庫データベースにリンクされ、頻繁に更新されるセルがあります。セルの値が更新されるたびにマクロをトリガーしたい。

これは、プログラムまたは外部データの更新によるセル値の変更に似ていますが、上記の例は何らかの形で機能しません。問題は、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
0
Juan Garcia