「Dictionary Nothing 判定」
という検索キーワードでアクセスがありました。
DictionaryオブジェクトがNothingかどうかの判定について調べていた方による検索キーワードです。
例えば、オブジェクト変数dicにDictionaryオブジェクトが格納されるとして、
If dic Is Nothing Then
のようにIs演算子でNothingと比較すれば、Nothingかどうかの判定はできます。
ですが、そもそもVBAでオブジェクト変数がどういうときにNothingになるのか、Nothingになるのはどういう状態なのかを、まだ理解できてらっしゃらないのではないかと、想像しています。
DictionaryのNothingを確認するサンプルマクロ
拙著『いちばんやさしいExcel VBAの教本』をお読みいただいた方にはおなじみの、ローカルウィンドウを使って、Nothingとはどういう状態なのかを確認しておくことをおすすめします。
Dim dic As Scripting.Dictionary
Dim ptr As Long
Dim flg As Boolean
ptr = ObjPtr(dic)
flg = dic Is Nothing
Stop
Set dic = New Scripting.Dictionary
ptr = ObjPtr(dic)
flg = dic Is Nothing
Stop
dic.Add Key:="イ", Item:="松"
dic.Add Key:="ロ", Item:="竹"
dic.Add Key:="ハ", Item:="梅"
Stop
dic.RemoveAll
ptr = ObjPtr(dic)
flg = dic Is Nothing
Stop
Set dic = Nothing
ptr = ObjPtr(dic)
flg = dic Is Nothing
Stop
Dictionaryオブジェクトへ参照設定された環境で上記のSubプロシージャを実行して、ローカルウィンドウを確認しましょう。
NothingとはObjPtr関数の戻り値が0の状態
VBAには、オブジェクト変数などオブジェクトを取得する式の、参照しているメモリアドレスを取得するObjPtrという隠し関数が存在します。
オブジェクト式がNothingである状態というのは、このObjPtr関数の戻り値が「0」の場合です。
サンプルマクロの実行状態
変数の宣言直後はNothing
上記のSubプロシージャを実行して、最初のStopステートメントで中断したとき、ローカルウィンドウは下図のような状態です。
Dictionaryオブジェクトを格納する予定のオブジェクト変数dicは、宣言されているだけですからNothingで、ObjPtr関数の戻り値は0、「dic Is Nothing」の結果はもちろんTrueです。
オブジェクト変数がNewされるとNothingではなくなる
オブジェクト変数dicがNewされると、Nothingではなくなり、ObjPtr関数の戻り値も0ではなくなり、「dic Is Nothing」の結果もFalseになります。
ObjPtr関数の戻り値は実行環境・実行タイミングにより異なります。
ちなみに、この時点でオブジェクト変数dicの中身は空っぽです。
Dictionary.Addメソッド実行後
DictionaryオブジェクトのAddメソッドで、キーと要素を追加すると下図のような状態になります。
Dictionary.RemoveAllメソッド実行後もNothingではない
DictionaryオブジェクトのRemoveAllメソッドを実行すると、
キーと要素を削除できます。
上記SubプロシージャでDictionary.RemoveAllメソッドを実行後も、オブジェクト変数dicはNothingではありません。
「Dictionary Nothing 判定」
と検索なさった方は、こういったケースでNothingになると誤解してらっしゃるのではないかと想像しています。
Set オブジェクト変数 = Nothing実行後はNothing
もちろん
Set dic = Nothing
が実行されれば、オブジェクト変数の値はNothingになります。
Home » Dictionaryオブジェクトの使い方 » DictionaryのNothing判定