※本ブログのページには広告主との提携による広告や宣伝、プロモーションが含まれます。当ブログを経由しての商品の購入や、サービス申し込みが発生すると、それらの提携企業からの成果報酬を受けとる場合があります。

エクセルVBA|InputBox関数で数値のみに入力制限するマクロの作り方

エクセルVBAのInputBox関数を使うことでユーザーからの入力をしてもらうときに、意図しない値が入力された場合にエラーが発生します。

例えば、整数型の変数にInputBox関数に戻り値を代入するつもりが、ユーザーからの入力がひらがなであったなどで、想定していないものが返ってきた結果、マクロがエラー処理で停止してしまいます。

InputBox関数の場合は、InputBoxメソッドのように”Type引数がない“ため、入力ダイアログでの制限がない状態となります。

そのため、入力する値の制限をしたい場面では、ユーザーから受け取った値がどういった値であるのかを判定し、値に応じて対応しておく必要があります。

少しわかりやすくするため、サンプルとなるケースをみていきましょう。

Sub インプットボックス()
    
    '入力された値を代入する変数を宣言する
    Dim ans As Integer
    
    'InputBox関数で入力画面を表示する
    ans = inputbox("性別を数値で入力してください。" & vbCrLf & "男性:1" & vbCrLf & "女性:2")
    
End Sub

例えば、上記のように性別を数値で入力してもらうマクロがあります。このマクロを実行すると、ユーザーには以下のような入力画面が表示されます。

InputoBox関数で表示される入力画面
インプットボックス関数による入力画面の画像

上の画像のように、「性別を数値で入力してください。」とメッセージのある入力画面を表示していたとします。おそらくですが、本記事を読んでいるあなたのような人であれば、数値で入力するでしょう。
しかし、ユーザーによっては、入力画面に書かれたメッセージをあまり読まずに” 男 “や” 女 “と文字列を入力するかもしれませんし、操作の誤りで何もを入力せずにクリックしたり、キャンセルするかもしれません。

InputBox関数をつかってユーザーに入力してもらう処理を書く場合、こういった場面でのエラーを想定し、対処することでバグの発生をふせぐことにつながります。

本記事では、InputBox関数の入画面でユーザーからの入力を受ける場合に、意図しない戻り値があった場合の対処方法について紹介しています。

エクセルVBAでマクロをつくるときの参考にしてもらえば嬉しいです。

独学だと中々スキルが身についた実感が湧かない。学習環境を見直してみませんか?

エクセルで繰り返しや転記作業で苦しい思いをした経験はありませんか?
今まで苦労してきたその作業を簡単なプログラムをおぼえるだけで解決できる可能性があります。
なるべくお金や時間をかけずにエクセルマクロVBAを習得したい人にはこちらの「1日速習講座」がおすすめです。

エクセルVBAのInputBox関数で数値のみに入力制限するマクロの作り方

InputBox関数で意図しない値を入力されないようにするためには大きく3つある

以降、それぞれの使い方についてコードつきで紹介していきます。

If文とExit Subをつかって処理を終了させる

まずは、if文をつかって処理を分岐させた先でマクロを終了させる方法です。

InputBoxメソッドのように入力ダイアログ上での制限とは異なり、入力された後でその値が意図しないものであった場合にユーザーに「再入力」をうながすのではなく、プログラムを強制終了させてしまう手段です。

Sub test()

Dim ans As String

    ans = inputbox("性別を数値で入力してください" & vbCrLf & "男性:1" & vbCrLf & "女性:2", "数値で入力", 1)

    If ans = "1" Then '1が入力された場合の処理
        MsgBox "男性用トイレは右側になります。"
    
    ElseIf ans = "2" Then '2が入力された場合の処理
        MsgBox "女性用トイレは左側になります。"
    
    Else '1または2以外が入力された場合の処理
        MsgBox "入力が正しくないか、キャンセルされました"
        Exit Sub 'マクロを終了する。
    
    End If

