Excel VBAでデータを処理していると、「この変数には文字列が入っているはずなのに、なぜか計算できない」「セルから取得した値が日付なのか数値なのか分からない」といった問題が起こることがあります。
VBAでは、見た目が同じ値でも内部で扱われているデータ型によって処理結果が変わることがあります。特にExcelのセルから値を取得したり、CSVなどの外部データを扱ったりする処理では、想定していたデータ型と実際のデータ型が一致しているとは限りません。
このような場面で役立つのがVarType関数です。
VarType関数を使うと、変数やセルから取得した値が「文字列」「整数」「日付」など、どのデータ型として扱われているのかを調べられます。
この記事では、VarType関数の基本から戻り値の意味、実務でデータ型を確認するときの考え方まで順番に解説します。
✅ VBAのVarType関数とは?データ型を調べる役割を理解する
VarType関数は単純な関数ですが、「データ型を変換する関数」と混同すると使いどころを誤りやすいため注意が必要です。VarTypeが行うのは値の変換ではなく、現在どのような型として扱われているかを調べることです。実務では、エラーが発生してから型の違いに気付くケースも少なくありません。特にVariant型やセルの値を扱う処理では、コードだけを見ても実際のデータ型を判断できないことがあります。
データ型を確認せず、そのまま計算や変換を行うと、型の不一致などの原因になります。そのため、まずVarTypeが何を調べる関数なのかを正確に理解しておくことが重要です。
・VarType関数で現在のデータ型を確認する仕組み
VarType関数は、指定した変数や式がどのデータ型として扱われているのかを表す整数値を返す関数です。
基本的な構文は次のとおりです。
VarType(調べる値や変数)
たとえば、文字列を格納した変数のデータ型を調べる場合は次のように記述できます。
Sub CheckVariableType()
Dim userName As Variant
' 判定対象となる値を設定
userName = "Tanaka"
' 現在のデータ型を確認
Debug.Print VarType(userName)
End Sub
このコードを実行すると、イミディエイトウィンドウには次の値が表示されます。
8
「8」は文字列型(String)を表す値です。
VarType関数では「String」という文字そのものが返ってくるわけではなく、データ型に対応した定数の値が返される点を覚えておきましょう。
・VarType関数で使われる主な戻り値と定数
VarType関数の結果を理解するには、代表的な戻り値を把握しておくと便利です。
| 定数 | 値 | 主な意味 |
|---|---|---|
| vbEmpty | 0 | Empty(未初期化) |
| vbNull | 1 | Null |
| vbInteger | 2 | Integer型 |
| vbLong | 3 | Long型 |
| vbSingle | 4 | Single型 |
| vbDouble | 5 | Double型 |
| vbCurrency | 6 | Currency型 |
| vbDate | 7 | Date型 |
| vbString | 8 | String型 |
| vbObject | 9 | Object型 |
| vbBoolean | 11 | Boolean型 |
| vbVariant | 12 | Variant型 |
| vbDecimal | 14 | Decimal型 |
| vbByte | 17 | Byte型 |
ただし、実際のコードで「8」や「3」といった数値を直接使う書き方はおすすめできません。
たとえば、次のようなコードでも文字列かどうかは判定できます。
If VarType(targetValue) = 8 Then
Debug.Print "文字列です"
End If
しかし、「8」が何を意味しているのかを知らない人にはコードの意図が伝わりにくくなります。
実務では次のように定数を使った方が分かりやすくなります。
If VarType(targetValue) = vbString Then
Debug.Print "文字列です"
End If
vbStringと記述しておけば、後からコードを確認する人にも「文字列型を判定している」とすぐに伝わります。
短く書くことよりも、何を判定しているのかがコードから読み取れることを優先するのが、保守しやすいVBAコードのポイントです。
✅ VBAのVarType関数で変数のデータ型を判定する基本方法
VarType関数は一度実行して結果を表示するだけでも使えますが、実務では「取得した型によって処理を変える」ために利用するケースがあります。ここで注意したいのが、変数を宣言したときの型と、実際に格納されている値の型を混同しないことです。特にVariant型は、格納された値によって内部的に扱われるデータ型が変化します。その性質を理解していないと、「Variantだから常に同じ型」と誤解してしまうことがあります。
また、セルから値を受け取る変数をVariantにしているコードでは、この違いが処理結果に影響することがあります。VarTypeを使って実際の状態を確認すると、こうした型に関する問題を切り分けやすくなります。
・Variant型に異なる値を代入してデータ型を確認する例
VarType関数の特徴が分かりやすいのがVariant型です。
次のコードでは、同じ変数に異なる種類の値を代入してVarTypeの結果を確認します。
Sub CheckVariantType()
Dim targetValue As Variant
' 文字列を格納
targetValue = "Excel VBA"
Debug.Print VarType(targetValue)
' 整数を格納
targetValue = 100
Debug.Print VarType(targetValue)
' 日付を格納
targetValue = Date
Debug.Print VarType(targetValue)
End Sub
処理の流れは次のとおりです。
targetValueをVariant型として宣言する- 文字列を代入してVarTypeで確認する
- 数値を代入して再び確認する
- 日付を代入してデータ型の変化を確認する
重要なのは、変数自体をVariantとして宣言していても、VarTypeではVariantの中に現在格納されている値の種類を確認できることです。
そのため、入力内容が一定ではないデータを扱うときの調査に役立ちます。
・数値ではなく定数を使ってデータ型を判定する
実務ではVarTypeの結果をイミディエイトウィンドウへ表示するだけでなく、条件分岐に利用できます。
Sub CheckDataType()
Dim targetValue As Variant
targetValue = "Sales"
' 文字列として格納されている場合だけ処理する
If VarType(targetValue) = vbString Then
Debug.Print "文字列データです"
Else
Debug.Print "文字列以外のデータです"
End If
End Sub
この書き方では、VarTypeの戻り値である「8」を直接比較せず、vbStringを使用しています。
将来コードを修正する人が別の担当者だったとしても、
VarType(targetValue) = vbString
と書かれていれば、何を確認しているのかを把握しやすくなります。
また、判定対象が文字列だけでなく数値や日付など複数になる場合、If文を何度も重ねるとコードが読みにくくなります。
そのようなケースでは、VarTypeとSelect Caseを組み合わせて処理を整理する方法が有効です。
✅ VBAのVarType関数でセルのデータ型を判定する方法
Excel VBAでは、変数だけでなくセルから取得した値のデータ型を確認したい場面も多くあります。特に注意したいのは、セルに表示されている内容だけではVBA内部のデータ型を正確に判断できないことです。
たとえば「2026/8/26」と表示されていても、日付として認識されている場合と文字列として保存されている場合があります。見た目だけを基準に処理すると、計算や比較、型変換の段階で予期しない結果になることがあります。外部システムから取り込んだExcelファイルやCSV由来のデータでは、このような型の違いが特に起こりやすくなります。
VarTypeを利用してセルの実際の状態を確認できるようにしておくと、原因調査だけでなく安全な処理設計にもつながります。
・セルのValueをVarType関数で確認する方法
セルのデータ型を確認する場合は、Range.ValueをVarType関数へ渡します。
Sub CheckCellValueType()
Dim targetValue As Variant
' A2セルの値を取得
targetValue = Worksheets("Sheet1").Range("A2").Value
' 取得した値のデータ型を確認
Debug.Print VarType(targetValue)
End Sub
処理の流れは次のとおりです。
targetValueをVariant型で宣言する- A2セルの値を取得する
- VarType関数へ取得した値を渡す
- 戻り値から実際のデータ型を確認する
ここでVariant型を使用しているのは、セルに文字列・数値・日付など、どの種類の値が入っているか事前に決められないケースを想定しているためです。
最初からString型などに固定してしまうと、代入時に変換が行われ、元の値がどの型だったのかを確認する目的から外れてしまう場合があります。
データ型を調査するときは、変換する前の状態を確認することが重要です。
セルから取得する値を扱う場合は、ValueとTextの違いも理解しておくと、画面上の表示とVBAが取得する値を混同しにくくなります。⇒【VBA】ValueプロパティとTextプロパティの違いとは?取得値と使用場面を解説
・複数のデータ型をSelect Caseで整理して判定する例
判定するデータ型が増えてくると、If文を繰り返すよりSelect Caseを使用した方が処理の意図を整理しやすくなります。
Sub CheckCellDataType()
Dim targetValue As Variant
' 判定対象となるセルの値を取得
targetValue = Worksheets("Sheet1").Range("A2").Value
Select Case VarType(targetValue)
Case vbString
Debug.Print "文字列です"
Case vbInteger, vbLong, vbSingle, vbDouble, vbCurrency
Debug.Print "数値です"
Case vbDate
Debug.Print "日付です"
Case vbBoolean
Debug.Print "Boolean型です"
Case vbEmpty
Debug.Print "値が設定されていません"
Case Else
Debug.Print "その他のデータ型です"
End Select
End Sub
この書き方のメリットは、どのデータ型に対して何をするのかを一か所で確認できることです。
たとえば後から「日付の場合だけ別処理を追加したい」という仕様変更が発生しても、該当するCaseを確認しやすくなります。
また、数値として扱える型を1つのCaseにまとめている点もポイントです。Integerだけを判定対象にすると、LongやDoubleなどの値を取りこぼす可能性があります。
実務では「VarTypeの結果を確認すること」そのものが目的ではなく、判定結果をその後の処理へ安全につなげることを意識すると使いやすくなります。
✅ VBAのVarType関数を使うときの注意点と型判定の考え方
VarType関数を使えばデータ型を確認できますが、すべてのデータ判定をVarTypeだけで解決しようとするのは注意が必要です。実務でありがちな失敗が、「VarTypeで型が分かれば、その値を目的の型へ安全に変換できる」と考えてしまうことです。
しかし、現在のデータ型を調べることと、値が特定の形式として利用可能かを判定することは別の問題です。たとえば文字列として保存された数字や日付は、VarTypeでは文字列として判定されます。その一方で、その文字列を数値や日付へ変換できるケースもあります。VarType・IsNumeric・IsDate・型変換関数にはそれぞれ異なる役割があるため、目的に応じて使い分けることが重要です。
・VarTypeとIsNumeric・IsDateは判定目的が異なる
たとえば次の値を考えてみます。
Dim targetValue As Variant
targetValue = "100"
"100"は文字列として代入しているため、
Debug.Print VarType(targetValue)
ではvbStringに相当する結果になります。
しかし、
Debug.Print IsNumeric(targetValue)
では、数値として解釈可能かどうかを判定できます。
つまり、
- VarType:現在どのデータ型として扱われているか
- IsNumeric:数値として解釈できるか
- IsDate:日付として解釈できるか
という違いがあります。
ここを混同しないことが重要です。
「セルの現在の型を確認したい」ならVarType、「この値を数値として処理してよいか確認したい」ならIsNumericというように、処理目的から関数を選びます。
VarTypeは現在のデータ型を確認する関数ですが、「数値として扱えるか」「日付として解釈できるか」を確認したい場合は、IsNumericやIsDateを使う方が目的に合っています。
数値判定については【VBA】IsNumeric関数で数値判定する方法|変換エラーを防ぐ実務テクニック、日付判定については【VBA】日付かどうか判定する方法|IsDate・CDate・DateValue・VarTypeの使い分けで詳しく解説しています。
・VarTypeで確認してから型変換する実務上の考え方
データ型が異なるデータを統一して処理したい場合、VarTypeによる確認とCStr・CDblなどの型変換を組み合わせることがあります。
ただし、次のように無条件で変換する設計には注意が必要です。
targetValue = CDbl(targetValue)
文字列や空白など、変換できない値が含まれていればエラーになる可能性があります。
実務では、
- 元データがどのような状態なのか確認する
- 必要に応じてIsNumericやIsDateなどで変換可能か判定する
- 問題がなければ適切な型変換関数を使用する
- 想定外の値については別処理を用意する
という流れで考えると安全です。
VarTypeはこの中で、元データの状態を把握するための入口として利用できます。
データ型を「確認する処理」と「変換する処理」を分けて考えることで、後から仕様が変わった場合にも修正箇所を把握しやすくなります。
VarTypeで現在のデータ型を確認した後、処理に適した型へ変換する場合は、CStr・CLng・CDbl・CDateなどを目的に応じて使い分けます。
各型変換関数の役割をまとめて確認したい場合は、【VBA】変数を文字列型・整数型・小数点型へ変換する方法|型変換関数の実務活用もあわせて確認してみてください。
✅ VBAのVarType関数を実務のデータ処理で活用するポイント
VarType関数は単体で見ると地味な機能ですが、データの状態が一定ではない実務処理では役立つ場面があります。特に複数の担当者が入力するExcelファイルや、外部から受け取ったデータでは、見た目が同じでも内部的な型が異なることがあります。この状態を無視して処理を続けると、特定の行だけエラーになるなど、再現しにくい不具合につながる場合があります。
一方で、すべての値にVarTypeを使えばよいわけではなく、型が明確な処理では適切な型で変数を宣言する方がコードは分かりやすくなります。VarTypeは「何でもVariantで受け取るための関数」ではなく、型が一定でない値を確認・分類するときに利用するのがポイントです。用途を限定して使うことで、コードの可読性を保ちながらデータ処理を安定させられます。
・VarTypeが役立つ実務場面を整理する
VarTypeは、次のような場面で特に活用しやすい関数です。
- セルから取得した値のデータ型を調査する
- Variant型に格納された値の種類を確認する
- 文字列・数値・日付などによって処理を分岐する
- 外部データを取り込んだ後の状態を確認する
- 型の不一致が疑われるエラーを調査する
一方、データ型が最初から明確な場合までVarTypeで判定する必要はありません。
たとえば「処理件数」を格納する変数であれば、目的に適したLong型などで宣言した方が設計意図をコード上で明確にできます。
VarTypeは、型が分からない値を調べる・複数種類の値を分類する必要がある場面に絞って使用すると、実務でも扱いやすくなります。
また、VarTypeで判定した後にデータ型を変換したい場合は、CStr・CLng・CDbl・CDateなどの型変換関数を目的に合わせて使用します。
特に文字列へ統一する処理については【VBA】CStr関数で値を文字列に変換する方法|型変換で失敗しない実務設計、数値へ変換する処理については【VBA】CDbl関数の使い方|文字列を数値へ変換する方法と実務活用で、それぞれ詳しく解説しています。
「判定」と「変換」を別の処理として理解しておけば、データ型を扱うVBAコードをより安全に設計できます。
✅ まとめ:VBAのVarType関数でデータ型を正しく判定しよう
VarType関数は、変数やセルから取得した値がVBA内部でどのデータ型として扱われているのかを確認するための関数です。特にVariant型やExcelセルのように、実行時まで値の種類が確定しないデータを扱う場合に役立ちます。単純に戻り値を表示するだけでなく、Select Caseと組み合わせればデータ型ごとの処理も整理できます。
ただし、VarTypeは値を変換できるかどうかを判定する関数ではありません。IsNumeric・IsDate・CStr・CDblなどとは目的が異なるため、役割を分けて使用することが大切です。
- VarType関数では変数や値の現在のデータ型を確認できる
- 戻り値の数値を直接比較せず、
vbStringやvbDateなどの定数を使うと読みやすい - Variant型では、現在格納されている値の種類を調べられる
- Excelセルは見た目だけでなく、内部的なデータ型を確認することが重要
- 複数の型を判定する場合はSelect Caseを使うと処理を整理しやすい
- VarTypeとIsNumeric・IsDateでは判定する目的が異なる
- データ型の確認とCStr・CDblなどによる型変換は分けて考える
データ型を意識してVBAを組めるようになると、「なぜこの値だけ処理できないのか」といったトラブルの原因を切り分けやすくなります。VarTypeを単なる確認用の関数として覚えるのではなく、データを安全に判定して次の処理へ渡すための手段として活用していきましょう。