「vba Intersect() Is Nothingの否定」
という検索キーワードで、このサイト『インストラクターのネタ帳』へアクセスがありました。
引数に指定された複数のRangeオブジェクトの、重複部分・重なっている部分を表すRangeオブジェクトを返す、ApplicationオブジェクトのIntersectメソッドについて、調べていた方による検索です。
「vba Intersect() Is Nothingの否定」
という検索キーワードに対して、単純にお答えするなら、Not演算子を使えばOKです。
ただ、Intersectメソッドを紹介しているWebページでは、Not演算子を使ったコードも記述していることが多いと感じるので、
「vba Intersect() Is Nothingの否定」
を検索なさった方は、「Not Intersect() Is Nothing」の意味が腑に落ちなかったのではないかと推測しています。
Intersectメソッドを確認するサンプルマクロ
まずはNot演算子を使わない、Intersectメソッドの挙動を確認しましょう。
Dim rng1 As Range
Set rng1 = Range("A1:C3")
Dim rng2 As Range
Set rng2 = ActiveWindow.RangeSelection
Dim target As Range
Set target = Intersect(rng1, rng2)
If target Is Nothing Then
' rng1とrng2の重複がない
MsgBox "選択セル『" & rng2.Address(False, False) & "』は、" & rng1.Address(False, False) & "に含まれていません。"
Else
'「rng1とrng2の重複がない」わけではない
MsgBox target.Address(False, False)
End If
上記のSubプロシージャを実行すると、オブジェクト変数rng1に指定されているA1:C3セルと、
Set rng1 = Range("A1:C3")
選択セルの、
Set rng2 = ActiveWindow.RangeSelection
重複部分をIntersectメソッドで取得して、
Set target = Intersect(rng1, rng2)
そのセル番地をメッセージボックスに表示します。
If target Is Nothing Then
Else
MsgBox target.Address(False, False)
重複部分がなければ、
"選択セル『" & rng2.Address(False, False) & "』は、" & rng1.Address(False, False) & "に含まれていません。"
といったメッセージを表示します。
IntersectメソッドとNot演算子を使ったサンプルマクロ
上記のSubプロシージャのIf文でNot演算子を使うと以下のとおりです。
Dim rng1 As Range
Set rng1 = Range("A1:C3")
Dim rng2 As Range
Set rng2 = ActiveWindow.RangeSelection
Dim target As Range
Set target = Intersect(rng1, rng2)
'「rng1とrng2の重複がない」わけではない
MsgBox target.Address(False, False)
Else
MsgBox "選択セル『" & rng2.Address(False, False) & "』は、" & rng1.Address(False, False) & "に含まれていません。"
End If
End Sub
If文の条件にNot演算子を使い、
If Not (target Is Nothing) Then
実際に処理するコードが、ひっくり返っています。
MsgBox target.Address(False, False)
Else
MsgBox "選択セル『" & rng2.Address(False, False) & "』は、" & rng1.Address(False, False) & "に含まれていません。"
Not演算子を使うと「Is Nothing」を否定する、いわば2重否定になるためどうしても難しくなりますから、まずは先のNot演算子を使わないIf文をしっかり理解しましょう。
私はここで紹介している
If Not (target Is Nothing) Then
のように、Not演算子で否定する部分をカッコで括るほうが意味がわかりやすくなるため好みですが、
If Not target Is Nothing Then
でも構いません。
= Trueをあえてつけてみましょう
上記2つのSubプロシージャでも、まだ腑に落ちないという方は、If文をあえて冗長な書き方をしてみると、イイかもしれません。
具体的には、
If target Is Nothing Then
を、
If target Is Nothing = True Then
にしたり、
If Not (target Is Nothing) Then
を、
If Not (target Is Nothing) = True Then
にしてみてください。
最終更新日時:2019-01-04 07:15
- Newer:VLOOKUPでテーブルを参照する
- Older:With文に含む範囲で挙動が変わることもある
Home » エクセルマクロ・Excel VBAの使い方 » Applicationオブジェクト » Intersect() Is Nothingの逆