エクセルVBA|InputBoxメソッドとInputBox関数の使い方

VBA(マクロ)でユーザーからの入力を受け取りたい時に使えるのがInputBox(インプットボックス)です。
InputBox(インプットボックス)はマクロの使用者にテキストボックスを表示し、入力を受け付ける機能です。

これをつかうことで、マクロを使用するユーザーからの選択や指示をマクロの処理に利用ができます。

InputBox(インプットボックス)の使用例として簡単なものをあげると、パスワードの入力や、データベースから特定のデータを検索するキーワードの入力など、使用者(ユーザー)からの情報を受け取り、利用するマクロやプログラムが作れます。

使用者(ユーザー)から情報を受け取れるアプリやプログラムは、対話型プログラムとも呼ばれ、世の中の便利なアプリは対話型になっているものが多く、使用者(ユーザー)から何かしらの情報を受け取るような仕組みを持っています。

エクセルVBAも、他のプログラミング言語と同じく対話型アプリがつくれます。使用者(ユーザー)の主旨や意向を受け取って結果を返すマクロは、使用者(ユーザー)の満足度を高めるため、品質が良くなると言えます。

本記事では、対話型マクロをつくるために必要な、InputBox(インプットボックス)の使いかたと注意点などを解説していますので、プログラミングのスキルアップを目指す人の参考になれば幸いです。

独学の学習効率でお悩みの人必見!
<動画学習見放題サービス>

初心者にやさしいチューターなら今すぐにはじめられる

オンラインで学習したい
プログラミングで副業をはじめたい
パソコン・エクセルの学習をしたい

【結論】インプットボックス(InputBox)は2種類

2つのインプットボックスと書き方は以下のとおり

ApplicationオブジェクトのInputBoxメソッド

構文

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

Application.InputBoxを実行したときに表示される入力ウィンドウ
Application.InputBoxメソッドの入力ダイアログ

InputBox関数

構文

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

InputBox関数を実行したときに表示される入力ウィンドウ
InputBox関数の入力ダイアログ

Microsoft® Excel® 2019 MSO (バージョン 2301 ビルド 16.0.16026.20002) 32 ビットものなので、ご利用環境の画面と異なる可能性があります。

この記事はExcelVBAでマクロの使用者(ユーザー)からの入力をうけて、その受けた内容に応じた処理をする対話型プログラムを作りたいと考えているプログラミング初心者さんに向けた記事となります。

InputBoxとはどういったものか

スマートフォンやWeb上のアプリなどにおいても、ユーザー名の登録や生年月日などの入力を求められた経験があると思いますので、なんとなくイメージできるのではないでしょうか。

InputBox(インプットボックス)は、VBAにおけるユーザーからの入力を受け取る手段(プログラム)と覚えておいてもらえば大丈夫です。

マクロを使う人からのメッセージを受け取れるものだと考えればわかりやすいね。

InputBoxでは予想外の入力がされることも少なくない

アプリをつくったり、プログラムを書く人にとっては、ユーザーから受け取った値を利用して、その後の処理を分岐させていくことは少なくないですが、そもそも入力を受け付ける上で想定しておかないとならない点があります。

それは、ユーザーからの入力で意図しない値が入力されると、マクロやプログラムのエラーが発生して停止してしまうことです。こちらの記事では、InputBoxの使いかたを紹介したいので、詳しい対処方法は他の記事で掲載しています。InputBoxの使いかたを知っているけど、エラーの対処方法をお探し人は、こちらの記事をご覧ください。

ApplicationオブジェクトのInputBoxメソッド

まずは、ApplicationオブジェクトのInputBoxメソッドを使ったコードの書き方についてですが、コードを書いて実行すると以下のような入力ウィンドウが表示されます。

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

この記事のサンプルプログラムでは、InputBox(インプットボックス)に入力された値を以下の処理することで確認しています。

  • 変数に代入された値をデバッグプリントで表示(出力)すること
  • 変数のデータ型を判定し、デバッグプリントで表示(出力)すること

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

