Home » エクセルマクロ・Excel VBAの使い方 » Applicationオブジェクト » Intersect() Is Nothingの逆

動作検証バージョン:Windows版Excel(バージョン1809 ビルド10827.20181)

「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メソッドの挙動を確認しましょう。

Sub Intersectの確認1()
 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

End Sub

上記の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演算子を使うと以下のとおりです。

Sub Intersectの確認2()
 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 Not (target Is Nothing) Then
'「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

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » Applicationオブジェクト » Intersect() Is Nothingの逆

「Applicationオブジェクト」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.