VBAで自動化 VBA一覧 比較 配列・データ操作

【VBA】数値か否か判定する方法まとめ|配列・比較処理で失敗しない実務設計

ExcelVBAで自動化処理を組んでいると、「この値は数値として扱っていいのかどうか」を判定しなければならない場面は非常に多くあります。
見た目は明らかに数値に見えるのに、計算するとエラーになる、比較結果がおかしくなる、処理の途中で止まる――こうしたトラブルは、数値判定を正しく行っていないこと が原因で発生します。

特に、CSVや外部システムから取り込んだデータ、配列やVariant型で一括処理するデータでは、

  • 数値と文字列が混在している
  • 空白・Null・エラー値が含まれている
  • 「数値っぽい文字列」が大量に含まれている

といった状況が珍しくありません。

この記事では、VBAで「数値か否か」を判定する方法を、
IsNumeric / TypeName / VarType / 変換チェック / 比較処理との関係
という観点から、実務での使い分けを前提に徹底解説します。

単なる関数の紹介ではなく、
「どの方法を、どの場面で使うべきか」
「なぜその判定が必要なのか」
まで理解できる内容になっています。

✅ 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が向いている場面


✅ 数値変換を使った判定(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コードを書けるようになります。

    -VBAで自動化, VBA一覧, 比較, 配列・データ操作