Home » Dictionaryオブジェクトの使い方 » DictionaryのNothing判定

「Dictionary Nothing 判定」
という検索キーワードでアクセスがありました。

DictionaryオブジェクトがNothingかどうかの判定について調べていた方による検索キーワードです。

例えば、オブジェクト変数dicにDictionaryオブジェクトが格納されるとして、
  If dic Is Nothing Then
のようにIs演算子でNothingと比較すれば、Nothingかどうかの判定はできます。

[スポンサードリンク]

ですが、そもそもVBAでオブジェクト変数がどういうときにNothingになるのか、Nothingになるのはどういう状態なのかを、まだ理解できてらっしゃらないのではないかと、想像しています。

DictionaryのNothingを確認するサンプルマクロ

拙著『いちばんやさしいExcel VBAの教本』をお読みいただいた方にはおなじみの、ローカルウィンドウを使って、Nothingとはどういう状態なのかを確認しておくことをおすすめします。

Sub Dictionaryの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

End Sub

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判定

「Dictionaryオブジェクトの使い方」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.