VBA|IsNumeric関数で値や変数が数値かどうかを判定するマクロをつくる

エクセルVBAのIsNumeric関数のトップ画像

IsNumeric関数について

VBAで値や変数が数値であるかを確認する関数です。

システムやマクロにおいてユーザーからの入力を処理に利用するときは、受けとった値が数値に変換できるかを判定します。

判定結果は真偽値(Boolean)となるため、TrueまたはFalseで返します。


独学でプログラミングをはじめてみたけど、このままの学習方法に不安を感じているのなら、
オンラインスクールで現役エンジニアのサポートがあるテックアカデミーがおすすめ。
スキマ時間に学べて仕事も保証。必ず副業、始められます。まずは無料でプログラミング体験

IsNumeric関数がつかえる場面

Inputメソッドや、Input関数をつかったマクロや、セルやユーザーフォームに入力された値を判定につかいます。

例えば、顧客情報を入力するユーザーフォームにおいて、電話やFAXの番号や郵便番号などの入力、または商品情報を入力するときの価格などの判定をして入力あやまりを予防できます。

また、セルに入力された値が数値であるかのチェックなどで利用することもできます。

数値以外を入力させたくないセルであった場合、マクロで予防していることが最善策と言えますが、すでに入力された値に対してチェックすることも可能です。

IsNumeric関数の使いかた

IsNumeric関数の構文と戻り値について紹介します。

IsNumeric関数の構文

IsNumeric(値または変数)

※値または変数(expression)の指定は必須のため、省略した場合はエラーとなります。

IsNumeric関数の判定結果について

IsNumeric関数の結果は真偽値(Boolean)となるため、TrueまたはFalseが返ります。

指定した値や変数が数値である場合はTrueそれ以外と判定された場合Falseが返ってきます。なお、日付であった場合もFalseとなります。

No 判定する値 説明 判定結果
(True or False)
1 123 数値 True
2 -123 数値(負の数値) True
3 “123” 文字列で半角の数値 True
4 “123” 文字列で全角の数値 True
5 “-123” 文字列で全角の数値(符号は半角) True
6 “ー123” 文字列で全角の数値(符号も全角) False
7 “あいう” 文字列でひらがな False
8 “アイウ” 文字列でカタカナ False
9 “一二三” 文字列で漢数字 False
10 “ⅠⅡⅢ” 文字列でローマ数字 False
11 “ABC” 文字列でABC False
12 “2024/1/31” 日付(文字列) False
13 #1/31/2024# 日付 False
14 “2024年1月31日” 日付 False
15 “12:12:12” 時刻 False
16 空白 False
17 0 数値の0 True
18 ActiveSheet.Range(“A1”) セルの座標(対象セルは空白) True
19 ActiveSheet.Range(“A1”).Value セルの座標(対象セルは空白)のValueプロパティ True
20 ActiveSheet.Range(“A1”).Text セルの座標(対象セルは空白)のTextプロパティ False
21 True 真偽値の「True」は-1とみなされるため数値として判定される True
22 False 真偽値の「False」は0とみなされるため数値として判定される True
24 Empty Emptyは0とみなされるため数値として判定される True
25 Null Null値 False
26 指定なし 指定なし エラー

IsNumeric関数をつかったサンプルマクロ

ここではIsNumeric関数をつかったマクロを紹介します。

Sub IsNumeric_macro1()

    '入力された値を代入する変数を宣言する
    Dim User_Val As String
    
    'InputBox関数でユーザーから入力された値を変数「User_Val」に代入する
    User_Val = InputBox("5桁までの数値を入力してください", "数値を入力", 0)
    
    If Len(User_Val) > 5 Then '入力された値が5文字よりも多い場合
        
        MsgBox "5桁以上は入力できません", vbCritical + vbOKOnly, "入力不正通知"
        Exit Sub 'マクロの動作を終了する
    
    Else
    
        If IsNumeric(User_Val) = True Then '入力された値が数値かどうかを判定する
            MsgBox "入力された値は数値です。", vbInformation + vbOKOnly '数値である
        
        Else
            MsgBox "入力された値は数値ではありません。", vbCritical + vbOKOnly '数値ではない
        
        End If
    
    End If

End Sub

こちらのマクロでは、InputBox関数をつかって入力画面を表示し、ユーザーに値の入力を促します。

InputBox関数で表示される入力画面
InputBox関数の入力画面

ユーザーより入力された値を変数「User_Val」に代入し、IsNumeric関数で数値かどうかを判定し、さいごにIf文をつかって条件分岐をし、判定結果におうじてメッセージボックスを表示します。

こちらのサンプルマクロでは、5文字よりも多い文字数が入力された場合、マクロを終了する処理をします。入力された値が5文字よりも多いかはLen関数をつかって判定し、5文字以下であれば、その文字列が数値であるかの処理に進みます。

