特定のセルの値が変更されるたびにExcelマクロを自動的に実行するにはどうすればよいですか?
現在、私の作業コードは:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("H5")) Is Nothing Then Macro
End Sub
ここで"H5"
特定のセルを監視しているMacro
マクロの名前です。
もっと良い方法はありますか?
特定のセルの値が変更されるたびに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
お役に立てれば...
H5
が別のシートから変更された場合はsheet2
、上記の関数が機能しないとしましょう。これはplzが役立ちます。
ActiveSheet
明示的に指定しない場合は常にExcelが想定し、作業中のExcelであることを明示的に指定しない場合は常にExcelが想定しApplication
ます。
Worksheet_Change
イベントを配置する必要がある場所)では、非修飾Range
はデフォルトではなくActiveSheet
、コードを含むシートを参照することに注意してください。したがって、この回答のコードは、質問のコードと実質的に同じです。(注:この回答が書かれた2009年の時点では、異なっていた可能性がありますが、そうではなかったと確信しています。)
Worksheet_Change
イベントまたはイベントを処理しWorkbook_SheetChange
ます。
イベントハンドラーは引数「Target As Range」を受け取るため、変化する範囲に目的のセルが含まれているかどうかを確認できます。
Target.Address = Range("H5").Address
。もっと簡単な方法はありますか?
Not (Intersect(Target, Range("H5")) Is Nothing)
。これはどのように行うのですか?
Target.Address = Range("H5").Address
セルが変更された範囲の一部にすぎない場合、最初のコメント()は機能しません。2番目のコメントは、Mike Rosenblumが述べた問題を依然として抱えています。
これを調査し、すべてがどのように機能するかを学ぶのに多くの時間を費やしました。非常に多くの情報が散在していたので、次のように、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
これにより、モジュールのイベントのオン/オフが切り替わり、問題が発生し、変更がトリガーされ、イベントがオフになり、マクロが実行され、イベントが再びオンになります。
私はこの方法を好みます、セルではなく範囲を使用します
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
オンライン在庫データベースにリンクされ、頻繁に更新されるセルがあります。セルの値が更新されるたびにマクロをトリガーしたい。
これは、プログラムまたは外部データの更新によるセル値の変更に似ていると思いますが、上記の例はどういうわけか私にはうまくいきません。問題は、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