MENU

EXCELVBA ChangeイベントとIntersect使って、指定した範囲内のセルが変更された時の制御を作る

  • URLをコピーしました!

EXCELで特定のセルが変更されたら、何か処理を行いたいという要望は多いと思います。

簡単な計算式ならば、数式でも対応は可能ですが、より柔軟な対応をしたい時には、プログラムで作って対応することもできます。

今回は、EXCEL VBAで指定した範囲のセルに入力された時に処理を行うプログラムをご紹介致します。

スポンサーリンク
目次

対象のシートのChangeイベントに処理を入れる

今回の処理にはChangeイベントを使います。

前回のプログレスバーは、トリガーにコマンドボタンを配置しました。Changeイベントは、対象のシート内で変更があると動く処理です。

オブジェクト(赤枠の箇所)にはworksheetを選択します。

プロシージャ(青枠の箇所)にはChangeを選択します。

Intersectの処理を書く

前段で作成したプロシージャの中に具体的な処理を書いていきます。

Intersectは、第一引数の範囲と第二引数の範囲の重複範囲を取得するメソッドです。

範囲が重複していれば、重複している範囲を取得し、重複していなければNothingを返します。

今回では、Intersectの第一引数にはChangeイベントの引数のtargetを指定し、第二引数には、指定範囲をRangeで指定します。

ここまでの段階を踏まえてサンプルを起こすと下記のようになります。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim CheckRange As String    '指定したセル範囲
    Dim CheckCol As String      '列
    Dim minRowCnt As Integer    '行数
    Dim maxRowCnt As Integer    '行数

    '指定したセル範囲を定義しています
    CheckCol = "B"
    minRowCnt = 1
    maxRowCnt = 100
    CheckRange = CheckCol & minRowCnt & ":" & CheckCol & maxRowCnt
    
    '変更したセルが指定した範囲内であれば処理を行います
    If (Not Intersect(Target, Worksheets(ActiveSheet.Name).Range(CheckRange)) Is Nothing) Then
       
       MsgBox ("範囲内だよーん")
    
    '変更したセルが指定した範囲外であれば処理を行いません
    Else
        
        Exit Sub
    
    End If
End Sub

エラー回避等の補足

前段のサンプルに補足するのであれば

・targetの範囲を一つのセルに限定したいのであれば、target.cells.countが1であることをIntersectとAnd条件にすること

・変更したセルの入力値に制限をかけたいのであれば、さらに入力内容のチェックを行うこと

などを盛り込めば、実行時エラーのリスク回避になります。

補足を踏まえるとサンプルはこのような形になります。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim CheckRange As String    '指定したセル範囲
    Dim CheckCol As String      '列
    Dim minRowCnt As Integer    '行数
    Dim maxRowCnt As Integer    '行数

    '指定したセル範囲を定義しています
    CheckCol = "B"
    minRowCnt = 1
    maxRowCnt = 100
    CheckRange = CheckCol & minRowCnt & ":" & CheckCol & maxRowCnt
    
    '変更したセルが指定した範囲内であれば処理を行います
    If ((Not Intersect(Target, Worksheets(ActiveSheet.Name).Range(CheckRange)) Is Nothing) And _
        Target.Cells.Count = 1) Then
       
        '空白以外であれば処理を行います
        If (Target.Cells.Value <> "") Then
            
            MsgBox ("範囲内に何か値を入れたよーん")
        
        End If
        
    '変更したセルが指定した範囲外であれば処理を行いません
    Else
        
        Exit Sub
    
    End If
End Sub

範囲の指定については、列や行で指定したりシートのデータ最下行などを指定したりすることも可能です。

入力内容のチェックについても、空白以外に日付や数値なども入れるとよいと思います。

色々試してみてください。

スポンサーリンク
よかったらシェアしてね!
  • URLをコピーしました!
目次