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 | オブジェクト型 |