1. はじめに
Excel VBAは導入しやすく、実務でも使用しやすい言語です。
そして比較的ゆるい言語でもあります。
その「ゆるさ」は初心者にとっては優しさであり、
一方で実務では 不具合を内部に抱え込んだまま処理が進む
原因にもなります。
本記事では、VBAで非常によく使われる型である Variant について、
「なぜ避けられないのか」と
「なぜそのまま使うと危険なのか」を切り分けて整理します。
2. Variant型とは
Variant は、どんな型の値でも保持できる変数の型であり、
宣言時に型を指定しなかった場合にも、自動でVariant型になります。
Sub sample()
Dim v As Variant
v = 123
v = "ABC"
v = #2026/1/1#
End Sub
このように、数値・文字列・日付などあらゆる型を代入できます。
これは一見すると「型を気にしなくていい便利な型」に見えます。
3. Variantの使用は実務で「避けられない」
まず前提として、
Range.Value / Value2 の戻り値は必ず Variantになる。
Sub sample()
Dim arr As Variant
arr = Range("A1:B2").Value
End Sub
セル範囲取得の戻り値は 必ず Variantであり、しかも 2次元配列になります。
※要素の型はセル内容に依存(数値・文字列・日付が混在)
Sub sample()
Dim arr() As Long
arr = Range("A1:B2").Value ' ← エラーになります
End Sub
これは VBA の仕様であり、Variantを使わずに受け取ることはできません。
4. 問題は「Variantを使うこと」ではない
ここで誤解しやすい点があります。
❌ Variant は使用してはいけない
⭕ Variant のまま使い続けてはいけない
Variant は 受け口としては必須 です。
問題になるのは、受け取った Variantを
型を確定しないまま処理の中心に据える
ことです。
5. なぜ危険なのか①
勝手に型が変わる
Sub sample()
Dim v As Variant
v = "10"
v = v + 1
End Sub
vに 文字列 "10"を代入していますが、
2回目の代入で数値 11へと 暗黙変換されます。
同じコードでも、
データ次第で結果が変わる
これが Variant の怖さです。
6. なぜ危険なのか②
Empty / Null / Nothingが混在する
Variant には、他の型にはない「状態」があります。
-
Empty:未初期化 -
Null:無効な値(DBなど) -
Nothing:オブジェクト未参照
If v = "" Then
この判定では、
Empty
0
空文字
などが 区別できません。
判定に Variant を使うと、ロジックが破綻しやすくなります。
7. 対策①
Variantは「入口」まで
Sub sample()
Dim src As Variant
src = Range("A1:A100").Value'Variant型に代入
Dim i As Long
Dim value As Long
For i = 1 To UBound(src, 1)
value = CLng(src(i, 1)) ' Long型に変換して受け取る
' 処理
Next i
End Sub
- 受け取り:
Variant(不可避) - 処理:明示的な型
この分離が重要です。
8. 対策②
Variantを状態管理に使わない
Sub sample()
Dim result As Variant
result = ""
End Sub
この時点で、
- 未設定なのか
- 空文字なのか
- 0なのか
判別不能になります。
状態管理には、明確な型と初期値を使うべきです。
9. まとめ
- Variant は避けられない場面がある
- しかしそのまま使い続けるべきではない
- 入口で受け、出口で型を確定する
- 処理の中心に置かない
Variantは「入口専用」、判定が必要なロジックには持ち込まない。
これを守るだけで、
Excel VBAの事故率は大きく下がります。