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


91

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

現在、私の作業コードは:

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

ここで"H5"特定のセルを監視しているMacroマクロの名前です。

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


FormulaDeskのRunMacroWhenValueChanges UDFは要件を満たしていますか?Formuladesk.com
Gareth Hayter、

回答:


107

あなたのコードはかなりよさそうだ。

ただし、の呼び出しはへ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

お役に立てれば...


4
セルH5が別のシートから変更された場合はsheet2 、上記の関数が機能しないとしましょう。これはplzが役立ちます。
dhpratik 2013

2
グーグル検索からここに来る人のために、私がしたようなモジュールではなく、このコードをvbaのシートに貼り付けてください。見stackoverflow.com/questions/15337008/...
hammythepig

Application.ActiveSheet.Range( "H5")。==> target.parent.range( "H5")はさらに安全です
Pierre

1
@WillEdigerシート参照をActiveSheet明示的に指定しない場合は常にExcelが想定し、作業中のExcelであることを明示的に指定しない場合は常にExcelが想定しApplicationます。
スコットマーカス

1
ワークシートコードモジュール(Worksheet_Changeイベントを配置する必要がある場所)では、非修飾RangeはデフォルトではなくActiveSheet、コードを含むシートを参照することに注意してください。したがって、この回答のコードは、質問のコードと実質的に同じです。(注:この回答が書かれた2009年の時点では、異なっていた可能性ありますが、そうではなかったと確信しています。)
YowE3K

7

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

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


ありがとう、うまくいきました。たとえば、で範囲を確認しますTarget.Address = Range("H5").Address。もっと簡単な方法はありますか?
ナミン2009年

代替:Not (Intersect(Target, Range("H5")) Is Nothing) 。これはどのように行うのですか?
ナミン2009年

2
Target.Address = Range("H5").Addressセルが変更された範囲の一部にすぎない場合、最初のコメント()は機能しません。2番目のコメントは、Mike Rosenblumが述べた問題を依然として抱えています。
Ant

5

これを調査し、すべてがどのように機能するかを学ぶのに多くの時間を費やしました。非常に多くの情報が散在していたので、次のように、1か所で機能することがわかったものを1つずつ共有することにしました。

1)VBAエディターを開き、VBAプロジェクト(YourWorkBookName.xlsm)でMicrosoft Excelオブジェクトを開き、変更イベントが関係するシートを選択します。

2)デフォルトのコードビューは「一般」です。上部中央のドロップダウンリストから[ワークシート]を選択します。

3)Private Sub Worksheet_SelectionChangeは、本来あるべき状態ですでに存在しています。そのままにしておきます。上からMike Rosenblumのコードをコピーして貼り付け、.Range参照を、変更を監視しているセル(私の場合はB3)に変更します。ただし、まだマクロを配置しないでください(「その後」の後に「マクロ」という単語を削除しました)。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("H5")) Is Nothing Then
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

これにより、モジュールのイベントのオン/オフが切り替わり、問題が発生し、変更がトリガーされ、イベントがオフになり、マクロが実行され、イベントが再びオンになります。


3

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

    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つのセル、連続したセルの範囲、または散在したセル(すべてコンマで区切られた)として設定できます。
Shai Alon、

0

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

これは、プログラムまたは外部データの更新によるセル値の変更に似ていると思いますが、上記の例はどういうわけか私にはうまくいきません。問題は、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

1
どういうわけかこれを動作させることができません。コードをVBAで実行するように指示すると、ポップアップメニューが表示され、マクロを自動的に実行する代わりにマクロを実行するかどうかを尋ねられますか?
David Van der Vieren 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.