値が現在何型かどうかを調べる方法のひとつとして、
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