【Excel VBA入門 第10回】指定したセルだけ動かす!Intersect関数でダブルクリックの適用範囲を制限する方法

スポンサーリンク
Excel VBA

導入

前回の第9回では、セルをダブルクリックするたびに「〇」がついたり消えたりする「トグル表示マクロ」を作成した。

しかし、前回のコードのままでは「シート上のどのセルをダブルクリックしても〇がついてしまう」という問題がある。表のタイトルやデータが入っているセルを間違えてダブルクリックした際に、誤って「〇」に書き換わってしまうのは避けたい。

そこで今回は、Intersect(インターセクト)関数を使って、「A列だけ」「特定の表の範囲だけ」のようにマクロが反応するエリアを限定するテクニックを解説する。

なぜ範囲制限が必要なのか?

実務で作成するExcelシートでは、チェックボックスのように「〇」を入力したい列や範囲は決まっていることがほとんどだ。

  • 入力したい場所:A列の「チェック欄」(A2:A100 など)
  • 触られたくない場所:B列の「氏名」やC列の「金額」など

指定範囲外のダブルクリックは通常どおり「セルの編集モード(または何もしない)」として動かし、指定した範囲内だけでトグル処理を実行させるのが、実用的なマクロ作成のポイントである。

範囲判定のキーアイテム「Intersect関数」とは?

2つの範囲が重なる部分(共通部分)を取得するためのVBA関数が Intersect(インターセクト) である。

基本構文

VBA

Intersect(範囲1, 範囲2)

もし「範囲1」と「範囲2」に重なるセルがあれば、その重なったRangeオブジェクトを返す。 逆に、まったく重なっていない(共通部分がない)場合は Nothing(何もなし)を返すという性質を持っている。

この性質を利用して、以下のように条件判定を行う。

VBA

If Not Intersect(Target, 制限範囲) Is Nothing Then
    ' 重なりがある(=ダブルクリックされたセルが制限範囲内である)ときの処理
End If

Not ... Is Nothing という二重否定のような記述になるため最初は戸惑うかもしれないが、「ダブルクリックされたセル(Target)が、制限範囲の中に含まれていれば処理を実行する」という意味になる。

実践!範囲制限付きトグルマクロのコード

A列の2行目から100行目(A2:A100)だけをダブルクリックの対象とするコード例を示す。

設定手順

  1. Alt + F11 でVBAエディタを開く。
  2. 該当シートのシートモジュールを開く。
  3. 以下のコードを貼り付ける。

VBA

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    ' 〇を入力したい範囲をオブジェクト変数にセット
    Dim CheckRange As Range
    Set CheckRange = Me.Range("A2:A100")
    
    ' ダブルクリックされたセル(Target)が指定範囲内か判定
    If Not Intersect(Target, CheckRange) Is Nothing Then
        ' 通常のダブルクリック(編集モード)をキャンセル
        Cancel = True
        
        ' トグル処理(〇の付け外し)
        If Target.Value = "〇" Then
            Target.Value = ""
        Else
            Target.Value = "〇"
        End If
    End If
End Sub

コードのポイント解説

範囲の定義(Set CheckRange = Me.Range(...))

変数 CheckRange に、トグル動作を許可したい範囲をセットしている。 Me は「このコードが書かれているシート自身」を指すオブジェクトである。

判定ロジック(If Not Intersect(...) Is Nothing)

ダブルクリックが発生すると、そのセルが Target として渡される。 Intersect(Target, CheckRange) を実行し、TargetCheckRange(A2:A100)に含まれている場合のみ、If の中の処理(Cancel = True とトグル切替)が実行される。

範囲外(例: B列やC列)をダブルクリックした場合は If 条件が成立しないため、何も起こらず通常のExcelの動作(ダブルクリックで編集モードに入る)となる。

さまざまな範囲指定の書き方パターン

実務に合わせて、CheckRange の指定方法を柔軟に変更してみよう。

パターンA:列全体を指定したい場合(例:A列すべて)

VBA

Set CheckRange = Me.Range("A:A")

パターンB:離れた複数の範囲を指定したい場合(例:A列とC列)

VBA

Set CheckRange = Me.Range("A2:A100, C2:C100")

まとめ

今回は、Intersect 関数を用いてイベントマクロの動作範囲を制限する方法を学んだ。

  • Intersect(Target, 範囲) で重なりをチェックできる
  • Not Intersect(...) Is Nothing の形で範囲内判定を行う
  • 実務でマクロを動かす際は、誤動作防止のため範囲指定が必須

第8回から第10回にかけて、「イベントの仕組み」「トグル処理」「範囲制限」と学んできたことで、実用レベルの入力補助ツールを作成できるようになった。

次回(第11回)は、トグルで「〇」がついたときに「自動でセルの背景色を黄色にする」など、さらに見た目をわかりやすくする装飾の自動化に挑戦する。

コメント

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