1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

知らないと怖いExcelVBAの穴9 ~便利そうに見えて一番危ない型(Variant)~

Last updated at Posted at 2026-01-08

1. はじめに

Excel VBAは導入しやすく、実務でも使用しやすい言語です。
そして比較的ゆるい言語でもあります。

その「ゆるさ」は初心者にとっては優しさであり、
一方で実務では 不具合を内部に抱え込んだまま処理が進む
原因にもなります。

本記事では、VBAで非常によく使われる型である Variant について、
「なぜ避けられないのか」と
「なぜそのまま使うと危険なのか」を切り分けて整理します。

2. Variant型とは

Variant は、どんな型の値でも保持できる変数の型であり、
宣言時に型を指定しなかった場合にも、自動でVariant型になります。

VBA
Sub sample()
    Dim v As Variant
    v = 123
    v = "ABC"
    v = #2026/1/1#
End Sub

このように、数値・文字列・日付などあらゆる型を代入できます。
これは一見すると「型を気にしなくていい便利な型」に見えます。

3. Variantの使用は実務で「避けられない」

まず前提として、

Range.Value / Value2 の戻り値は必ず Variantになる。

VBA
Sub sample()

    Dim arr As Variant
    arr = Range("A1:B2").Value

End Sub

セル範囲取得の戻り値は 必ず Variantであり、しかも 2次元配列になります。
※要素の型はセル内容に依存(数値・文字列・日付が混在)

VBA
Sub sample()

    Dim arr() As Long
    arr = Range("A1:B2").Value   ' ← エラーになります

End Sub

これは VBA の仕様であり、Variantを使わずに受け取ることはできません。

4. 問題は「Variantを使うこと」ではない

ここで誤解しやすい点があります。

Variant は使用してはいけない
Variant のまま使い続けてはいけない

Variant は 受け口としては必須 です。
問題になるのは、受け取った Variant

型を確定しないまま処理の中心に据える

ことです。

5. なぜ危険なのか①

勝手に型が変わる

VBA
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:オブジェクト未参照
VBA
If v = "" Then

この判定では、

Empty

0

空文字

などが 区別できません。
判定に Variant を使うと、ロジックが破綻しやすくなります。

7. 対策①

Variantは「入口」まで

VBA
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を状態管理に使わない

VBA
Sub sample()
    Dim result As Variant
    result = ""
End Sub

この時点で、

  • 未設定なのか
  • 空文字なのか
  • 0なのか

判別不能になります。

状態管理には、明確な型と初期値を使うべきです。

9. まとめ

  • Variant は避けられない場面がある
  • しかしそのまま使い続けるべきではない
  • 入口で受け、出口で型を確定する
  • 処理の中心に置かない

Variantは「入口専用」、判定が必要なロジックには持ち込まない。

これを守るだけで、
Excel VBAの事故率は大きく下がります。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?