達人養成塾 小川です。
イベントとフォーム講座の受講生から、こんな質問がありました。
「以下のif文について解説していただけると幸いです。
あまり見たことのないif文なのでよろしお願いします。
Dim r As Range ' ... 中略 ' ... 中略 ' ... 中略 If Not r Is Nothing Then Else End If
」
発展編1でくわしく取り扱っている内容ですが、ここでは、簡単にご説明。
Is 演算子は、比較演算子です。
つまり、 if hensu > 3 then とかいうときの「 > 」とかと同じ仲間です。
ただし、比較対象たる左辺、右辺とも、数字や文字、日付などのデータではなく、オブジェクトになります。
左辺で示されるオブジェクトと右辺で示されるオブジェクトが同じものなら True 、そうでなければ False という戻り値が得られます。
Nothing は、オブジェクト型の変数の初期値にもなっていますが、要は、「特にどのオブジェクトも示していない」という状態です。
最初にお見せしたサンプルコードに話を戻します。
ここで rはオブジェクト型の変数です。
「r Is Nothing」は、rの中身が空のとき True、すでに何らかのセルへの参照が設定されていたときには False を返します。
だから、「Not r Is Nothing」だと、その反対。rの中身が空のとき False、すでに何らかのセルへの参照が設定されていたときには True を返します。
この「 ~ Is Nothing」というパターンに慣れると、マクロを書くときのアイデアの幅も広がるでしょう。
ということで、最後に練習問題。
以下は、「is nothing」の参考例です。
アクティブなエクセルファイルに Sheet1, Sheet2 という2枚のシートがあるという前提で、以下の test1, test2 のマクロを実行した結果どうなるかを予測し、その後、実際に動作確認してみてください。
Sub test1() Dim w As Worksheet Set w = Worksheets("sheet1") If w Is Worksheets("sheet1") Then Debug.Print "同じです" Else Debug.Print "違います" End If If w Is Worksheets("sheet2") Then Debug.Print "同じです" Else Debug.Print "違います" End If If w Is Nothing Then Debug.Print "同じです" Else Debug.Print "違います" End If End Sub Sub test2() Dim w As Worksheet If w Is Worksheets("sheet1") Then Debug.Print "同じです" Else Debug.Print "違います" End If End Sub