End Sub

If文で変数に代入された値を判定して、処理を分岐させており”Else”の処理であるExitステートメントでSubプロシージャを抜ける(プログラム終了させる)ところがポイントです。

If文は処理を条件分岐するときにつかうものです。
エクセルVBAで条件分岐をつかったマクロの書きかたについては、こちらの記事でまとめています。

If文をつかわず、複数の条件分岐の書きかたとして、SelectCase文をつかったマクロについても他の記事で紹介しています。

サンプルコードで条件判定がElseであった場合の処理に使用しているExitステートメントは、プロシージャや繰り返し処理を終了させますが、終了させたい対象によって書きかたが異なりますので、以下の表を参考にしてください。

Exitステートメントの種類 処理の内容
Exit sub subプロシージャを終了する
Exit Function Functionプロシージャを終了する
Exit For 繰り返し処理を終了(For~Next文)する
Exit Do 繰り返し処理を終了(Do~Loop文)する
Exit Property Propertyプロシージャを終了する

入力して欲しい値じゃなかったら、マクロをおわらせる方法だよ。

期待する値が入力されるまで入力ボックスを表示し続ける(Do~Loop文)

つづいては、繰り返し(ループ)処理でよく使われる” Do~Loop “文をつかって、ユーザーから意図しない値が入力されている間は、入力画面を出し続けるといった方法(プログラムを先に進めずループし続ける処理)です。

繰り返し(ループ)処理の書きかたを詳しくまとめた記事はこちらになります

Do~Loop文での処理では、「Until」と「While」の2種類をつかう方法を紹介するよ。

Do~Loop Untilをつかって入力ボックスを表示し続ける

以下のコードで、InputBox関数におけるユーザからの入力を数値のみに制限することが可能です。

Sub InputBox関数で数値入力に制限する方法()
  Dim no As String

  Do
    no = InputBox("数値を入力してください。", , "数値を入力")
  Loop Until IsNumeric(no)

  MsgBox (no)

End Sub

または

Sub InputBox関数で数値入力に制限する方法()
  Dim no As String

  Do Until IsNumeric(no)
    no = InputBox("数値を入力してください。", , "数値を入力")
  Loop

  MsgBox (no)

End Sub
変数名は任意のものを使用してください。ただし、InputBox関数の戻り値の型は文字列(String)型となります。

ユーザーから入力された値が、数値(厳密に言えば数値に変更できる値)であるか判定し、数値に変更できな値である限りは、繰り返しInputBoxの入力画面を表示します。

入力された値が数値であるかの判定には、IsNumeric関数をつかって判定しています。IsNumeric関数は、引数に書かれた値が数値として認識できれば”True“を、そうでない場合は”False“を返します。

2種類のコードの違いは条件を判定するタイミングになります。

条件を判定してからステートメント内の処理を実行します。

ステートメント内の処理を実行した後に条件を判定することになります。こちらの書きかたでは、必ず1回はステートメントに書いた処理を実行することになります。

処理の流れのイメージ図

数値を入力しないとループを抜けだせないようにしているんだね。

指定した値が数値かどうかを判定して数値なら”True”が、そうでない場合は”False”を返します。
※具体例として、文字列の” 10 “などの値は数値に変換できるためTrueが返ってきます。

以下の表に、いくつかの値の例をまとめてありますので参考にしてください。

変数に代入する値 IsNumeric関数の判定結果
100 True
“500” True
100 + 1 True
“abc” False
“あいうえお” False

これを応用すれば数値型だけでなく、各種データ型をインプットボックスでのユーザーからの入力で値を受け取るプログラムを作成する時の実行時エラーを防ぐことができます。

IsNumeric関数については以下の記事でも取り上げてるよ。

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

Do~Loop Whileをつかった書き方

こちらは、While文をつかって値の条件判定をする書き方になります。

