ExcelVBAで自動化処理を組んでいると、「この値は数値として扱っていいのかどうか」を判定しなければならない場面は非常に多くあります。
見た目は明らかに数値に見えるのに、計算するとエラーになる、比較結果がおかしくなる、処理の途中で止まる――こうしたトラブルは、数値判定を正しく行っていないこと が原因で発生します。
特に、CSVや外部システムから取り込んだデータ、配列やVariant型で一括処理するデータでは、
- 数値と文字列が混在している
- 空白・Null・エラー値が含まれている
- 「数値っぽい文字列」が大量に含まれている
といった状況が珍しくありません。
この記事では、VBAで「数値か否か」を判定する方法を、
IsNumeric / TypeName / VarType / 変換チェック / 比較処理との関係
という観点から、実務での使い分けを前提に徹底解説します。
単なる関数の紹介ではなく、
「どの方法を、どの場面で使うべきか」
「なぜその判定が必要なのか」
まで理解できる内容になっています。
目次
- ✅ VBAで数値判定が重要になる理由
- ・見た目と実際の型が一致しない
- ・比較処理は数値前提で書かれている
- ・配列処理では1件の異常が全体を止める
- ✅ IsNumeric関数による数値判定の基本
- ・IsNumericの基本構文
- ・IsNumericがTrueを返す代表的な値
- ・IsNumericが向いている実務シーン
- ✅ TypeName関数で「型」を判定する方法
- ・TypeNameの基本例
- ・TypeNameで判定できる主な型
- ・TypeNameの注意点
- ✅ VarType関数で厳密に判定する方法
- ・VarTypeの基本構文
- ・VarTypeが向いている場面
- ✅ 数値変換を使った判定(CInt・CLng・CDbl)
- ・エラー処理と組み合わせた例
- ・この方法の位置づけ
- ✅ 空白・Null・エラー値を含む場合の対処
- ・基本的な判定フロー
- ・NullとEmptyの違い
- ✅ 配列データに対する数値判定の実務例
- ・配列ループでの安全な数値チェック
- ・比較処理と組み合わせる場合
- ✅ 実務でよくある失敗パターン
- ・IsNumericだけで全て解決できると思ってしまう
- ・数値判定を処理の途中で行う
- ✅ 実務でおすすめの数値判定設計パターン
- ✅ まとめ:VBAの数値判定は比較処理の土台
✅ VBAで数値判定が重要になる理由
VBAで数値判定を軽視すると、処理全体の信頼性が大きく下がります。
特に「比較」や「配列処理」を行う場合、数値判定は前提条件そのものです。
ここを曖昧にしたままコードを書くと、必ず後工程で問題が発生します。
まずは、なぜ数値判定がこれほど重要なのかを整理しておきましょう。
・見た目と実際の型が一致しない
Excelのセルに「123」と表示されていても、
VBA上ではそれが 文字列(String) として扱われているケースは珍しくありません。
CSV取り込みやWebデータ、ユーザー入力値では特に顕著です。
・比較処理は数値前提で書かれている
If value > 100 Then
このような比較は、
valueが数値であることが前提 になっています。
文字列が混ざると、型不一致エラーや誤判定の原因になります。
・配列処理では1件の異常が全体を止める
配列ループ中に1件でも数値でない値が含まれていると、
処理全体が停止することがあります。
大量データを扱う実務では致命的です。
✅ IsNumeric関数による数値判定の基本
VBAで最もよく使われる数値判定方法が IsNumeric 関数です。
手軽に使える反面、挙動を正しく理解していないと誤判定につながります。
まずは基本的な使い方と考え方を押さえましょう。
・IsNumericの基本構文
If IsNumeric(v) Then
' 数値として扱える場合
Else
' 数値として扱えない場合
End If
IsNumericは、
「数値として評価できるかどうか」
を判定します。
・IsNumericがTrueを返す代表的な値
以下のような値は、すべて True を返します。
123"123"(文字列)" 123 "(前後に空白あり)"1.23""1E3"(指数表記)
つまり、IsNumericは
「型が数値かどうか」ではなく、
「数値として解釈できるかどうか」 を見ています。
参考:【VBA】IsNumericの使い方|数値判定の基本と落とし穴を徹底解説
・IsNumericが向いている実務シーン
- CSVや外部データの一次チェック
- 計算に使えるかどうかの判定
- 比較a型に厳密でなくてよい場合
✅ TypeName関数で「型」を判定する方法
「数値として使えるか」ではなく、
「本当に数値型かどうか」 を判定したい場合には、
TypeName 関数が有効です。
・TypeNameの基本例
Dim v As Variant
v = 123
If TypeName(v) = "Double" Or TypeName(v) = "Long" Then
' 数値型として処理
End If
・TypeNameで判定できる主な型
- Integer
- Long
- Double
- Currency
- String
- Empty
- Error
・TypeNameの注意点
Variant型に文字列 "123" が入っている場合、
TypeNameは "String" を返します。
IsNumericとは判定基準が異なる点に注意が必要です。
✅ VarType関数で厳密に判定する方法
VarType 関数は、変数の型を 定数値 として返します。
より厳密な制御を行いたい場合に向いています。
・VarTypeの基本構文
If VarType(v) = vbDouble Or VarType(v) = vbLong Then
' 数値型
End If
・VarTypeが向いている場面
- 数値型と文字列型を明確に分けたい
- Empty / Null / Error を含めて判定したい
- 処理を細かく分岐させたい
参考:【VBA】VarType 関数を使ってデータ型を調べる方法
✅ 数値変換を使った判定(CInt・CLng・CDbl)
実務では、「数値に変換できるかどうか」が重要になるケースも多くあります。
その場合、あえて変換を試みて判定するという方法もあります。
・エラー処理と組み合わせた例
On Error Resume Next
Dim d As Double
d = CDbl(v)
If Err.Number = 0 Then
' 数値として変換可能
Else
' 数値でない
End If
On Error GoTo 0
・この方法の位置づけ
- 実際に数値として使えるかが重要
- IsNumericでは判定が甘い場合
ただし、エラー制御を多用しすぎると、
コードの可読性が下がる点には注意が必要です。
✅ 空白・Null・エラー値を含む場合の対処
実務データでは、
空白・Null・エラー値が混在するのが普通です。
数値判定と同時に、これらをどう扱うかを決めておく必要があります。
・基本的な判定フロー
If IsEmpty(v) Or IsError(v) Then
' 処理対象外
ElseIf IsNumeric(v) Then
' 数値処理
Else
' 非数値処理
End If
・NullとEmptyの違い
- Empty:未初期化
- Null:無効な値(データベース由来など)
用途に応じて、どちらを許容するかを設計段階で決めることが重要です。
✅ 配列データに対する数値判定の実務例
このカテゴリ(配列・データ操作 > 比較)で特に重要なのが、
配列に対する数値判定 です。
・配列ループでの安全な数値チェック
Dim arr As Variant
Dim i As Long
arr = Range("A1:A100").Value
For i = LBound(arr, 1) To UBound(arr, 1)
If IsNumeric(arr(i, 1)) Then
' 数値処理
Else
' 非数値処理
End If
Next i
・比較処理と組み合わせる場合
If IsNumeric(arr(i, 1)) Then
If CDbl(arr(i, 1)) >= 0 Then
' 条件一致
End If
End If
数値判定を行わずに比較すると、
誤判定や型不一致エラーの原因になります。
参考:【VBA】配列(Array)の基礎を徹底解説|1次元配列・2次元配列の仕組みと実務での使い方
✅ 実務でよくある失敗パターン
・IsNumericだけで全て解決できると思ってしまう
IsNumericは便利ですが、
「文字列の数値」を許容する点を理解せずに使うと、
意図しない処理結果になります。
・数値判定を処理の途中で行う
数値判定は、
処理の入口でまとめて行う設計 の方が、
安定性・保守性ともに高くなります。
✅ 実務でおすすめの数値判定設計パターン
実務では、以下の考え方がおすすめです。
- 入力直後に数値判定を行う
- 判定方法をプロジェクト内で統一する
- 配列処理では必ず事前チェックを入れる
- 比較処理の前提条件として組み込む
✅ まとめ:VBAの数値判定は比較処理の土台
- 見た目と型は一致しないことが多い
- IsNumericは便利だが万能ではない
- TypeName・VarTypeで厳密な制御ができる
- 配列処理では必ず数値判定を行う
- 比較カテゴリの基礎として設計段階で組み込む
VBAにおける数値判定は、
単なるチェック処理ではなく、自動化全体の安定性を支える基礎技術 です。
この考え方を身につけることで、
エラーに強く、実務で壊れにくいVBAコードを書けるようになります。