Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11全般 : Excel 2016)
Intersectメソッドを利用したSelectionとRangeの交差範囲について
投稿日時: 24/02/26 17:06:41
投稿者: boc

お世話になります。
Intersectメソッドを用いて、選択したセルと指定した範囲が交差している場合に値を返し、交差していない場合はメッセージが表示されるようにしたいのですが、
例えば
 
Sub Macro1()
If Not Intersect(Selection, Range("B2:D4")) Is Nothing Then
      Selection.FormulaR1C1 = "abc"
Else
      Msgbox("範囲外です")
End If
End Sub
 
とした場合に、セルを範囲選択すると、A1:D4やB2:E5のようにRangeで指定した範囲(B2:D4)を一部はみ出して選択した場合でもメッセージが表示されずに値が返ってきてしまうのですが、選択範囲のすべてが指定した範囲内の時のみ値を返すようにする方法はあるのでしょうか?
よろしくお願いします。

回答
投稿日時: 24/02/26 17:44:43
投稿者: simple

その共通範囲をとった範囲のアドレスと、Selectionのアドレスが一致すれば、
それは含まれていると判断できませんか?

回答
投稿日時: 24/02/26 17:45:51
投稿者: WinArrow

Intersect
は、セル範囲1とセル範囲2の
重複しているセル範囲を取得する場合に利用します。
どちらのセル範囲が単独セルの場合は、もう一方のセル範囲に存在するかを
確認することができます。
>A1:D4やB2:E5が、(B2:D4)の中に存在するか?
  
左上セルと右下セルの両方をチェックすればよいでしょう。
  

Dim RNG1 As Range
Dim RNG2 As Range

    Set RNG1 = Range("B3:D3")
    Set RNG2 = Range("B2:D4")
    
    If Not ((Intersect(RNG1.Cells(1), RNG2) Is Nothing) And _
            (Intersect(RNG1.Cells(RNG1.Cells.Count), RNG2) Is Nothing)) Then

        MsgBox "OK"
    Else
        MsgBox "NG"
    End If

回答
投稿日時: 24/02/26 20:40:36
投稿者: simple

こういうことではないですか? 分かりにくかったですか?

Sub test()
    Dim rng   As Range
    Dim adrs  As String
    Dim rngIntersect As Range

    Set rng = Range("B2:D4")                        '対象範囲
    Set rngIntersect = Intersect(Selection, rng)    '共通範囲
    adrs = rng.Address(False, False)

    If Not rngIntersect Is Nothing Then  '共通範囲があれば
        '選択範囲が共通範囲と同じなら、選択範囲が対象範囲の中にあると言える。
        If Selection.Address = rngIntersect.Address Then
            Selection.Value = "abc"
        Else
            MsgBox adrs & " と交差していますが、範囲の中にはありません"
        End If
    Else
        MsgBox adrs & "の範囲外です"
    End If
End Sub

投稿日時: 24/02/26 22:12:19
投稿者: boc

ご回答ありがとうございます。
Intersectは共通範囲があるかどうかをチェックするだけなので、選択範囲と共通範囲のアドレスが一致しているかを加える必要があったのですね。
わかりやすくご説明いただきありがとうございました。
解決済みとさせていただきます。