エクセルVBAのInputBox関数を使うことでユーザーからの入力をしてもらうときに、意図しない値が入力された場合にエラーが発生します。
例えば、整数型の変数にInputBox関数に戻り値を代入するつもりが、ユーザーからの入力がひらがなであったなどで、想定していないものが返ってきた結果、マクロがエラー処理で停止してしまいます。
InputBox関数の場合は、InputBoxメソッドのように”Type引数がない“ため、入力ダイアログでの制限がない状態となります。
そのため、入力する値の制限をしたい場面では、ユーザーから受け取った値がどういった値であるのかを判定し、値に応じて対応しておく必要があります。
少しわかりやすくするため、サンプルとなるケースをみていきましょう。
サンプルマクロ
Sub インプットボックス()
'入力された値を代入する変数を宣言する
Dim ans As Integer
'InputBox関数で入力画面を表示する
ans = inputbox("性別を数値で入力してください。" & vbCrLf & "男性:1" & vbCrLf & "女性:2")
End Sub
例えば、上記のように性別を数値で入力してもらうマクロがあります。このマクロを実行すると、ユーザーには以下のような入力画面が表示されます。
上の画像のように、「性別を数値で入力してください。」とメッセージのある入力画面を表示していたとします。おそらくですが、本記事を読んでいるあなたのような人であれば、数値で入力するでしょう。
しかし、ユーザーによっては、入力画面に書かれたメッセージをあまり読まずに” 男 “や” 女 “と文字列を入力するかもしれませんし、操作の誤りで何もを入力せずにクリックしたり、キャンセルするかもしれません。
InputBox関数をつかってユーザーに入力してもらう処理を書く場合、こういった場面でのエラーを想定し、対処することでバグの発生をふせぐことにつながります。
本記事では、InputBox関数の入画面でユーザーからの入力を受ける場合に、意図しない戻り値があった場合の対処方法について紹介しています。
エクセルVBAでマクロをつくるときの参考にしてもらえば嬉しいです。
エクセルVBAのInputBox関数で数値のみに入力制限するマクロの作り方
結論
InputBox関数で意図しない値を入力されないようにするためには大きく3つある
If文とExit Subをつかって処理を終了させる
Do~Loop文をつかって期待する値が入力されるまで入力ダイアログを出し続ける
GoToステートメントつかって期待する値が入力されるまで入力ダイアログを出し続ける
以降、それぞれの使い方についてコードつきで紹介していきます。
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ステートメントの種類 | 処理の内容 |
---|---|
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関数におけるユーザからの入力を数値のみに制限することが可能です。
サンプルマクロ1
Sub InputBox関数で数値入力に制限する方法()
Dim no As String
Do
no = InputBox("数値を入力してください。", , "数値を入力")
Loop Until IsNumeric(no)
MsgBox (no)
End Sub
または
サンプルマクロ2
Sub InputBox関数で数値入力に制限する方法()
Dim no As String
Do Until IsNumeric(no)
no = InputBox("数値を入力してください。", , "数値を入力")
Loop
MsgBox (no)
End Sub
ユーザーから入力された値が、数値(厳密に言えば数値に変更できる値)であるか判定し、数値に変更できな値である限りは、繰り返しInputBoxの入力画面を表示します。
入力された値が数値であるかの判定には、IsNumeric関数をつかって判定しています。IsNumeric関数は、引数に書かれた値が数値として認識できれば”True“を、そうでない場合は”False“を返します。
2種類のコードの違いは、条件を判定するタイミングになります。
Do Until IsNumeric(no)
条件を判定してからステートメント内の処理を実行します。
Loop Until IsNumeric(no)
ステートメント内の処理を実行した後に条件を判定することになります。こちらの書きかたでは、必ず1回はステートメントに書いた処理を実行することになります。
数値を入力しないとループを抜けだせないようにしているんだね。
IsNumeric関数
指定した値が数値かどうかを判定して数値なら”True”が、そうでない場合は”False”を返します。
※具体例として、文字列の” 10 “などの値は数値に変換できるためTrueが返ってきます。
以下の表に、いくつかの値の例をまとめてありますので参考にしてください。
変数に代入する値 | IsNumeric関数の判定結果 |
---|---|
100 | True |
“500” | True |
100 + 1 | True |
“abc” | False |
“あいうえお” | False |
これを応用すれば数値型だけでなく、各種データ型をインプットボックスでのユーザーからの入力で値を受け取るプログラムを作成する時の実行時エラーを防ぐことができます。
IsNumeric関数については以下の記事でも取り上げてるよ。
Do~Loop Whileをつかった書き方
こちらは、While文をつかって値の条件判定をする書き方になります。
サンプルマクロ1
Sub InputBox関数で数値入力に制限する方法()
Dim no As String
Do
no = InputBox("数値を入力してください。", , "数値を入力")
Loop While Not IsNumeric(no)
MsgBox (no)
End Sub
または
サンプルマクロ2
Sub InputBox関数で数値入力に制限する方法()
Dim no As String
Do While Not IsNumeric(no)
no = InputBox("数値を入力してください。", , "数値を入力")
Loop
MsgBox (no)
End Sub
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の数値が表示されます。
繰り返し処理をする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 “でもない場合は「入力が正しくないか、キャンセルされました」の警告メッセージのあとに、“入力:”と書かれた部分まで処理が戻ることで望ましい値が入力されるまで、入力画面を表示するといったループする処理が実現できます。
なぜ、膨大な事務作業でも定時で退社できるのか。
実務をプロから学べる「ユースフル」の動画は永年見放題。Q&A機能で分からないを放置しないから安心。
詳しくは以下のリンクをクリック
InputBox関数で数値のみに入力制限するマクロの作り方まとめ
InputBox関数で数値のみに入力制限するマクロの書き方と処理の流れを説明しました。さいごにまとめておきます。
InputBox関数で数値のみに入力制限するマクロ3つ
入力制限するマクロ1
If文とExit Subを組み合わせることで、望ましい値以外が入力された場合に処理を終了させる。
入力制限するマクロ2
Do~Loop文とIsNumeric関数を組み合わせることで、望ましい値以外が入力された場合に入力画面の表示を繰り返す。
入力制限するマクロ3
If文とGoTo文を組み合わせることで、望ましい値以外が入力された場合に入力画面の表示を繰り返す。
処理を終了するなら終了するときにメッセージを出すなどの工夫があると良いね。
Do~Loop文とIsNumeric関数での実装方法で抑えておきたいポイント
ポイント1:判定方法
値が数値であるかの判定にはIsNumeric関数
ポイント2:WhileとUntilの関係性
条件に応じて繰り返す処理コードでつかうDo~LoopのWhileとUntilは逆説の関係
Do~Loopによるループ指定 | 条件式(数値判定) |
---|---|
Do~Loop Until 条件式 | IsNumeric(no) |
Do Until 条件式 ~ Loop | |
Do~Loop While Not 条件式 | |
Do While 条件式 ~ Loop |
InputBox関数での入力内容を制限する手段について、本記事で紹介した書き方以外でも実現する方法はあるかもしれません。簡単でシンプルなコードで実装できる方法になりますのでおすすめです。
入力画面があるマクロを作るなら参考にしてみてね。
最後までお読みいただきありがとうございます。
この記事が役に立ったと感じていただけた人は是非フォローお願いします。
コメント