変数や配列の要素がオブジェクトかどうかを調べるには、
IsObject関数を利用します。
IsObject関数の基本構文と結果は以下の通りです。
Sub IsObject関数の結果一覧() Dim Long変数 As Long Debug.Print IsObject(Long変数) ' False Dim String変数 As Long Debug.Print IsObject(String変数) ' False Dim Range変数 As Range Debug.Print IsObject(Range変数) ' True Dim Object変数 As Object Debug.Print IsObject(Object変数) ' True Dim 自作Type変数 As 自作Type 'Debug.Print IsObject(自作Type変数) ' エラー Debug.Print IsObject(自作Type変数.Long要素) ' False Debug.Print IsObject(自作Type変数.Range要素) ' True Dim 自作クラス変数 As Class1 Debug.Print IsObject(自作クラス変数) ' True Dim Variant変数 As Variant Debug.Print IsObject(Variant変数) ' False Variant変数 = 1 Debug.Print IsObject(Variant変数) ' False Set Variant変数 = Range("A1") Debug.Print IsObject(Variant変数) ' True Variant変数 = Empty Debug.Print IsObject(Variant変数) ' False Set Variant変数 = Nothing Debug.Print IsObject(Variant変数) ' True End Sub
内容をざっくりまとめますと、
まず変数の型が決まっている場合はその型に応じた結果となります。
その変数に値が入っているかは問われませんので、
Range型で宣言した時点で、まだRangeが入っていなくてもTrueです。
※ より正確にはObject型の初期値NothingがTrueのためTrueになります。
オブジェクト変数に実際にオブジェクトが入っているかどうかや、
クラスがNewされているかを調べることはできません。
それらを調べるには「IsNothing関数」を使用して下さい。
よって「As ○○」で宣言された変数に使う意味はあまりないので、
IsObject関数は「Variant変数の中身を判定するための関数」と思えばOKです。
Variant変数の判定仕様は、
- ObjectがSetされていればTrue
- Object以外の値が入っているとFalse
と、ストレートに判定してくれるので、特に注意点はありません。
細かいところでは、
- Variant変数の初期値「Empty」はFalse
- Object変数の初期値「Nothing」はTrue
であるため、
Set Variant変数 = Objectを取得する関数
このコードの結果が「Nothing」だったとしてもIsObjectはTrueになる
という点だけ注意しておけばよいと思います。
これらの判定はVariantを格納する配列や、
Collection/DictionaryのItem/Keyに対しても同様に動きます。
もちろん関数の引数でも同様の判定ができますので、
汎用関数の引数に渡された値の判定などにご利用ください。