【プログラミング】VBAにおけるInputBoxの種類と使い方を解説

プログラミング
komori
komori

こんにちは、今回はVBAのInputBoxについて解説していきます。

InputBox(インプットボックス)とは、アプリなどにおいてユーザーに任意の値を入力してもらう時に使用するものです。

ExcelVBAにてアプリや何かしらのシステムを作成をするときにユーザーフォームやワークシートを使ってユーザビリティを向上させる手段はありますが、最も簡単に行える手段としてInputBoxという選択肢があります。

そんなInputBoxは2種類ありますのでそれぞれの特徴と簡単な使い方についてさっくりと解説していきます。

こちらの記事をおすすめしたい人
  • ExcelVBAでユーザーからの入力に応じた処理をするアプリを作りたい

  • ExcelVBAでユーザーからの入力において不具合とならないように入力内容を制限したい

  • ExcelVBAのプログラムにInputBox(インプットボックス)を実装したがもっと詳しく知りたい

VBAにおけるinputboxは2種類ある

VBA InputBox①:ApplicationオブジェクトのInputBoxメソッドを使う

まずは、ApplicationオブジェクトのInputBoxメソッドを使ったコードの書き方についてみてみましょう。

InputBoxは以下のようなもので、ユーザーに数字や文字の入力を促す際に使用します。

inputBoxに数値1を入力し、OKをクリックする

なお、今回は確認方法として以下の2点で行う事としています。
・変数に代入された値をデバッグプリントで表示(出力)すること
・変数のデータ型を判定しデバッグプリントで表示(出力)すること

それでは、入力コードから順番に見ていきます。

入力コード

Sub datatype_test()

    Dim no As Integer

        '①整数型の変数"no"にApplicationオブジェクトのInputBoxメソッドによる値の入力
        no = Application.InputBox("数値を入力してください", "InputBoxメソッドで数値を入力する", "数値を入力", Type:=1)

    '変数noをデバッグプリントで表示(出力)する
    Debug.Print (no)

        '変数noに代入されたインプットボックスの値が数値であるか判定するコード2種類
        Debug.Print WorksheetFunction.IsNumber(no)
        Debug.Print IsNumeric(no)

        '変数noに代入されたインプットボックスの値が文字列であるか判定するコード2種類
        Debug.Print WorksheetFunction.IsText(no)
        Debug.Print TypeName(no) = "String"

End Sub

実行結果

イミディエイトウィンドウに下記が表示されます。
 1 
True
True
False
False
1行目は変数noに代入された値である” 1 “が表示されています。また変数noは数値であるため上の2行目と3行目の判定ではTrueとなり、文字列判定のその下2行はFalseで返ってきています。

構文

Application.InputBox(Prompt,[Title],[Default],[XPos],[YPos],[HelpFile],[HelpContextId],[Type])

上記がアプリケーションオブジェクトのInputメソッドを使用したInputBoxのコードの書き方となります。()内の引数がたくさんありますが、Prompt以外は任意入力なので省略が可能です。

上記を踏まえた上で今回使用したコードを見ていきたいと思います。

no = Application.InputBox(“数値を入力してください”, “InputBoxメソッドで数値を入力する”, “数値を入力”, Type:=1)

上記が今回使用したアプリケーションオブジェクトのInputメソッドを使用したInputBoxのコードです。
最初の” no= “でユーザーにより入力された値を変数noに代入するコードとなります。

引数の指定については以下のとおりです。

引数
Prompt数値を入力してください
TitleInputBoxメソッドで数値を入力する
Default数値を入力
Type1(数値を指定)
※よく使われる引数のみ抜粋しています。
検証

引数のTypeに数値を指定している状態で文字列を入力してみる

検証内容:InputbBoxメソッドで数値入力指定で文字列の”あ”を入力する

Type引数で指定したもの以外の値を入力するとユーザーにエラー表示し入力画面に戻る

上記でエラー表示し、入力画面に戻るとなっていますが、VBAの実行時エラーとは異なりアプリやシステム上としては誤った入力がされた際の処理としては想定内ものとなります。アプリやシステムをプログラミングする上で想定される正常例以外のシーンへの対処を準備し、ユーザーへ案内することも重要です。

VBA InputBox②:InputBox関数を使う

ApplicationオブジェクトのInputBoxメソッド同様にInputBox関数で入力する場合

確認方法はInputメソッド同様に以下の2点で行う事としています。
・変数に代入された値をデバッグプリントで表示(出力)すること
・変数のデータ型を判定しデバッグプリントで表示(出力)すること

入力コード

Sub datatype_test()

    Dim no As Integer
        
        '②整数型の変数"no"にInputBox関数による値の入力
        no = InputBox("数値を入力してください", "InputBox関数で数値を入力する", "数値を入力")
    
   '変数noをデバッグプリントで表示(出力)する
    Debug.Print (no)

        '変数noに代入されたインプットボックスの値が数値であるか判定するコード2種類
        Debug.Print WorksheetFunction.IsNumber(no)
        Debug.Print IsNumeric(no)

        '変数noに代入されたインプットボックスの値が文字列であるか判定するコード2種類
        Debug.Print WorksheetFunction.IsText(no)
        Debug.Print TypeName(no) = "String"


End Sub

実行結果

イミディエイトウィンドウに下記が表示されます。
 1
True
True
False
False
Inputメソッド同様の結果となります。

構文

InputBox(Prompt,[Title],[Default],[XPos],[YPos],[HelpFile],[HelpContextId])

