Excel VBA | 超初心者(Excel操作+マクロ体験):基本文法 – Variantの特徴

Excel VBA VBA
スポンサーリンク

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
VB

A1 に数値が入っていれば数値として、
文字列が入っていれば文字列として、
日付が入っていれば日付として、
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
VB

VBAは 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が勝手に型変換してくれる

という、柔軟さと危うさのセットです。

セル範囲の配列や、型が混在するデータを扱うときには頼もしい味方ですが、
普段のロジック部分で多用すると、「何が何型なのか」が見えなくなり、
デバッグが一気に難しくなります。

タイトルとURLをコピーしました