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

vba

エクセルの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文で変数に代入された値を判定して、処理を分岐させている点と「Else」の処理であるExitステートメントでSubプロシージャを抜ける(プログラム終了させる)点です。

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

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

Exitステートメント

Exit subsubプロシージャを終了
Exit FunctionFunctionプロシージャを終了
Exit For繰り返し処理を終了(For~Next文)
Exit Do繰り返し処理を終了(Do~Loop文)
Exit PropertyPropertyプロシージャを終了

期待する値が入力されるまでダイアログを出し続ける(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関数の戻り値の型は文字列(String)型となります。

ユーザーから入力された値が、数値(厳密に言えば数値に変更できる値)であるか判定し、数値に変更可能ではない値である限りは繰り返し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関数の判定結果
100True
“500”True
100 + 1True
“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
変数名は任意のものを使用してください。但し、InputBox関数の戻り値の型は文字列(String)型となります。

WhileUntilの関係

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

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

繰り返し処理をする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つ

手段1

if文とExit Sub使う

意図しない入力があった場合、プログラムを終了させる手段での実装はこちらになります。

or

手段2

Do~Loop文とIsNumeric関数を使う

意図しない入力があった場合、入力ダイアログを繰り返し表示する手段での実装になります。

or

手段3

if文とGoTo文を使う

意図しない入力があった場合、入力ダイアログを繰り返し表示する手段での実装になります。

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

ポイント1:判定方法

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

ポイント1:WhileとUntilの関係性

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

Do~Loopによるループ指定条件式(数値判定)
Do~Loop Until 条件式IsNumeric(no)
Do Until 条件式 ~ LoopIsNumeric(no)
Do~Loop While Not 条件式IsNumeric(no)
Do While 条件式 ~ LoopIsNumeric(no)
While Not 条件 は Until 条件と同じ。While 条件 は Until Not 条件と同じの関係

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

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

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

コメント

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