ほかの処理として、指定された範囲の値が入力されるまで入力画面をくり返し表示する方法もあります。また、InputBox関数をつかう方法以外にも、ユーザーからの入力に対する制限方法として、Application.InputBoxメソッドの引数である「Type」を指定する方法もあります。

InputBox関数で指定範囲の値が入力されるまで入力画面を表示するマクロはこちらを参考にしてください。

\指定の値が入力されるまで入力画面を表示するマクロはコチラ/

Application.InputBoxメソッドの使いかたについては以前の記事をご覧ください。

\入力される文字を制限する方法が知りたいならコチラ/

Len関数などの文字列操作に便利な関数は以下の記事をご覧ください。

\文字列操作に便利な関数はコチラ/

続いてもうひとつサンプルマクロを紹介します。

こちらはエクセルのワークシート上に記録された表の数値を判定して、数値であれば全角文字を半角文字に置きかえて記入します。

Option Explicit

Sub IsNumeric_macro2()
'ワークシートに書かれた数値を半角に変更する

    Dim Var As String 'セルの値を代入する変数
    Dim i As Long       'くり返し用の変数
    
    '作業対象シートをWithで指定する
    With ThisWorkbook.Worksheets("対象シート")
        
        For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row '最終行までくり返す
            Var = .Cells(i, 1).Value 'A列の値を変数に代入
            .Cells(i, 3) = IsNumeric(Var) '変数に代入した値が数値に変換できるかの判定結果をC列に記入する

            If IsNumeric(Var) = True Then '数値にできる値であった場合
                .Cells(i, 4) = StrConv(Var, vbNarrow) '半角数値に置換してD列に出力する
            End If
        Next i
    
    End With

End Sub

エクセルのワークシート上に以下の表があるとします。
C列とD列の空白セルに結果を入力します。

1 A列 B列 C列 D列
2 判定する値 説明 IsNumeric関数の判定
(True or False)
StrConv関数の結果
3 空白のセル
4 0 数値の0
5 123 数値
6 -123 負の数値
7 123 全角の数値
8 -123 全角の数値(符号は半角)
9 ー123 全角の数値(符号も全角)
1 A列 B列 C列 D列
2 判定する値 説明 IsNumeric関数の判定
(True or False)
StrConv関数の結果
3 空白のセル FALSE
4 0 数値の0 TRUE 0
5 123 数値 TRUE 123
6 -123 負の数値 TRUE -123
7 123 全角の数値 TRUE 123
8 -123 全角の数値(符号は半角) TRUE -123
9 ー123 全角の数値(符号も全角) FALSE

C列にIsNumeric関数の判定結果(TRUEorFALSE)を入力しています。判定結果がTRUEになったものだけを対象にD列にA列の値を全角文字から半角文字に変換した結果を記入しています。変換の方法は、StrConv関数を利用しています。

こちらのサンプルマクロで利用している、くり返し処理や条件分岐は以下の記事で紹介しています。
詳しくはリンクより記事をご確認ください。

ForNextをつかってくり返しの処理を実行するマクロをつくるなら以下の記事をご覧ください。

くり返し処理のマクロの書きかたについてはコチラ/

If文をつかって条件に応じて処理を分岐するマクロをつくるなら以下の記事をご覧ください。

条件分岐処理のマクロの書きかたについてはコチラ/

IsNumeric関数のような値や変数を判定する関数はほかにもある

IsNumeric関数は数値かどうかを判定する関数であることはお伝えしたとおりですが、同じようなはたらきをもつ関数として、ワークシート関数のIsNumber関数もあり、こちらも数値かどうかの判定をします。

IsNumeric関数と異なる点として、IsNumeric関数では、“123”のように文字列であっても数値に変換できるものを「True」と判断することに対して、IsNumber関数では「False」と結果が異なります。

IsNumeric関数は指定した値が数値にできるものであれば「True」、一方、IsNumber関数は数値であれば「True」の結果となるため、IsNumeric関数よりも判定基準が厳しいと言えます。そのため入力するものの厳格さによっては、ほかの入力制限をおこなう処理とあわせて利用していく必要がでてくるかもしれません。

例えば、ぜったいに半角の数値で入力してほしい場面で、全角の数値が入力されてもIsNumeric関数では「True」と判断されることになりますが、これを許容できないのであれば、IsNumber関数で判定する、または全角で入力された数値を表などに記録するときの前処理として、全角文字を半角文字に変換するStrConv関数をつかうことで期待する結果を実現していくことになります。

そのほかの判定につかえる関数について

VBAには数値以外にも値や変数を判定する関数があります。

IsArray関数

 値や変数が配列であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsDate関数

 値や変数が日付であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsEmpty関数

 値や変数が初期値であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsError関数

 値や変数がエラーであるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsNull関数

 値や変数にNullが含まれるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsObject関数

 値や変数がオブジェクトかどうかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。

コメント

タイトルとURLをコピーしました