エクセルのVBAマクロをつかってInputBox関数でユーザーからの入力をしてもらう処理を実装する時、注意すべき点として意図しない内容を入力された際の対処があります。対処方法はいくつもありますが、エクセルVBAのInputBox関数の場合は、InputBoxメソッドのようなType引数はないため、入力ダイアログでの制限がない状態となります。
そのため、かならず整数のみで入力を返してもらいたいシーンなどでは、入力された内容(値)を別途判定して対処しておく必要があります。
InputBox("性別を数値で入力してください" & vbCrLf & "男性:1" & vbCrLf & "女性:2", "数値で入力", 1)
例えば、上記のように性別を数値で判定してその後の処理を分岐するシーンで「性別を数値で入力してください」と案内メッセージがあったとしても、ユーザーによってはあまりよく画面を見ずに「 男 」と「 女 」と文字列を入力するかもしれませんし、操作の誤りで何もを入力せずにクリックしたり、キャンセルするかもしれません。
プログラミングでは、こういった場合についても想定し対処しておくことでバグの発生を未然に防ぐことにつながります。
本記事では、InputBox関数での入力ダイアログでユーザーから情報を受け取る場合に意図しない戻り値があった場合の対処について紹介しています。
【結論】エクセルのVBAマクロで入力を数値のみに制限する方法
InputBox関数で意図しない戻り値であった場合の対処方法としては大きく3つあります。
1:if文とExit Subをつかって処理を終了させる
2:Do~Loop文をつかって期待する値が入力されるまで入力ダイアログを出し続ける
3:GoToステートメントつかって期待する値が入力されるまで入力ダイアログを出し続ける
以降、それぞれの使い方についてコードつきで紹介していきます。
if文とExit Subをつかって処理を終了させる
ここでは、if文をつかって処理を分岐させた先でプログラムを終了させる方法を紹介します。
InputBoxメソッドのように入力ダイアログ上での制限とは異なり、入力された後でその値が意図しないものであった場合にユーザーに「再入力」を促すのではなく、プログラムを強制終了させてしまう手段です。
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 "入力が正しくないか、キャンセルされました" Exit Sub End If End Sub
If文は処理を条件分岐するときにつかうものです。エクセルVBAで条件分岐をつかったマクロの書きかたについては、こちらの記事でまとめています。
if文をつかわず、複数の条件分岐の書きかたとして、SelectCase文をつかったマクロについても他の記事で紹介しています。
Exitステートメント
Exit sub | subプロシージャを終了 |
Exit Function | Functionプロシージャを終了 |
Exit For | 繰り返し処理を終了(For~Next文) |
Exit Do | 繰り返し処理を終了(Do~Loop文) |
Exit Property | Propertyプロシージャを終了 |
期待する値が入力されるまでダイアログを出し続ける(Do~Loop文)
こちらは繰り返し処理(ループ)でよく見る「 Do~Loop 」文をつかって、ユーザーから意図しない値が入力されている間は、入力ダイアログを出し続けるといった方法(プログラムを先に進めずループし続ける処理)となります。
繰り返し(ループ)処理の代名詞として名高い、ForNext文やForEach文などについては、繰り返し(ループ)処理の書きかたをまとめて記事にしていますので、そちらをご覧ください。
ここでは以下、2種類をつかう方法を紹介します。
1.Do~Loop Until
2.Do~Loop While
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のダイアログを表示し続ける処理となります。
入力された値が数値であるかの判定には、IsNumeric関数をつかって判定しています。IsNumeric関数は引数に書かれた値が数値として認識できれば「True」をそうでない場合は「False」を返します。
2種類のコードの違いは、条件を判定するタイミングになります。
Do Until IsNumeric(no)は、条件を判定してからステートメント内の処理を実行します。一方、Loop Until IsNumeric(no)であった場合は、ステートメント内の処理を実行した後に条件を判定することになります。
つまり、Loop Until IsNumeric(no)は必ず1回はステートメント内の処理を実行することになります。
処理の流れのイメージ図