Sub InputBox関数で数値入力に制限する方法()
  Dim no As String

  Do
    no = InputBox("数値を入力してください。", , "数値を入力")
  Loop While Not IsNumeric(no)

  MsgBox (no)

End Sub

または

Sub InputBox関数で数値入力に制限する方法()
  Dim no As String

  Do While Not IsNumeric(no)
    no = InputBox("数値を入力してください。", , "数値を入力")
  Loop

  MsgBox (no)

End Sub
変数名は任意のものを使用してください。但し、InputBox関数の戻り値の型は文字列(String)型となります。

WhileとUntilの関係

WhileとUntilは逆説の関係となります。
Whileは条件に一致している間は処理を繰り返す、Untilは条件に一致したら処理を終了する

つまり、これを表に置き換えると以下の表のような関係になります。

Until or While 説明
Until 条件に不一致(False)の間はくり返します。
Whileとは逆説の関係となり、While Notの条件式と同じになります。
While 条件に一致(True)の間はくり返します。
Untilとは逆説の関係となり、Until Notの条件式と同じになります。
Sub WhileとUntilの関係()
    Dim i As Integer, j As Integer, l As Integer, k As Integer

'イミディエイトウィンドウに、1 から 5 を繰り返し表示するマクロ①
    i = 0
    Do Until i > 5 '変数 i が 5 よりも大きくなるまで繰り返す
        Debug.Print (i)
        i = i + 1
    Loop
    
'イミディエイトウィンドウに、1 から 5 を繰り返し表示するマクロ②
    j = 0
    Do While Not j > 5 '変数 j が 5 よりも大きくなるまでの間は繰り返す
        Debug.Print (j)
        j = j + 1
    Loop

'イミディエイトウィンドウに、1 から 5 を繰り返し表示するマクロ③
    l = 0
    Do While l <= 5 '変数 l が 5 以下の間は繰り返す
        Debug.Print (l)
        l = l + 1
    Loop

'イミディエイトウィンドウに、1 から 5 を繰り返し表示するマクロ④
    k = 0
    Do Until Not k <= 5 '変数 k が 5 以上になるまで繰り返す
        Debug.Print (k)
        k = k + 1
    Loop

End Sub

上記はマクロ①~④は、全て同じ実行結果となります。

実行結果

0
1
2
3
4
5

それぞれのマクロで使用している変数は0が代入され、イミディエイトウィンドウに表示された後に 1 が足されていきます。

条件に応じた回数だけ繰り返すため、0から5の数値が表示されます。

独学だと中々スキルが身についた実感が湧かない。学習環境を見直してみませんか?

エクセルで繰り返しや転記作業で苦しい思いをした経験はありませんか?
今まで苦労してきたその作業を簡単なプログラムをおぼえるだけで解決できる可能性があります。
なるべくお金や時間をかけずにエクセルマクロVBAを習得したい人にはこちらの「1日速習講座」がおすすめです。

繰り返し処理をするDo~Loop文の書き方について

エクセルVBAにおける”Do~Loop”文は、くり返し処理を行う際につかうコードとなります。

繰り返し構文の代表例として、最も一般的に使われるものはFor~Next構文がありますが、For文と異なるポイントとして、For文は回数でくり返しを指定するとき、Do~Loopは条件でくり返しを指定するときに使います。

詳しくはくり返し文の記事で解説しているよ。

Do ~ Loop Until

Loopの後にUntilを書くと、必ず初回は処理を実行し、処理実行後に条件式の判定をします。
Until文なので条件に不一致の間はループし、条件に一致した場合は繰り返しから抜けます。

Do
  処理
Loop [Until 条件式]

Do Until ~ Loop

こちらでは、Doの後にUntilを書きます。

このコードでは、処理実行前に条件式の判定をするため、繰り返し処理に入る前から条件が一致していていれば、中に書かれた処理は実行されません。