上記がInputBox関数を使用したInputBoxのコードの書き方となります。()内の引数がたくさんありますが、InputBoxメソッド同様にPrompt以外は任意入力なので省略が可能です。またApplicationオブジェクトのInputBoxメソッドとの違いは引数にTypeの指定がないことです。

no = InputBox(“数値を入力してください”, “InputBox関数で数値を入力する”, “数値を入力”)

InputBox関数で今回使ったコードはこちらです。構文上引数のPromptは必須なので当然ですが、ユーザビリティとして使用される場面が多いTitleとDefaultについても指定しています。

InputBox関数では、InputBoxメソッドと違ってType引数は指定できません。その為、このままの状態だとユーザーの入力を制限することが出来ていない状態となります。

引数の指定については以下のとおりです。

引数
Prompt数値を入力してください
TitleInputBox関数で数値を入力する
Default数値を入力
※よく使われる引数のみ抜粋しています。
検証

InputBox関数でも文字列を入力してみる

検証内容:InputBox関数で数値入力指定で文字列の”あ”を入力する
整数型の変数noに文字列型が代入されたエラー
InputBox関数の戻り値は文字列(String)型です。
※ここでは検証用に整数型の変数に敢えて文字列代入させエラーを発生させましたが、文字列(String)型の変数宣言をしていればこのケースでのエラーは当然発生しません。

数値型の変数に文字列”あ”を代入しようとするとデバッグエラーとなる

こちらはVBA実行時エラーとなります。
一般的なエクセルユーザーが目にすることの無いものなので、これが表示されない対策を講じておきましょう。

この状態のInputBox関数では、InputBoxメソッドで指定したType引数での入力内容に制限がない為、ユーザは数値でも文字列でも自由に入力が可能となります。
これにより整数型の変数noに文字列を代入しようとして箱のラベルと中身の値が違うよ。と言われた状態です。

繰り返し処理を用いてInputBox関数でも入力を数値のみに制限するなどの対処方法はありますので、アプリやシステムを作る上ではユーザーの入力などで想定出来得る範囲での対処を事前に準備しておくこと大切です。

InputBoxメソッドとInputBox関数における引数について

InputBoxの引数一覧とそれぞれを変更したときの効果について

InputBoxメソッドやInputBox関数の引数は共通している部分が多いので以下にまとめて紹介します。

Application.InputBox及びInputBox
引数について

  • Prompt
    1. 入力は必須(省略不可)
    2. 「●●を入力してください。」などの案内などに用いる。

  • [Title]
    1. 入力は任意(省略可)
    2. ウィンドウの上部タイトルの文字列となります。

  • [Default]
    1. 入力は任意(省略可)
    2. インプットボックス内の初期値を設定します。

  • [XPos]
    1. 入力は任意(省略可)
    2. インプットボックスを表示するX座標を指定します。
      (画面の左上隅を基準にポイントで座標を指定。別途指定しない場合は中央に表示されます。)

  • [YPos]
    1. 入力は任意(省略可)
    2. インプットボックスを表示するY座標を指定します。
      (画面の左上隅を基準にポイントで座標を指定。別途指定しない場合は中央に表示されます。)

  • [HelpFile]
    1. 入力は任意(省略可)
    2. ヘルプファイルを指定します。

  • [HelpContextId]
    1. 入力は任意(省略可)
    2. ContextまたはHelpContextIdにはヘルプファイル内のページを示すコンテキストIDを指定します。

  • [Type](※Application.InputBoxのみ指定可能)
    1. 入力は任意(省略可)
    2. InputBoxメソッドが返すデータの型を指定します。
      1. 0 数式
      2. 1 数値
      3. 2 文字列
      4. 4 論理値(True/False)
      5. 8 セル参照(Rangeオブジェクト)
      6. 16 エラー値(#N/Aなど)
      7. 64 数値配列

それぞれの引数がメッセージボックスのどの部分にあたるかは以下の画像を参照

Prompt以外は任意入力ですが、それぞれを指定した場合はそれぞれの箇所が変化します。

ユーザーが使用する上で入力誤りや入力時の迷いを極力減らす作りとし、ユーザビリティを意識していくのであれば[Title]や[Default]の引数は積極的に使っていくことをおすすめします。

VBAにおけるInputBoxの種類と使い方まとめ

要点だけまとめるとこんな感じです。

InputBoxまとめ
  • VBAにおけるInputBoxは2種類ある
    • ApplicationオブジェクトのInputBoxメソッド
    • InputBox関数

  • コードの違いについて
    • Application.InputBox(Prompt)
    • InputBox(Prompt)

  • InputBoxに関する引数について
    • PromptはどちらのInputBoxでも必須
    • Type引数はApplicationオブジェクトのInputBoxメソッドのみ指定可能

  • それぞれの戻り値について
    • ApplicationオブジェクトのInputBoxメソッドはType引数で指定可能
    • InputBox関数は文字列(String)型となる

今回はVBAにおいてユーザーからの入力を促すInputBoxについて紹介しました。

結論として、戻り値のデータ型を厳密に指定するのであれば、ApplicationオブジェクトのInputBoxメソッドを使った方がその後の変数代入との関係においても重大なエラーが発生しにくくなります。

komori
komori

お疲れ様でした。

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

コダマのもりブログはにほんブログ村に登録しています。
この記事が役に立ったと感じていただけた人は是非フォローお願いします。
にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村
PVアクセスランキング にほんブログ村コダマのもりブログ - にほんブログ村

コメント

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