和風スパゲティのレシピ

日本語でコーディングするExcelVBA

変数がオブジェクトか判定する - IsObject関数

変数や配列の要素がオブジェクトかどうかを調べるには、
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に対しても同様に動きます。

もちろん関数の引数でも同様の判定ができますので、
汎用関数の引数に渡された値の判定などにご利用ください。