Variantは「なんでも入るけど、扱い注意な箱」
Variant型は、VBAの中で「ほぼ何でも入る特別な箱」です。
数値、文字列、日付、真偽値、オブジェクト参照、Empty、Null…と、ほとんどの値を一つの変数で扱えます。
一見すると「最強で便利」に見えますが、
きちんと特徴を理解せずに多用すると、バグの温床になります。
だからこそ、
「Variantはどういう性格の型なのか」
「どんな場面なら“あえて”使う価値があるのか」
を、超初心者のうちにちゃんと押さえておくのはかなり重要です。
Variantの基本的な性質
なんでも入る=中身の型が“変わる”
Variant型の変数は、代入する値によって中身の型が変わります。
Sub VariantBasic()
Dim v As Variant
v = 10 ' 今は「数値」としての10
MsgBox v
v = "10" ' 今度は「文字列」としての"10"
MsgBox v
v = #2025/1/1# ' 今度は「日付」としての2025/1/1
MsgBox v
End Sub
VB同じ v という変数でも、
代入するたびに「数値」「文字列」「日付」と中身の型が変わっていきます。
VBAは内部で「今このVariantは何型として扱うべきか?」を判断しながら動いています。
これが柔軟さであり、同時に“怖さ”の源でもあります。
宣言しない変数は自動的にVariantになる
Option Explicit を使わずに、型を付けずに変数を書くと、VBAはそれを自動的に Variant とみなします。
Sub NoDeclare()
x = 10 ' x は暗黙に Variant
x = "ABC" ' 途中で文字列にもなる
End Sub
VBこの「勝手にVariantになる」仕様が、
スペルミスや意図しない型混在を生みやすくします。
だからこそ、Option Explicit と「きちんと型を付けた宣言」が大事になるわけです。
Variantが便利に見える瞬間と、その裏側
便利に見えるパターン:とりあえず何でも入る
例えば、セルの値をそのまま受け取りたいとき、Variantはとても楽です。
Sub ReadCell()
Dim v As Variant
v = Range("A1").Value
MsgBox v
End Sub
VBA1 に数値が入っていれば数値として、
文字列が入っていれば文字列として、
日付が入っていれば日付として、
v が自動的に“いい感じに”受け取ってくれます。
「セルの中身の型がまちまち」「とりあえずそのまま持ちたい」
という場面では、Variantはかなり相性がいいです。
危険なパターン:暗黙の型変換で“意図しない結果”
一方で、こんなコードを見てください。
Sub VariantTrouble()
Dim a As Variant
Dim b As Variant
Dim c As Variant
a = "10"
b = 5
c = a + b
MsgBox c
End Sub
VBここで c に何が入るか、直感で分かるでしょうか。
VBAは「文字列”10″と数値5を足す」という状況を見て、
内部で型変換を行います。
多くのケースでは、”10″ を数値 10 に変換して、
10 + 5 = 15 として扱ってくれますが、
状況によっては思わぬ変換が起きることもあります。
Variantを多用すると、
「どのタイミングでどの型として扱われているか」が見えにくくなり、
バグの原因がとても追いづらくなります。
Variantが特に“役に立つ”場面
セル範囲を一括で配列として受け取るとき
Variantの一番の“本領発揮ポイント”は、
セル範囲を丸ごと配列として受け取るときです。
Sub RangeToArray()
Dim data As Variant
Dim i As Long
data = Range("A1:A5").Value ' 2次元配列として入る
For i = 1 To 5
MsgBox data(i, 1)
Next i
End Sub
VBここで data は Variant ですが、中身は「2次元配列」になっています。
セルの値が数値でも文字列でも、まとめて受け取れるのが強みです。
このように、
複数セルを一括で扱いたい
中身の型が混在している可能性がある
という場面では、Variantは“最適な選択肢”になります。
関数の戻り値が状況によって変わるとき
例えば、「見つかったら値を返す、見つからなかったら空を返す」ような関数を書くとき、
戻り値の型を Variant にしておくと柔軟に書けます。
Function FindValueOrEmpty(rng As Range, key As String) As Variant
Dim c As Range
Set c = rng.Find(What:=key, LookAt:=xlWhole)
If c Is Nothing Then
FindValueOrEmpty = "" ' 見つからなければ空文字
Else
FindValueOrEmpty = c.Value ' 見つかればその値
End If
End Function
VB戻り値の型を String にしてしまうと、
「数値を返したいときに困る」などの制約が出ますが、
Variant なら柔軟に対応できます。
ただし、「何を返しうるのか」はコメントや命名でしっかり伝える必要があります。
Variantを乱用したときに起こる“よくある事故”
スペルミスがそのまま新しい変数になる
Option Explicit を使わず、型も付けずに書いていると、
スペルミスした瞬間に「新しいVariant変数」が勝手に生まれます。
Sub BadExample()
total = 10
toatl = total + 5 ' スペルミス
MsgBox toatl ' 15ではなく 5 になる可能性
End Sub
VBVBAは total と toatl を別の変数(どちらも Variant)として扱います。
エラーも出ません。
これは、初心者だけでなくベテランでもやらかす“最悪の罠”です。
型のつもりが崩れていく
最初は「数値として使うつもり」だった変数に、
途中で文字列を代入してしまうこともあります。
Sub MixedTypes()
Dim v As Variant
v = 10
v = v & "円" ' ここで文字列に変わる
v = v + 5 ' ここで挙動がややこしくなる
End Sub
VBこのように、Variantは「型が変わる」ことを許してしまうので、
意図しないタイミングで“数値→文字列”“文字列→数値”の変換が起きます。
超初心者向け「Variantの付き合い方ルール」
基本方針:Variantは“最後の手段”に近い
まず大前提として、
「何も考えずに全部Variant」は絶対にやめたほうがいいです。
そのうえで、次のようなルールを持つとバランスが良くなります。
普段は Long / Double / String / Date / Boolean をちゃんと使い分ける
セル範囲を配列で受けるときだけ、意識的に Variant を使う
戻り値の型がどうしても一つに決められない関数だけ、慎重に Variant を使うOption Explicit を必ず付けて、「暗黙のVariant」を封じる
Variantは「危険だから使うな」ではなく、
「強力だからこそ、使いどころを絞る」型です。
まとめ:Variantを“怖がらず、甘やかさず”使えるようになる
Variantの本質は、
なんでも入る
中身の型が変わる
VBAが勝手に型変換してくれる
という、柔軟さと危うさのセットです。
セル範囲の配列や、型が混在するデータを扱うときには頼もしい味方ですが、
普段のロジック部分で多用すると、「何が何型なのか」が見えなくなり、
デバッグが一気に難しくなります。
