IsNumeric
IsNumeric関数は引数データが数値かどうかを判定します。
引数は数値型である必要はなく、”1.5″のように文字列でも数値として判定されます。
数値であればTrue、そうでなければFalseを返します。
IsNumeric関数は一部の文字も数字として許容するため、半角数字のみの厳格なチェックが必要な場合の方法についても後述しています。
構文
Function IsNumeric(Expression) As Boolean
Expression | 判定したいデータを指定します。 |
戻り値 Boolean |
数値であればTrue、そうでなければFalseを返します。 |
制限事項
IsNumeric関数は引数がある程度不正でも、数値として許容するところがあります。
例えば、”- 1.5″ のように符号と数字の間にスペースがあるような「これOKなの?」と思うようなものでもTrueを返します。
半角スペース(”- 123″)の他にも、前後の符号(”+123″、”-123″、”123+”、”123-“)、全角(”123”)、、桁表記(”10e8″)、8進数表記(&O123)、16進数表記(&H123)、など、これらは全てTrueが返ってきます。
そのため、意図しないチェック結果が返ってくることもありえます。
サンプルコード
単純なIsNumeric関数のサンプルと、変数を引数とするIsNumeric関数の2通りのサンプルです。
中段から最後の部分は、配列にいくつかの文字列を入れておき、それらをループでIsNumeric関数で数値かどうかを判定しています。
数値の場合とそうでない場合で出力内容のメッセージが変わります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
Sub IsNumericTest() Dim ar() Dim s Dim ret As Boolean ret = IsNumeric("123456") If ret = True Then Debug.Print "変換OK" Else Debug.Print "変換NG" End If ReDim ar(6) ar(0) = "12345" '// 半角数字 ar(1) = "123" '// 全角数字 ar(2) = "10e8" '// 桁表記 ar(3) = "&O123" '// 8進数 ar(4) = "&H123" '// 16進数 ar(5) = "\123,456.789" '// 金額、小数 ar(6) = "123a" '// 英数字 For Each s In ar ret = IsNumeric(s) '// 数値変換が可能な場合 If ret = True Then Debug.Print "True : " & s '// 数値変換が可能ではない場合 Else Debug.Print "False: " & s End If Next End Sub |
実行結果
上の関数を実行すると以下のように出力されます。
変換OK
True : 12345
True : 123
True : 10e8
True : &O123
True : &H123
True : \123,456.789
False: 123a
半角数字しか認めたくない場合
IsNumeric関数は上記の通り、許容範囲が広いところがあります。
しかし実際に数値判定をしたい場合には「半角数字だけかどうかを調べたい」という要件も出てくることがあります。
そういう場合にはIsNumeric関数ではなく、自分でチェックする関数を作るなどで対応することになります。
以下は半角数値だけかどうかを判定するIsNumericEx関数です。
ここでは半角数字のみかどうかを判定条件にしていますが、小数点、¥マーク、カンマ、なども含めたい場合は9行目の「[0-9]」を以下のように変えてください。
^や+$の部分は変更しません。
- 数字+小数点の場合 [0-9\.]
- 数字+小数点+カンマの場合 [0-9\.\,]
- 数字+¥+小数点+カンマの場合 [0-9\.\,\\」
正規表現のRegExpクラスを利用しているため、事前に参照設定が必要です。
VBAの画面でツールメニュー→参照設定のダイアログを開き、「Microsoft VBScript Regular Expressions 5.5」にチェックを付けることで正規表現のRegExpクラスが利用できるようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
'// 引数1:指定セル範囲 '// 戻り値:True=チェックOK、False=チェックNG Function IsNumericEx(s) As Boolean Dim rCell As Range '// 処理対象セル Dim ret As Boolean '// 関数戻り値 Dim reg As New RegExp '// 正規表現クラスオブジェクト '// 検索条件=数字のみ形式を抽出 reg.Pattern = "^[0-9]+$" '// 文字列の最後まで検索する reg.Global = True '// 数字のみではない場合 If reg.Test(s) = False Then ret = False Else ret = True End If IsNumericEx = ret End Function |
使い方
IsNumericEx関数の使い方はIsNumeric関数と同じです。
上記サンプルコードの配列をそのまま使った使用例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Sub IsNumericExTest() Dim ar() Dim s Dim ret As Boolean ReDim ar(6) ar(0) = "12345" '// 半角数字 ar(1) = "123" '// 全角数字 ar(2) = "10e8" '// 桁表記 ar(3) = "&O123" '// 8進数 ar(4) = "&H123" '// 16進数 ar(5) = "\123,456.789" '// 金額、小数 ar(6) = "123a" '// 英数字 For Each s In ar ret = IsNumericEx(s) '// 数値変換が可能な場合 If ret = True Then Debug.Print "True : " & s '// 数値変換が可能ではない場合 Else Debug.Print "False: " & s End If Next End Sub |
実行結果
以下の通り、数字だけの文字列である”12345″のみがTrueを返します。
True : 12345
False: 123
False: 10e8
False: &O123
False: &H123
False: \123,456.789
False: 123a