セルの重なった部分を返す Intersect

中級VBA

セルの重なった部分を返す Intersect

 Intersectはアプリケーション関数で、複数のRangeの共通部分を返すことができます。
 もし共通部分が無い場合は Nothing が返ります。

 Intersect関数は、イベントのWorksheet_SelectionChangeなどでよく使われますので、例を挙げて解説します。

Intersect関数

 Intersect関数の書式は以下のようになっています。
 
 Application.Intersect(rng1, rng2, rng3, ,,,, )
 
 rng1,rng2のように複数の Rnage オブジェクトを指定する事で、共通する部分の Range を返してくれます。
 共通部分が無い場合は Nothing が返ります。
 Applicationは省略してもOKです。

イベントでの使い方

 選択セルが変更された時に呼び出される SelectionChangeイベントを例にして解説します。

SelectionChangeイベントのプロシージャを書き出す

 シートのイベントになりますので、プロジェクトウインドウから適当なシートを選択してコードウインドウの上部にあるドロップダウンリストから、WorksheetオブジェクトのSelectionChangeを選択すると自動でコードが書かれます。

サンプルコード

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    If Intersect(Target, Range("C3:E6")) Is Nothing Then
        
    Else
        MsgBox "選択範囲です"
    End If
   
End Sub

コード解説

 SelectionChangeイベントのプロシージャを書き出したら、上記のようなコードを書いてみましょう。
 Intersect関数に Target Range(“C3:E6”) を引数に与えています。
 Targetはイベント発生の際に送られてくるRangeオブジェクトになります。
 Target Range(“C3:E6”) に重なった部分が無ければ If文
 重なった部分があれば Elseに書いたコードが実行されます。

 ただ、Targetは複数のセルである場合もあります。
 その場合は、ひとつでもRange(“C3:E6”)の範囲内にあればメッセージが表示されます。

 もし、1つのセル選択のみ扱いたい場合は、Rangeオブジェクトの Countプロパティで確認するようにすればよいでしょう。

サンプルコード2

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    If Target.Count > 1 Then Exit Sub
    

    If Intersect(Target, Range("C3:E6")) Is Nothing Then
        
    Else
        MsgBox "選択範囲です"
    End If
End Sub

行単位、列単位で反応させたい

 決まった行や列が選択された場合を想定したい場合は、上記の例の第二引数のRangeを工夫すれば良いでしょう。
 以下はC列で反応させる場合と3行目を反応させる場合の例です。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    
    If Not Intersect(Target, Range("C:C")) Is Nothing Then
        MsgBox "C列です"
    End If
    
    If Not Intersect(Target, Range("3:3")) Is Nothing Then
        MsgBox "3行目です"
    End If
End Sub

 先の例では、Elseにコードを書きましたが、If Not とすれば、短く書くことができます。

最後に

 Intersect関数はSelectionChangeなどのイベントでよく使われます。
 SelectionChangeイベントは頻繁に発生するので、Intersect関数を用いてセルの範囲を限定して、条件に合わなければさっさと処理を終えるように工夫しましょう。
 イベント処理を行う場合は、なるべく処理が早く終わるように書くのがコツです。

 また、SelectionChangeなどは、シートモジュールに書くコードなので他のシートには影響しません。 ただし、イベントプロシージャが記述されたシートをコピーするとコピー先のシートにも引き継がれます。

 Intersect関数は良く使いますので是非使い方をマスターしてください。

タイトルとURLをコピーしました