変数の型を数値で取得する方法

今回の目標

「Variant型を使ってるけど、どの型のデータが入っているか調べたい!」や「型によって処理を変えたい」と思ったあなたへ。
この記事では、VarType関数の使い方を丁寧に解説します!

目標リスト

  • VarType関数で変数の型を調べられるようになる
  • VarType関数でプログラム制御をできるようになる

VarType関数について

VarType関数とは

VarType関数は、引数のデータをもとに型を判定し、対応する定数を返します。
その返された値を利用して、条件分岐などの制御ができます。

VarType関数の構文

VarType (varname)

VarType関数の戻り値

varname の型に対応した数値が戻ります。
例えば、データの型が Integer型なら「vbInteger」、String型なら「vbString」が戻ります。

※一部、Microsoft社のリファレンスを参照しています。
 【Microsoft公式】 VarType 関数

引数名説明(型名)
vbEmpty0空(未初期化)
vbNull1Null(有効なデータではない)
vbInteger2整数型(Integer)
vbLong3長整数(Long)
vbSingle4単精度浮動小数点数(Single)
vbDouble5倍精度浮動小数点数(Double)
vbCurrency6通貨値(Currency)
vbDate7日付値(Date)
vbString8文字列(String)
vbObject9Object
vbError10エラー値
vbBoolean11ブール値(Boolean)
vbVariant12バリアント型(Variant) ※バリアントの 配列でのみ使用される
vbDataObject13データ アクセス オブジェクト
vbDecimal1410 進値
vbByte17バイト値(Byte)
vbLongLong20LongLong整数(LongLong) ※64 ビット プラットフォームのみ有効
vbUserDefinedType36ユーザー定義型を含むバリアント
vbArray8192配列 ※この関数によって返されたときに常に別の定数に追加される

VarType関数で型を調べる

VarType関数を使うと、指定した値や変数のデータ型を数値で判定できます。
引数には変数だけでなく、数値や文字列を直接指定することも可能です。

サンプルコード

Sub SampleVarType1()
    Dim num As Long
    Dim str As String
    
    num = 10
    str = "abc"
    
    Debug.Print VarType(10) = vbInteger
    Debug.Print VarType(num) = vbLong
    Debug.Print VarType(str) = vbString
End Sub
【実行例】

True
True
True

Variant型のデータから型を判断する

Variant型の変数に格納されている実際のデータから、VarType関数はその型を自動で判定します。 Variant型は「どんな型の値でも代入できる」特殊な型のため、 変数の中身によって実際の型が変わります。 そのため、現在どんな型の値が入っているかを確認したいときに、VarType関数が役立ちます。

サンプルコード

Sub SampleVarType2()
    Dim var As Variant
    
    '何も代入していないので、Empty になる
    Debug.Print VarType(var) = vbEmpty
    
    '整数を代入したので、Integer型 (10 は Integer)
    var = 10
    Debug.Print VarType(var) = vbInteger
    
    '文字列を代入したので、String型になる
    var = "string"
    Debug.Print VarType(var) = vbString
End Sub
【実行例】

True
True
True

If 構文で条件分岐する

Variant型は、異なる型の値を代入できるため、処理を分けたいときにはVarType関数で中身の型を確認します。

サンプルコード

Sub SampleVarType3()
    Dim var As Variant
    
    var = 10      ' var は、Integer型
    var = "ABC"   ' var は、String型
    
    ' var のデータによって処理を制御する
    If VarType(var) = vbString Then
        Debug.Print "var は、String型です"
    ElseIf VarType(var) = vbInteger Then
        Debug.Print "var は、Integer型です"
    End If
End Sub
【実行例】

var は、String型です

配列の型を調べる

配列の変数に格納されているデータから型を判断します。
配列変数では、要素ごとの型と配列そのものの型(配列フラグ付き)を区別して確認できます。

サンプルコード

Sub SampleVarType3()
    Dim arr(2) As Long
    '配列の1要素の型のチェック
    Debug.Print VarType(arr(0)) = vbLong
    '配列自体の型のチェック
    Debug.Print VarType(arr) = vbLong + vbArray
End Sub
【実行例】

True
True

Object型のデータについて

Object型を含む、Workbook型やWorksheet型などのオブジェクト変数は、VarType関数では「Object型」であることしか判別できません。 そのため、VarType関数の戻り値はすべてvbObject(定数値:9)になります。 どの種類のオブジェクトか(WorkbookやRangeなど)を調べたい場合は、TypeName関数を使いましょう。

サンプルコード

Sub SampleVarType5()
    Dim var As Object
    Dim ws As Worksheet
    
    Debug.Print VarType(var) = vbObject
    
    Set var = ThisWorkbook
    Debug.Print VarType(var) = vbObject
    
    Set ws = ThisWorkbook.ActiveSheet
    Debug.Print VarType(ws) = vbObject
End Sub
【実行例】

True
True
True

TypeName関数との違い

TypeName関数とVarType関数の使い分けについてです。

VarType関数と、TypeName関数の比較表

VarType関数と、TypeName関数の比較表です。
VarType関数は数値、TypeName関数は文字列で返ります。

引数VarType関数TypeName関数
100vbInteger (=2)Integer
Long型の変数vbLong (=3)Long
String型の変数vbString (=8)String
WorkbookvbObject (=9)Workbook

テストのしやすさ

VarType関数は、型に応じた数値を戻す関数です。
それに対し、TypeName関数の戻り値は、型の名前を文字列で戻る関数です。
文字列で条件分岐を行うと誤字脱字等によるミスが生じる可能性があります。 このため、TypeName関数はテストに、VarType関数はプログラムの制御に向いています。

サンプルコード

Sub SampleTest1()
    Dim num As Long
    
    'VarType関数で型を確認
    If VarType(num) = vbLong Then
        Debug.Print "num は、Long型です"
    End If
    
    'TypeName関数で型を確認
    If TypeName(num) = "Long" Then
        Debug.Print "num は、Long型です"
    End If
End Sub
【実行例】

num は、Long型です
num は、Long型です

Object 型について

VarType関数は、Object型、Workbook型等すべて「9」が戻ります。
TypeName関数の場合、参照先のデータを確認して、その型の名前を文字列で戻ります。 このとき、参照が設定されていない(Nothingの)オブジェクト変数に対しては、TypeName関数は "Nothing" という文字列を返します。

サンプルコード1

Sub SampleTest1()
    Dim wb As Workbook
    
    Debug.Print "【TypeName(wb)】"
    Debug.Print TypeName(wb)
    Debug.Print "【VarType(wb)】"
    Debug.Print VarType(wb)
End Sub
【実行例】

【TypeName(wb)】
Nothing
【VarType(wb)】
9

サンプルコード2

Sub SampleTest2()
    Dim wb As Workbook
    
    Set wb = ThisWorkbook
    Debug.Print "【TypeName(wb)】"
    Debug.Print TypeName(wb)
    Debug.Print "【VarType(wb)】"
    Debug.Print VarType(wb)
End Sub
【実行例】

【TypeName(wb)】
Workbook
【VarType(wb)】
9

関連リンク

ページの先頭へ