【Excel VBA】バリアント(Variant)型の変数の解説

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 typeobjecttype型のオブジェクト
Byteバイト型
Integer整数型
Long長整数型
Single単精度浮動小数点数型
Double倍精度浮動小数点数型
Currency通貨型
Decimal10進数型
Date日付型
String文字列型
Booleanブール型
Errorエラー型
Empty初期化されていない
Null有効な値がない
Objectオブジェクト
Unknown不明な型のオブジェクト
Nothingオブジェクトを参照しないオブジェクト変数

配列の場合は返される文字列の後に括弧を付けた文字列が返されます。

foo = 2
MsgBox TypeName(foo)
bar = "3"
MsgBox TypeName(bar)

これは次のように表示されます。

TypeNameの結果

VarType関数

TypeName関数はどちらかというと人が見るものです。プログラムではVarType関数が使いやすいでしょう。構文は次の通りです。

VarType(Variant型変数)

戻り値は次の定数またはそれらの数の合計が返されます。

定数データ型
vbEmpty0未初期化
vbNull1Null
vbInteger2整数型
vbLong3長整数型
vbSingle4単精度浮動小数点数型
vbDouble5倍精度浮動小数点数型
vbCurrency6通貨型
vbDate7日付型
vbString8文字列型
vbObject9オブジェクト
vbError10エラー型
vbBoolean11ブール型
vbVariant12Variant型
vbDataObject13データアクセスオブジェクト
vbDecimal1410進数型
vbByte17バイト型
vbLongLong20LongLong型
vbUserDefinedType36ユーザー定義型を含むVariant
vbArray8192配列
foo = 2
MsgBox VarType(foo)
bar = "3"
MsgBox VarType(bar)

これは次のように表示されます。

VarTypeの結果

まとめ

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

よかったらシェアしてね!
  • URLをコピーしました!
目次