【VBA】指定したセルに変更があった場合に処理を実行する方法まとめ(シートイベント) 您所在的位置:网站首页 vba中worksheet_change 【VBA】指定したセルに変更があった場合に処理を実行する方法まとめ(シートイベント)

【VBA】指定したセルに変更があった場合に処理を実行する方法まとめ(シートイベント)

2023-11-01 05:15| 来源: 网络整理| 查看: 265

Worksheet_Changeイベントを使うことで、コードを記載したシートのセルが変更されたときに処理を実行することができます。

この処理で実用上ポイントになるのは、動作範囲の指定方法です。

Worksheet_Changeイベントへの動作範囲の指定方法はいくつかありますが、わかりやすいものに絞ってご紹介します。

目次 基本コード Intersectメソッドを使う方法

このサンプルコードの条件部分は、Intersectメソッドで、変更セル(Target)が、指定範囲内(A1~A10)にあるかどうかを判定しています。

Private Sub Worksheet_Change(ByVal Target As Range) 'A1~A10のセル値が変更されたときに処理を実行 If Intersect(Target, Range("A1:A10")) Is Nothing Then '指定範囲外のセルが変更された場合の処理を必要に応じて記載 Else MsgBox "指定セルに変更がありました。" End If End Sub

“If Intersect(Target, Range(“A1:A10″)) Is Nothing Then”の部分を訳すと、「変更セルがA1~A10にない場合」です。

そのため、指定範囲以外のセルの変更を無視する(何もしない)場合は次のコードでも大丈夫です。

Private Sub Worksheet_Change(ByVal Target As Range) 'A1~A10のセル値が変更されたときに処理を実行 If Not Intersect(Target, Range("A1:A10")) Is Nothing Then MsgBox "指定セルに変更がありました。" End If End Sub

Intersectの前にNotを付けることで「変更セルがA1~A10にある場合」という意味になります。(否定の否定=肯定)

上記は指定範囲内での実行を前提にしていますが、処理内容の記載位置やNotの有無によって、指定範囲内ではなく、逆に指定範囲外をトリガーとしてイベント処理を実行させることも可能です。

なお、(変数などの利用を前提に)範囲を数値指定したい場合、Range内にCellsを配置する一般的な方法でOKです。

Private Sub Worksheet_Change(ByVal Target As Range) 'A1~A10のセル値が変更されたときに処理を実行 If Not Intersect(Target, Range(Cells(1, 1), Cells(10, 1))) Is Nothing Then MsgBox "指定セルに変更がありました。" End If End Sub Intersectメソッドを使わない方法1

Intersectメソッドを使わない方法のひとつに、Taeget変数にセルアドレスを直接指定する方法があります。

コードの記載例は次のとおりですが、セル番地は絶対参照で指定する必要があります。(“$A$1″=○ ”A1″=×)

Private Sub Worksheet_Change(ByVal Target As Range) 'A1のセル値が変更されたときに処理を実行 If Target.Address = "$A$1" Then MsgBox "指定セルに変更がありました。" End If End Sub

極めてシンプルに指定できますね。

ですがこの方法には注意したい点があります。

この場合、指定したアドレスとまったく同じ範囲に変更を与えないと動作しません。

例えば、Targetに指定したアドレスが”$A$1″であればA1セルを変更すれば反応しますが、コピペやデリートなどでA1セル以外も含めた範囲を一気に変更した場合は反応しません。

また、仮にTargetに”$A$1:$B$10″を指定した場合、A1:B10セルすべての範囲に同時に変更を与えないと反応しません。

つまり、結合セルの場合は結合範囲を正確に指定する必要がありますし、その結合セル範囲を含んでいたとしても、その他のセルも一緒に変更を与えた場合は動きません。

シンプルで便利な反面、この方法を採用するときは、保護などで他の範囲を選択できないようにしておくなどの対策もしておいたほうがトラブルは少なくなるでしょう。

Intersectメソッドを使わない方法2

上記と同様に、Intersectを使わずに動作範囲を指定する方法ですが、Intersectのように範囲に幅を持たせることもできます。

具体的には、Target(変更セルのアドレス)を行番号と列番号の要素に分けて、両方が指定範囲に収まっている場合だけ処理を実行するというものです。

Private Sub Worksheet_Change(ByVal Target As Range) 'B4~E10のセル値が変更されたときに処理を実行 If Target.Row >= 4 And Target.Row = 2 And Target.Column = 2 And Target.Column


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有