和風スパゲティのレシピ

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

値のデータ型を調べる - VarType関数

値が現在何型かどうかを調べる方法のひとつとして、
VarType関数があります。

お忙しい方向けに結論だけ先に説明しますと、
「普通にデータ型を調べる分にはTypeName関数の完全下位互換」
な関数ですので、ただデータ型を調べたいだけならTypeName関数をご使用ください。


TypeName関数の解説はこちら
www.limecode.jp

基本構文

VarType(判定したい変数)

返り値一覧

定数名 返り値 説明
vbEmpty 0 空 (未初期化)
vbNull 1 Null (有効なデータではない)
vbInteger 2 Integer
vbLong 3 長整数
vbSingle 4 単精度浮動小数点数
vbDouble 5 倍精度浮動小数点数
vbCurrency 6 通貨値
vbDate 7 日付値
vbString 8 String
vbObject 9 Object
vbError 10 エラー値
vbBoolean 11 ブール値
vbVariant 12 バリアント型(配列でのみ使用される)
vbDataObject 13 データ アクセス オブジェクト
vbDecimal 14 10 進値
vbByte 17 バイト値
vbLongLong 20 LongLong 整数
vbUserDefinedType 36 ユーザー定義型を含むバリアント
vbArray 8192 配列 (中身の返り値を足して表示)

判定仕様

VarType関数は値のデータ型を数値として返す関数です。

オブジェクトの判定をすることは出来ず、
常に「既定のプロパティ(RangeならValue)」を見ようとします。


既定のプロパティがないオブジェクトやNotingの場合は、
すべてひっくるめて「9:Object」を返します。


よって実際はVariantを判定する関数なのですが、

  • 返り値が数値で分かりにくい(TypeNameは型名)
  • オブジェクトが判定できない(TypeNameは可能)

ということで、普通に使う分にはTypeName関数の下位互換と言っていいです。


TypeNameでは逆にできない「オブジェクトをひとまとめで判定したい」場合も、
こっちはこっちで上位互換のIsObject関数がありますからね。

かわいそうですがVarType関数はいらない子だと思ってもらって構いません。


なお、TypeName関数はRange変数を「Range」と評価しますが、
セルの値が何型なのかを判定することができないわけではなく、

TypeName(Range変数) ' Range
' ↓ 値を判定したい場合は書き換え
TypeName(Range変数.Value) ' Double や String

と、Valueをつけるだけ判定ができますので全く問題ありません。


「データ型の判定はTypeName関数」と覚えてしまってください。

詳しい実行結果

VarType関数の実行結果は以下の通りです。

Sub VarType関数の結果一覧()

    Dim Long変数 As Long
    Debug.Print VarType(Long変数) ' 3:Long
    
    Dim String変数 As String
    Debug.Print VarType(String変数)  ' 8:String

    Dim Range変数 As Range
    Debug.Print VarType(Range変数) ' 9:Object
    
    Set Range変数 = Range("A1")
    Debug.Print VarType(Range変数) ' 5:Double
    
        ' Range変数を渡してもRangeと判定はされず、
        ' 既定のプロパティValueの値を判定する
        ' 何もSetされていないときは「Object」と判定
        
    Dim Worksheet変数 As Worksheet
    Set Worksheet変数 = Worksheets(1)
    Debug.Print VarType(Worksheet変数) ' 9:Object
    
        ' 既定のプロパティを持たないオブジェクトは「Object」判定
        
    Debug.Print VarType(1) ' 2:Integer
    Debug.Print VarType("文字列") ' 8:String
    Debug.Print VarType(True) ' 11:Boolean
    Debug.Print VarType(Range("A1")) ' 5:Double
    Debug.Print VarType(Range("A1").Value) ' 5:Double
    
        ' 引数には「varname(変数名)」とあるがリテラルも判定可
    

    Dim Object変数 As Object
    Debug.Print VarType(Object変数) ' 9:Object
    
    Set Object変数 = Range("A1")
    Debug.Print VarType(Object変数) ' 5:Double
    
    Set Object変数 = Worksheets(1)
    Debug.Print VarType(Object変数) ' 9:Object
    
        ' As Objectは既定のプロパティがあればそれを判定
        ' なければなにかSetされているかに関わらずObject判定



    Dim Variant変数 As Variant
    Debug.Print VarType(Variant変数) ' 0:Empty

    Variant変数 = 1
    Debug.Print VarType(Variant変数) ' 2:Integer

    Set Variant変数 = Range("A1")
    Debug.Print VarType(Variant変数) ' 5:Double

    Set Variant変数 = Nothing
    Debug.Print VarType(Variant変数) ' 9:Object
    
        ' As Variantいま入っている中身の型を表示
        ' 宣言直後の初期値はEmpty
        ' オブジェクトの仕様はAs Objectと同様
        
        
    Variant変数 = Null
    Debug.Print VarType(Variant変数) ' 1:Null
    
    Variant変数 = CVErr(xlErrNA)
    Debug.Print VarType(Variant変数) ' 10:エラー値
    
        ' 何らかの結果で返る「Null,Error」なども判定可
    
    
    Dim Long配列変数() As Long
    Debug.Print VarType(Long配列変数) ' 8195 = 8192:配列 + 3:Long

    Dim Object配列変数() As Object
    Debug.Print VarType(Object配列変数) ' 8201 = 8192:配列 + 9:Object

    Dim Variant配列変数() As Variant
    Debug.Print VarType(Variant配列変数) ' 8204 = 8192:配列 + 12:Variant
    
        ' 配列は配列を示す8192に型の値を足した値が返る
    
    
    ReDim Variant配列変数(0)
    Set Variant配列変数(0) = Range("A1")
    Debug.Print VarType(Variant配列変数) ' 8204 = 8192:配列 + 12:Variant
    Debug.Print VarType(Variant配列変数(0)) ' 5:Double

        ' Variant配列は中身が統一されていてもVariant()
        ' 要素をひとつずつ判定することも可能

    
    Dim 自作クラス変数 As 自作Class
    Debug.Print VarType(自作クラス変数) ' 9:Object
    
    Set 自作クラス変数 = New 自作Class
    Debug.Print VarType(自作クラス変数) ' 9:Object
    
    Dim 自作Type変数 As 自作Type
    'Debug.Print VarType(自作Type変数) ' エラー
    
        ' 自作クラスもオブジェクト判定。
        ' ただしTypeは判定不可。
        

    Debug.Print VarType(自作クラス変数.Long変数) ' 3:Long
    Debug.Print VarType(自作クラス変数.Range変数) ' 9:Object
    Debug.Print VarType(自作Type変数.Long要素) ' 3:Long
    Debug.Print VarType(自作Type変数.Range要素) ' 9:Object
    
        ' Typeやクラスの中見も判定可。Nothingの仕様も同じ

End Sub