忍者ブログ
バイオインフォマティックス技術者試験、情報処理試験など、IT系の試験を基礎から勉強します。また、Javaなどプログラミングを勉強します。

【VBAスタンダード対策】オブジェクトのクリア「Nothing」と状態判定の構造!

オブジェクト変数に格納された「実体への参照(リモコン)」は、使い終わったら明示的にクリアすることが推奨されます。また、変数が空っぽ(未設定)の状態であるかどうかを正確に判定する構造をマスターしましょう。

1. 問題:Nothingによるクリアと状態判定の文法

【 問題 】 オブジェクト変数 myWB に割り当てられたワークブックの参照をクリアし、その後、正しくクリアされたかどうか(Nothingであるか)を条件分岐で確認したい。空欄 ( A )( B ) に入る正しいキーワードの組み合わせはどれでしょうか?

Sub ClearTest()
    Dim myWB As Workbook
    Set myWB = Workbooks.Open("C:\Test.xlsx")
    
    ' --- (1) 参照をクリアする ---
    Set myWB = ( A )
    
    ' --- (2) クリアされたか判定する ---
    If myWB ( B ) Nothing Then
        MsgBox "変数はクリアされています。"
    End If
End Sub

① (A) Empty (B) =
② (A) Nothing (B) =
③ (A) Empty (B) Is
④ (A) Nothing (B) Is

2. 正解:オブジェクトのクリアと判定に関する正解

正解: ④ (A) Nothing (B) Is

3. 解説:Nothingという概念と「Is」演算子

オブジェクト変数を「何も指していない状態」にするキーワードと、その状態を比較する演算子には、VBA独自の構造ルールがあります。

[ Nothingの構造的メカニズム ]

1. クリアは「Set 変数 = Nothing」
Nothing は「どこも指していない無の状態」を表す特殊なキーワードです。通常の変数でいう 0 や空文字("")のような役割ですが、オブジェクト変数なので代入時には必ず Set が必要です。これによりメモリ上の参照(紐付け)が完全に切断されます。

2. 判定には「=」ではなく「Is」を使う
【超重要】 オブジェクトが Nothing かどうかを判定するとき、If myWB = Nothing と書くと実行時エラーになります。値の比較ではなく「同じ対象を指しているか(参照の比較)」を行うため、構造的に Is 演算子 を使用しなければなりません。

1. ここが試験に出る!: スタンダード試験では、あえて If myWB = Nothing という誤ったコードを提示し、エラーになる原因を答えさせる問題が頻出します。オブジェクトの比較は必ず Is(または否定の IsNot ではなく Not ... Is Nothing)を使うという構造を叩き込んでください。
2. エンジニアの視点: Java 17などでは `if (myWB == null)` のように共通の比較演算子を使いますが、VBAは「値の比較(=)」と「参照の比較(Is)」を厳密に区別する理系NEOな設計になっています。大規模なマクロでメモリリーク(メモリが解放されずに重くなる現象)を防ぐためにも、プロシージャの最後で `Set 変数 = Nothing` を明示する癖をつけるのがプロの構造化プログラミングです。


4. まとめ

「オブジェクトを消すならSet = Nothing、確かめるならIs Nothing」。このセットを完璧に理解していれば、オブジェクト変数の制御で迷うことはありません。メモリ空間を綺麗に保ち、エラーのないスマートなマクロを構築しましょう。


PR