Until文なので、条件に不一致の間はループを継続して、条件に一致したら繰り返しから抜けます。

Do [Until 条件式]
  処理
Loop

Do ~ Loop While

Loopの後にWhileを書くと、必ず初回は処理を実行し、処理実行後に条件式の判定をします。
While文なので条件に一致している間は繰り返し、不一致になると繰り返しから抜けます。

Do
  処理
Loop [While 条件式]

Do While ~ Loop

こちらでは、Doの後にWhileを書きます。

処理実行前に条件式の判定をするため、繰り返し処理に入る前から条件が一致しているのであれば処理は実行されません。

While文なので条件に一致している間は繰り返し、不一致になると繰り返しから抜けます。

Do [While 条件式]
  処理
Loop

GoToをつかって期待する値が入力されるまで入力ボックスを表示し続ける

こちらもユーザーから入力された値が画面の表示を繰り返す方法です。

if文でユーザーから受け取った値を判定して、期待する値以外であったときは”GoToステートメント“をつかって処理を戻すサンプルコードになります。

Sub test()

Dim ans As String

入力:
    ans = InputBox("性別を数値で入力してください" & vbCrLf & "男性:1" & vbCrLf & "女性:2", "数値で入力", 1)


    If ans = "1" Then
        MsgBox "男性用トイレは右側になります。"
    ElseIf ans = "2" Then
        MsgBox "女性用トイレは左側になります。"
    Else
        MsgBox "入力が正しくないか、キャンセルされました"
        GoTo 入力
    End If

End Sub


ユーザーは入力画面に男性なら” 1 “、女性なら” 2 “を入力することが望ましいです。しかし、かならずこの選択肢の数値を入力してもらえるとは限らないため、Elseの分岐を指定しています。

Else内の処理で GoTo入力 と記載していますが、これは “入力:” の部分にジャンプする処理となります。

これは、ユーザーからの入力が” 1 “でも” 2 “でもない場合は「入力が正しくないか、キャンセルされました」の警告メッセージのあとに、“入力:”と書かれた部分まで処理が戻ることで望ましい値が入力されるまで、入力画面を表示するといったループする処理が実現できます。

残業はしたくない!PCやExcelのスキルアップであなたのプライベート時間を奪わせない!
実務をプロから学べる「ユースフル」の動画は永年見放題。Q&A機能で分からないを放置しないから安心。


詳しくは以下のリンクをクリック

InputBox関数で数値のみに入力制限するマクロの作り方まとめ

InputBox関数で数値のみに入力制限するマクロの書き方と処理の流れを説明しました。さいごにまとめておきます。

InputBox関数で数値のみに入力制限するマクロ3つ

If文とExit Subを組み合わせることで、望ましい値以外が入力された場合に処理を終了させる。

Do~Loop文とIsNumeric関数を組み合わせることで、望ましい値以外が入力された場合に入力画面の表示を繰り返す。

If文とGoTo文を組み合わせることで、望ましい値以外が入力された場合に入力画面の表示を繰り返す。

処理を終了するなら終了するときにメッセージを出すなどの工夫があると良いね。

Do~Loop文とIsNumeric関数での実装方法で抑えておきたいポイント

 値が数値であるかの判定にはIsNumeric関数

 条件に応じて繰り返す処理コードでつかうDo~LoopのWhileとUntilは逆説の関係

Do~Loopによるループ指定 条件式(数値判定)
Do~Loop Until 条件式 IsNumeric(no)
Do Until 条件式 ~ Loop
Do~Loop While Not 条件式
Do While 条件式 ~ Loop

InputBox関数での入力内容を制限する手段について、本記事で紹介した書き方以外でも実現する方法はあるかもしれません。簡単でシンプルなコードで実装できる方法になりますのでおすすめです。

入力画面があるマクロを作るなら参考にしてみてね。

最後までお読みいただきありがとうございます。

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

コメント

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