Variant型の変数はほとんどのデータ型を格納できるデータ型です。可能であれば文字列などの特定のデータ型の使用が推奨されますが、Variant型を使用する場面に遭遇することもあるでしょう。ここではVariant型を使用するために必要な知識を解説します。
Variant型の変数を宣言する
Variant型の変数を宣言するには、Dim、Private、Public、、Staticなどのステートメントで明示的にデータ型を指定しない、あるいは明示的にVariant型で宣言します。
Dim var
Dim var As Variant
Variant型の変数には固定長文字列型のデータ以外のすべてのデータ型を格納することができます。Empty、Error、Nothing、Nullも格納できます。
数値を格納するVariant型は、元のデータ型で保持されます。例えばInteger型をVariant型の変数に代入した場合は、それはInteger型として扱われます。ただし、Byte、Integer、Long、Singleを格納しているVariant型変数に対する算術演算の結果、元のデータ型の範囲を超えると次に大きいデータ型に昇格されます(ByteはInteger、IntegerはLong、LongとSingleはDoubleへ昇格する)。
Currency、Decimal、Doubleの値が格納されているVariant型変数がそれぞれの範囲を超えるとエラーになります。
Variant型の変数がEmptyを値として持つ場合、これは初期化されていない(初期値が代入されていない)ことを示します。Emptyの値を持つVariant型変数が数値コンテキストで評価されると0、文字列コンテキストで評価されると空文字列("")になります。
Nullは変数に有効なデータが含まれていないことを示します。Variant型変数がNullかどうかはIsNull関数を使用します。
Dim aVar, result
result = IsNull(aVar) ' False
aVar = Null
result = IsNull(aVar) ' True
Nothingは、オブジェクト変数が参照するオブジェクトを解除するために使用されます。オブジェクト変数にNothingを割り当てるにはSetステートメントを使います。
Set obj = Nothing
変数のデータ型を確認する
Variant型の変数に値を代入すると、その値に従って内部的に型変換が行われます。変換された形式を「内部処理形式」といいます。変数の内部的なデータ型を確認するにはTypeName関数またはVarType関数を使用します。
Variant型の変数には様々なデータ型を格納できます。格納されたデータ型を把握していないと思わぬ結果を招くことがあります。例えば次のコードを見てください。
Dim foo, bar
foo = 2
bar = 3
MsgBox foo + bar ' 5と表示
foo = "2"
bar = "3"
MsgBox foo + bar ' 23と表示
はじめ2つのVariant型の変数には数値が格納されているので、最初のメッセージボックスには5が表示されます。次のそれぞれの変数に文字列が格納されるので、メッセージボックスには2つの文字列が結合されて23と表示されます。
格納されているデータ型を確認するにはTypeName関数またはVarType関数を使用できます。
TypeName関数
TypeName関数を使うと格納されているデータ型を文字列で返します。構文は次の通りです。
TypeName(Variant型変数)
返される文字列は次の通りです。
返される文字列 | データ型 |
---|---|
object type | objecttype型のオブジェクト |
Byte | バイト型 |
Integer | 整数型 |
Long | 長整数型 |
Single | 単精度浮動小数点数型 |
Double | 倍精度浮動小数点数型 |
Currency | 通貨型 |
Decimal | 10進数型 |
Date | 日付型 |
String | 文字列型 |
Boolean | ブール型 |
Error | エラー型 |
Empty | 初期化されていない |
Null | 有効な値がない |
Object | オブジェクト |
Unknown | 不明な型のオブジェクト |
Nothing | オブジェクトを参照しないオブジェクト変数 |
foo = 2
MsgBox TypeName(foo)
bar = "3"
MsgBox TypeName(bar)
これは次のように表示されます。

VarType関数
TypeName関数はどちらかというと人が見るものです。プログラムではVarType関数が使いやすいでしょう。構文は次の通りです。
VarType(Variant型変数)
戻り値は次の定数またはそれらの数の合計が返されます。
定数 | 値 | データ型 |
---|---|---|
vbEmpty | 0 | 未初期化 |
vbNull | 1 | Null |
vbInteger | 2 | 整数型 |
vbLong | 3 | 長整数型 |
vbSingle | 4 | 単精度浮動小数点数型 |
vbDouble | 5 | 倍精度浮動小数点数型 |
vbCurrency | 6 | 通貨型 |
vbDate | 7 | 日付型 |
vbString | 8 | 文字列型 |
vbObject | 9 | オブジェクト |
vbError | 10 | エラー型 |
vbBoolean | 11 | ブール型 |
vbVariant | 12 | Variant型 |
vbDataObject | 13 | データアクセスオブジェクト |
vbDecimal | 14 | 10進数型 |
vbByte | 17 | バイト型 |
vbLongLong | 20 | LongLong型 |
vbUserDefinedType | 36 | ユーザー定義型を含むVariant |
vbArray | 8192 | 配列 |
foo = 2
MsgBox VarType(foo)
bar = "3"
MsgBox VarType(bar)
これは次のように表示されます。

まとめ
可能な限りVariant型ではなく特定のデータ型を使うことが推奨されます。速度やメモリ効率もVariant型は不利になります。