2015年10月24日土曜日

[VBA] Set Nothing しても、Nothing にならない

VBA の参照型変数に Nothing を代入しても、Nothing にならないケースがある。
これは変数の定義方法が影響するためです。

変数の定義に New を付けると、オブジェクトを最初に参照したときにオブジェクトの新しいインスタンスが作成されます。
Dim Obj As New Collection
Obj.Add "Sample1"
とすると、2行目で Obj を参照するので、ここでインスタンスを作成した後で Add メソッドを実行します。

同様に、Set ステートメントで Nothing を代入しても、次にこのオブジェクト(変数)を参照したときに新しいインスタンスが作成されてしまいます。例えば以下の場合は・・・
Dim Obj As New Collection

Set Obj = Nothing
If Obj Is Nothing Then  ' ここで新しいインスタンスを作成する、Nothing にならない!
    Debug.Print "Nothing"
Else
    Debug.Print "Collection"  ' こちらを通過します
End If
こういった Nothing の判定が必要な場合は、変数の定義で New を指定せず、以下のようにします。
Dim Obj As Collection
Set Obj = New Collection

■ 参考資料

Dim ステートメント (Visual Basic)
https://msdn.microsoft.com/ja-jp/library/7ee5a7s1.aspx