変数の型を数値で取得する方法
今回の目標
「Variant型を使ってるけど、どの型のデータが入っているか調べたい!」や「型によって処理を変えたい」と思ったあなたへ。
この記事では、VarType関数の使い方を丁寧に解説します!
目標リスト
- VarType関数で変数の型を調べられるようになる
- VarType関数でプログラム制御をできるようになる
VarType関数について
VarType関数とは
VarType関数は、引数のデータをもとに型を判定し、対応する定数を返します。
その返された値を利用して、条件分岐などの制御ができます。
VarType関数の構文
VarType (varname)
VarType関数の戻り値
varname の型に対応した数値が戻ります。
例えば、データの型が Integer型なら「vbInteger」、String型なら「vbString」が戻ります。
※一部、Microsoft社のリファレンスを参照しています。
【Microsoft公式】
VarType 関数
| 引数名 | 値 | 説明(型名) |
|---|---|---|
| vbEmpty | 0 | 空(未初期化) |
| vbNull | 1 | Null(有効なデータではない) |
| vbInteger | 2 | 整数型(Integer) |
| vbLong | 3 | 長整数(Long) |
| vbSingle | 4 | 単精度浮動小数点数(Single) |
| vbDouble | 5 | 倍精度浮動小数点数(Double) |
| vbCurrency | 6 | 通貨値(Currency) |
| vbDate | 7 | 日付値(Date) |
| vbString | 8 | 文字列(String) |
| vbObject | 9 | Object |
| vbError | 10 | エラー値 |
| vbBoolean | 11 | ブール値(Boolean) |
| vbVariant | 12 | バリアント型(Variant) ※バリアントの 配列でのみ使用される |
| vbDataObject | 13 | データ アクセス オブジェクト |
| vbDecimal | 14 | 10 進値 |
| vbByte | 17 | バイト値(Byte) |
| vbLongLong | 20 | LongLong整数(LongLong) ※64 ビット プラットフォームのみ有効 |
| vbUserDefinedType | 36 | ユーザー定義型を含むバリアント |
| vbArray | 8192 | 配列 ※この関数によって返されたときに常に別の定数に追加される |
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関数 |
|---|---|---|
| 100 | vbInteger (=2) | Integer |
| Long型の変数 | vbLong (=3) | Long |
| String型の変数 | vbString (=8) | String |
| Workbook | vbObject (=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