入力コード

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 」が表示されています。
2行目と3行目は、InputBox(インプットボックス)で入力された値が整数型であるかの判定結果を表示していて「 True 」が返ってきています。


同様に4行目と5行目は入力された値が文字列型であるかの判定結果を表示しており、結果は「False」となります。

Applicationオブジェクト

InputBoxメソッドの構文

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

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

今回使用したコードを見ていきたいと思います。

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

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

※type引数を指定すると入力された値のデータ型を指定することができます。

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

InputBoxメソッドの引数 必須 or 省略可能 それぞれの引数に指定した値
Prompt 必須 数値を入力してください
Title 省略可能 InputBoxメソッドで数値を入力する
Default 省略可能 数値を入力
XPos 省略可能
YPos 省略可能
HelpFile 省略可能
HelpContextId 省略可能
Type 省略可能 1(数値を指定)
※Xpos、Ypos、HelpFile、HelpContextIdの引数は指定していません。

InputBoxメソッドのタイプ(type)引数に数値(1)とした状態で文字列を入力

検証

InputbBoxメソッドの引数で数値のみ入力可を指定した状態で文字列「 あ 」を入力する

Type引数で数値を指定した状態で文字列を入力するとユーザーにエラーを表示し入力画面に戻る

上記でエラー表示し、入力画面に戻りますが、これはVBAのバグ(実行時エラー)とは異なり、アプリやシステム上で誤った入力がされた際の通知としてユーザーに知らせる処理となります。
アプリやシステムを作る際に想定される正常以外のルートへの対処を準備しておくことも、未然にバグを防ぐことに繋がります。

InputBoxメソッドをあつかう上で覚えておきたいポイント

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

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

InputBox関数

InputBox関数を実行した場合に表示される入力ダイアログ

この記事のサンプルプログラムでは、InputBox(インプットボックス)に入力された値を以下のように処理することで確認しています。

●変数に代入された値をデバッグプリントで表示(出力)すること

●変数のデータ型を判定しデバッグプリントで表示(出力)すること

InputBox関数についても入力コードから見ていきます。

入力コード

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

ApplicationオブジェクトのInputBoxメソッドの結果同様に、1行目から変数の値である「 1 」、入力された値が数値であるため2・3行目が「 True 」が返ってきます。4・5行目は文字列であるかの判定のため「 False 」となります。

InputBox関数

構文

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

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

使用したコードを見ていきます。

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

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

InputBox関数では、InputBoxメソッドと違ってType引数は指定できません。
InputBox関数で表示されたウィンドウで入力された値は必ず文字列(String)型となります。
数値を入力した場合でも文字列で返ってきます。

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

InputBox関数の引数 必須 or 省略可能 それぞれの引数に指定した値
Prompt 必須 数値を入力してください
Title 省略可能 InputBox関数で数値を入力する
Default 省略可能 数値を入力
XPos 省略可能
YPos 省略可能
HelpFile 省略可能
HelpContextId 省略可能
※Xpos、Ypos、HelpFile、HelpContextIdの引数は指定していません。
※InputBox関数にはType引数はありません

InputBox関数で文字列を入力

検証

整数型の変数noに文字列型が代入されたエラー

エラーが発生しました。


これはサンプルコードで宣言した変数「 no 」が整数型であったのに対して、InputBox関数の戻り値が文字列(String)型であるため変数の型と値の型が異なることが原因で発生したものになります。

戻り値を代入する変数をつかう場合、文字列(String)型か、万能(Variant)型を宣言すればエラーは発生しません。

InputBox関数をあつかう上で覚えておきたいポイント

POINT

変数や値の型の種類については、こちらの記事で詳しく紹介しています。また、InputBox関数でダイアログを表示したけど、ユーザーからの入力を制限する方法については、以下の記事を参考に開発をすることをおすすめします。

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

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

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

