【VBA(Excelマクロ)】Variant型を徹底解説!初心者用サンプルコード付き

スポンサードリンク
VBA

この記事を読んでわかること

  • Variantとは何なのかがわかる
  • Variantの使い方がわかる
  • Variantを使う際の注意点やよくあるエラーを知れる

※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。

-著者情報-
名前:Utatane
VBA(マクロ)歴:3年
Excel使用歴:15年以上
ひとこと:初心者だった当時に戻った気持ちになって解説いたします

スポンサードリンク

VBA(Excelマクロ)のVariantとは?

Variantは、VBAにおける変数の型の一つで、
数値や文字列など、どんな値でも代入することができる便利な型です。

VBAの変数には「型」という概念があります。
例えば「Integer型」なら整数「String型」なら文字列といったように、対応する値しか受け付けません。
(Integer型に文字列は代入できない!)

しかしVariant型は、どんな値でも代入することができます。
わかりやすく言えばオールマイティ型(トランプで言うとジョーカー)のようなものでしょうか。

変数に値を代入する際、型が違うとエラーが発生します(Integer型に文字列を代入しようとした場合など)
しかしながらVariant型ならどんな値でも代入できますので、エラーが発生する頻度をグッと減らすことができます。

ただし、それが逆にデメリットになる場合もあります。
例えば、数値を代入して計算したかったのに、誤って文字列が入ってしまって計算できなかったという事態も発生します。
なんでもかんでもVariant型を使うのは避けましょう。

ではそんなVariant型の使い方について見ていきましょう。

スポンサードリンク

Variant型の使い方

Variant型は他の型と同様、宣言をすることから始まります。

宣言(初期値・初期化)

▼Variant型の宣言
Dim 変数名 As Variant

▼例
Dim category As Variant

VBAの特性上、変数の宣言を省略することも可能です。
宣言を省略した変数は「Variant型」として扱われます。
「じゃあ宣言しなくてもいいのでは?」と思うかもしれませんが、宣言することをおすすめします。
なぜならスペルミスにより、必要のない変数が作り出されてしまう場合があるからです。
詳しい理由は「Option Explicit」の記事をご参考ください。

Variant型を宣言した段階の初期値はEmpty(空っぽ)となります。

Sub 初期値()
    Dim category As Variant
    Debug.Print category
End Sub

前提知識{「Debug.Print」で値を表示させる方法

なのでVariant型の変数を初期化する際は、Empty状態に戻してください。

Sub 初期値()
    Dim category As Variant
    category = Empty ' 初期化
End Sub

その後のVariant型の使い方は他の型と基本的には同じです。
代入した値が整数ならInteger型のように扱うことができ、文字列ならString型のように扱うことができます。

型変換

Variant型として宣言した変数を別の型に変換することも可能です。
下記VBAコードは、「CStr」関数を使ってVariant型をString型に変換した例です。

Sub 型変換()
    Dim category As Variant ' Variant型の変数を宣言
    Debug.Print VarType(category) ' 型の確認 0なのでVariant型
    category = CStr(category) ' 型変換
    Debug.Print VarType(category) ' 型の確認 8なのでString型
End Sub

「VarType」は変数の型を確認することができる関数です。
出力値に応じて型を確認できます。

【VarTypeの出力値と対応する型】

  • 0:Variant
  • 2:Integer
  • 5:Double
  • 7:Date
  • 8:String
  • 9:Object

【型変換できる関数】

  • CStr:String型(文字列型)に変換
  • CInt:Integer型(整数型)に変換
  • CDate:Date型(日付型)に変換

配列として使う

前提知識{配列の概念と使い方

Variant型として宣言した変数を配列として扱うこともできます。
下記VBAコードは簡単な一例です。

Sub 配列()
    Dim category As Variant
    category = Array(1, "あ", 0.1)
    Debug.Print category(0)
    Debug.Print category(1)
    Debug.Print category(2)
End Sub

Variant型の特性を活かして、各要素に数値や文字などいろんな型の値を代入することができます。
また、要素数を指定しなくてよいため、1ヶ月の日数など、要素数が変化する場合に便利です。

空判定(empty・null)

Variant型の空判定をする場合は、以下のように記述してください。

▼Empty判定(Emptyかどうかを判定)
IsEmpty

▼Null判定(Nullかどうかを判定)
IsNull

▼空文字判定(空文字かどうかを判定)
=""
  • empty:宣言後に何も代入していない状態(未使用の初期状態)
  • null:値が存在しない
  • 空文字:空欄(””)

3つの使用例を載せておきます。

前提知識{条件分岐(If)

Sub エンプティ判定()
    Dim category As Variant ' Empty(初期状態)
    
    If IsEmpty(category) Then ' Emptyを判定
        Debug.Print "Emptyです"
    End If

End Sub
Sub ヌル判定()
    Dim category As Variant
    
    category = Null ' Nullを代入
    If IsNull(category) Then ' Nullを判定
        Debug.Print "Nullです"
    End If

End Sub
Sub 空文字判定()
    Dim category As Variant
    
    category = "" ' 空文字を代入
    If category = "" Then ' 空文字を判定
        Debug.Print "空文字です"
    End If

End Sub
スポンサードリンク

Variant型を使う際の注意点

便利なVariant型ですが、扱う際に注意すべきところがあります。

バグの原因になりやすい

Variant型は時として予期せぬバグを引き起こす場合があります。
例えば日付を代入しようとしたが日付として認識されず、おかしな処理になってしまう場合などです。
Variant型は型が不明確なため、使い過ぎには注意しましょう。

代入した値にスペースが入る場合がある

例えばVariant型の変数に整数である「123」を代入した場合、「 123」のように半角スペースが入る場合があります。
不要な場合はTrim関数で除去しましょう。

処理が遅くなる場合がある

Variant型は、処理ごとに毎回型を判別する性質があります。
これにより、全体的な処理が遅くなってしまいます。

小さなプログラムでは気にならないレベルですが、
大きなシステムを作成する場合は気にしておきましょう。

スポンサードリンク

Variant型でよくあるエラー

型が一致しません

型が一致しません

Variant型でも型不一致エラーは起こります。
例えば下記のように、文字列を代入したVariant型変数に数値を足して計算しようとした場合などです。

Sub 型が一致しません()
    Dim category As Variant
    category = "Utatane"
    Debug.Print category + 1   ' エラー!文字列 + 数値はNG
End Sub

Variant型でも内部的には文字列と数値は別の型と判別していますので、注意が必要です。

インデックスが有効範囲にありません

インデックスが有効範囲にありません

配列の要素を超える添字を操作した場合などに発生します。
例えば下記のような場合です。

Sub インデックスが有効範囲にありません()
    Dim category As Variant
    category = Array(1, 2, 3)
    Debug.Print category(3)  ' → エラー!添字は0~2
End Sub

詳細は下記記事をご参考ください。

配列の最大値や最小値を取得できる「UBound」や「LBound」を使うことでエラーを回避できます。

スポンサードリンク

最後に

VBA(Excelマクロ)のVariant型について解説いたしました。

当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。

最後までお読みいただき、ありがとうございました。がんばってください!

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