MENU

【VBAの基礎】Emptyの分かりにくさ

VBAの "Empty" について、なぜ分かりにくいのか、ちょっと考えてみました。

1.Emptyとは

VBAのデータ型の1つにVariant型があります。Variant型は宣言するとき中身を指定する必要 がないので、厳しい型宣言を好む人によっては厄介なデータ型です。

EmptyはVariant型の変数の初期値です。VarType関数を使って宣言直後のデータ型を調べてみると0(=vbEmpty)が返ってくるので初期値はEmptyであることが分かります(VarType関数の戻り値についてはこのページの最後をご覧ください)。

Dim foo As Variant
MsgBox VarType(foo)    '0(=vbEmpty)が表示される

2.Variant型の変数に値を代入したとき

Variant宣言した変数に値を代入するとVarTypeはどうなるのでしょうか。

Dim foo As Variant
foo = 123
MsgBox VarType(foo)    '2(=vbInteger)が表示される

Dim bar As Variant
bar = "abc"
MsgBox VarType(bar)    '8(=vbString)が表示される

代入した値によってVarTypeが変化することが分かります。変数を初期化すると元のEmptyに戻ります。

Dim baz As Variant
baz = 123
~~~~
baz = Empty
MsgBox VarType(baz)    '0(=vbEmpty)が表示される

3.暗黙の型変換

数値や文字列などで宣言した変数にEmptyを代入するとEmptyを数値はゼロ、文字列は長さゼロの文字列に「暗黙の型変換」したものが代入されます。

Dim wInt As Integer
wInt = Empty           'wInt = CInt(Empty) が実行される
MsgBox wInt            '0が表示される

Dim wStr As String
wStr = Empty           'wStr = CStr(Empty) が実行される
MsgBox wStr            '""が表示される

Dim wDate As Date
wDate = Empty          'wDate = CDate(Empty) が実行される
MsgBox Format(wDate, "YYYY/MM/DD")    '1899/12/30が表示される

Dim wObj As Object
Set wObj = Empty       'さすがにこれはエラー

一見「何?」と思うようなコードにも理屈がちゃんとあるので、ちょっと穿ってみました。




※ VarTypeの戻り値については以下のようにEnum定義されています(10以降は省略)

Enum 説明
0 vbEmpty Empty(空)
1 vbNull Null(無効)
2 vbInteger 整数型
3 vbLong 長整数型
4 vbSingle 単精度実数型
5 vbDouble 倍制度実数型
6 vbCurrency 通貨型
7 vbDate 日付型
8 vbString 文字列型
9 vbObject オブジェクト型