引数 メソッド/関数 必須 or 省略可能 効果
Prompt 両方 必須 ダイアログ ボックスに表示するメッセージを指定
Title 省略可能 ダイアログ ボックスのタイトルを指定
Default 入力欄の初期値
XPos ウィンドウのX座標(画面の左上隅を基準)
YPos ウィンドウのY座標(画面の左上隅を基準)
HelpFile ヘルプファイルを指定
HelpFile ContextまたはHelpContextIdにはヘルプファイル内のページを示すコンテキストIDを指定
Type InputBoxメソッドのみ 入力するデータの型を指定
※Type引数は、以下のように設定可能です。
0:数式 1:数値 2:文字列(テキスト) 4:論理値(True または False) 8:セル範囲(Rangeオブジェクト) 16:N/A などのエラー値 64:値の配列

各引数のイメージ図

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

引数の[prompt]は入力必須なので省略するとエラーになりますが、入力ダイアログを表示した際に直感的にわかりやすいという点も大切です。ユーザーの立場を想像すると任意入力の引数のうち[Title][Default]などはシーンに応じてにつかうことおすすめします。

期待値が入力されるまでInputBoxを表示するサンプルマクロ

InputBoxメソッドをつかってユーザーからの入力を受け取るマクロでは、意図しない値が入力されたときの処理を考えておく必要があります。ここでは、1から9の1桁の数値以外の入力がされたときはInputBoxの表示を続けるサンプルマクロ紹介します。

こちらのサンプルマクロでは、ユーザーからInputBoxに入力された1桁の数値に1から9の掛け算の結果をデバッグプリントで表示します。

Sub 入力制限()

    'デバッグプリントで九九を実行するマクロ
    
    '繰り返し用のカウンタ変数の宣言
    Dim i As Long: i = 1
    
    'ユーザーから入力された値を代入する変数の宣言
    Dim Tstr As Variant
    
    '条件に一致する値が入力されるまで入力ボックスを表示する
    Do
        Tstr = Application.InputBox("1~9の数値を入力してください。", "数値を入力", "2", Type:=1 + 2)
    
    'Len関数を使って変数に代入された文字列の文字数を表示する
        Debug.Print Len(Tstr)
    
    '未入力でOK、キャンセル、0、2桁数値が返ってきた場合はインプットボックスを表示し続ける
    Loop While Len(Tstr) >= 2 Or Tstr = 0 Or Tstr = "" Or Tstr = False
    
    
    'ユーザーから入力された数の九九の実行結果をデバッグプリントで出力する
    For i = 1 To 9
        Debug.Print i * Tstr
    Next i

End Sub

9行目:変数Tstrのデータ型はVariant(万能)型で宣言する

InputBoxでユーザーから入力される値は1桁の数値であることが期待されるため、値を代入する変数のデータ型は整数型や文字列型が適切であると考えられますが、InputBoxにて未入力でOKとなる場合や、InputBoxでキャンセルボタンがクリックされた場合は、変数と値のデータ型が異なるエラーが発生する恐れがあることから、Variant(万能)型で宣言しています。

13行目:Application.InputBoxのType引数の指定方法は数値か文字列にする

InputBoxメソッドのType引数では、ユーザーからの入力を制限するためにType引数は数値か文字列で指定しています。

19行目:繰り返しの条件設定

条件に指定しているのは以下のとおりです。
下記のいずれかの条件に当てはまる場合は、改めてInputBoxを表示し続けます。

  • Len関数によるInputBoxで入力された値が2桁以上の数値や文字列ではないか
  • InputBoxで入力された値が0ではないか
  • InputBoxで入力された値が未入力ではないか
  • InputBoxでキャンセルがクリックされてはいないか

指定した範囲の値が入力されたときのエラーの発生を予防するためだね。

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

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

1.ApplicationオブジェクトのInputBoxメソッド
2.InputBox関数

2種類のInputBoxのコードの違い

1.Application.InputBox(Prompt)
2.InputBox(Prompt)

2種類のInputBoxの引数の違い

1.Type引数はApplicationオブジェクトのInputBoxメソッドのみ指定可能

2種類のInputBoxの戻り値の型の違い

1.ApplicationオブジェクトのInputBoxメソッドはType引数で指定可能
2.InputBox関数は文字列(String)型となる

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

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

お疲れ様でした。

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

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

コメント

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