IsNumeric関数
指定した値が数値かどうかを判定して数値なら「True」が、そうでない場合は「False」を返します。
※文字列の【 10 】などの値など数値に変換できる値の場合はTrueが返ってきます。
変数に代入する値 | IsNumeric関数の判定結果 |
---|---|
100 | True |
“500” | True |
100 + 1 | True |
“abc” | False |
“あいうえお” | False |
これを応用すれば数値型にだけでなく、各種データ型をインプットボックスでのユーザーからの入力で値を受け取るプログラムを作成する時の実行時エラーを防ぐことができます。
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
WhileとUntilの関係
WhileとUntilは逆説の関係となります。
Whileは条件に一致している間は処理を繰り返す、Untilは条件に一致したら処理を終了する。
つまり、これを表に置き換えると以下の表のような関係になります。
Until | = | While Not |
While | = | Until Not |
Sub WhileとUntilの関係()
Dim i As Integer, j As Integer, l As Integer, k As Integer
i = 0
Do Until i > 5
Debug.Print (i)
i = i + 1
Loop
j = 0
Do While Not j > 5
Debug.Print (j)
j = j + 1
Loop
l = 0
Do While l <= 5
Debug.Print (l)
l = l + 1
Loop
k = 0
Do Until Not k <= 5
Debug.Print (k)
k = k + 1
Loop
End Sub
上記は全て同じ実行結果となります。
実行結果
0
1
2
3
4
5
繰り返し処理をするDo~Loop文の書き方について
Do~Loop文はエクセルVBAで繰り返し処理を行う際につかうコードとなります。繰り返し構文の代表例として、最も一般的に使われるものは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
上記のコードでは、InputBox関数によって入力ダイアログが表示されます。
ユーザーは、入力ダイアログに男性なら「 1 」、女性なら「 2 」を入力することになりますが、その他の値が入力されたことを想定してif文のElse内の処理で対処しています。
Else内の処理で GoTo入力 と記載していますが、これは 入力: の部分にジャンプする処理となります。
これにより、ユーザーからの入力が1でも2でもない場合は、「入力が正しくないか、キャンセルされました」の警告メッセージのあとに入力ダイアログを表示するといったループする処理を実現しています。
独学の学習効率でお悩みの人必見!
<動画学習見放題サービス>
初心者にやさしいチューターなら今すぐにはじめられる
■オンラインで学習したい
■プログラミングで副業をはじめたい
■パソコン・エクセルの学習をしたい
「InputBox関数で入力を数値のみに制限する方法」まとめ
InputBox関数でユーザーからの入力を数値のみに制限したい場合のコードの書き方と処理の流れを説明しました。
まとめて箇条書きと表にすると以下となります。
制限する手段は大きく3つ
if文とExit Sub使う
or
Do~Loop文とIsNumeric関数を使う
or
if文とGoTo文を使う
Do~Loop文とIsNumeric関数での実装方法で抑えておきたいポイント
値が数値であるかの判定にはIsNumeric関数
条件に応じて繰り返す処理コードでつかうDo~LoopのWhileとUntilは逆説の関係
Do~Loopによるループ指定 | 条件式(数値判定) |
---|---|
Do~Loop Until 条件式 | IsNumeric(no) |
Do Until 条件式 ~ Loop | IsNumeric(no) |
Do~Loop While Not 条件式 | IsNumeric(no) |
Do While 条件式 ~ Loop | IsNumeric(no) |
InputBox関数での入力内容を制限する手段について、本記事で紹介した書き方以外でも実現する方法はあるかもしれません。簡単でシンプルなコードで実装できる方法になりますのでおすすめです。
最後までお読み頂きありがとうございます。
この記事が役に立ったと感じていただけた人は是非フォローお願いします。
コメント