「Is 演算子」と「Nothing」

イベントとフォーム講座の受講生から、こんな質問がありました。

以下の 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  
公開日時: 2022/08/17 12:00