「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
2024年11月20日 21:41
小川 慶一さん
2024年11月20日 21:28
AIユーザさん
2024年11月14日 17:04
小川 慶一さん
2024年11月13日 18:12
AIユーザさん
2024年11月13日 18:11
田中 宏明さん