VBA(マクロ)でユーザーからの入力を受け取りたい時に使えるのがInputBox(インプットボックス)です。
InputBox(インプットボックス)はマクロの使用者にテキストボックスを表示し、入力を受け付ける機能です。
これをつかうことで、マクロを使用するユーザーからの選択や指示をマクロの処理に利用ができます。
InputBox(インプットボックス)の使用例として簡単なものをあげると、パスワードの入力や、データベースから特定のデータを検索するキーワードの入力など、使用者(ユーザー)からの情報を受け取り、利用するマクロやプログラムが作れます。
使用者(ユーザー)から情報を受け取れるアプリやプログラムは、対話型プログラムとも呼ばれ、世の中の便利なアプリは対話型になっているものが多く、使用者(ユーザー)から何かしらの情報を受け取るような仕組みを持っています。
エクセルVBAも、他のプログラミング言語と同じく対話型アプリがつくれます。使用者(ユーザー)の主旨や意向を受け取って結果を返すマクロは、使用者(ユーザー)の満足度を高めるため、品質が良くなると言えます。
本記事では、対話型マクロをつくるために必要な、InputBox(インプットボックス)の使いかたと注意点などを解説していますので、プログラミングのスキルアップを目指す人の参考になれば幸いです。
なぜ、膨大な事務作業でも定時で退社できるのか。
実務をプロから学べる「ユースフル」の動画は永年見放題。Q&A機能で分からないを放置しないから安心。
詳しくは以下のリンクをクリック
【結論】インプットボックス(InputBox)は2種類
2つのインプットボックスと書き方は以下のとおり
ApplicationオブジェクトのInputBoxメソッド
Application.InputBox(Prompt,[Title],[Default],[XPos],[YPos],[HelpFile],[HelpContextId],[Type])
InputBox関数
InputBox(Prompt,[Title],[Default],[XPos],[YPos],[HelpFile],[HelpContextId])
Microsoft® Excel® 2019 MSO (バージョン 2301 ビルド 16.0.16026.20002) 32 ビットのものなので、ご利用環境の画面と異なる可能性があります。
InputBoxとはどういったものか
スマートフォンやWeb上のアプリなどにおいても、ユーザー名の登録や生年月日などの入力を求められた経験があると思いますので、なんとなくイメージできるのではないでしょうか。
InputBox(インプットボックス)は、VBAにおけるユーザーからの入力を受け取る手段(プログラム)と覚えておいてもらえば大丈夫です。
マクロを使う人からのメッセージを受け取れるものだと考えればわかりやすいね。
InputBoxでは予想外の入力がされることも少なくない
アプリをつくったり、プログラムを書く人にとっては、ユーザーから受け取った値を利用して、その後の処理を分岐させていくことは少なくないですが、そもそも入力を受け付ける上で想定しておかないとならない点があります。
それは、ユーザーからの入力で意図しない値が入力されると、マクロやプログラムのエラーが発生して停止してしまうことです。こちらの記事では、InputBoxの使いかたを紹介したいので、詳しい対処方法は他の記事で掲載しています。InputBoxの使いかたを知っているけど、エラーの対処方法をお探し人は、こちらの記事をご覧ください。
ApplicationオブジェクトのInputBoxメソッド
まずは、ApplicationオブジェクトのInputBoxメソッドを使ったコードの書き方についてですが、コードを書いて実行すると以下のような入力ウィンドウが表示されます。
この記事のサンプルプログラムでは、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
2行目と3行目は、InputBox(インプットボックス)で入力された値が整数型であるかの判定結果を表示していて「 True 」が返ってきています。
同様に4行目と5行目は入力された値が文字列型であるかの判定結果を表示しており、結果は「False」となります。
Applicationオブジェクト
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(数値を指定) |
InputBoxメソッドのタイプ(type)引数に数値(1)とした状態で文字列を入力
検証
InputbBoxメソッドの引数で数値のみ入力可を指定した状態で文字列「 あ 」を入力する
上記でエラー表示し、入力画面に戻りますが、これはVBAのバグ(実行時エラー)とは異なり、アプリやシステム上で誤った入力がされた際の通知としてユーザーに知らせる処理となります。
アプリやシステムを作る際に想定される正常以外のルートへの対処を準備しておくことも、未然にバグを防ぐことに繋がります。
InputBoxメソッドをあつかう上で覚えておきたいポイント
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 | 省略可能 |
InputBox関数で文字列を入力
検証
エラーが発生しました。
これはサンプルコードで宣言した変数「 no 」が整数型であったのに対して、InputBox関数の戻り値が文字列(String)型であるため変数の型と値の型が異なることが原因で発生したものになります。
戻り値を代入する変数をつかう場合、文字列(String)型か、万能(Variant)型を宣言すればエラーは発生しません。
InputBox関数をあつかう上で覚えておきたいポイント
変数や値の型の種類については、こちらの記事で詳しく紹介しています。また、InputBox関数でダイアログを表示したけど、ユーザーからの入力を制限する方法については、以下の記事を参考に開発をすることをおすすめします。
InputBoxメソッドとInputBox関数における引数について
InputBoxの引数一覧とそれぞれを変更したときの効果について
InputBoxメソッドや、InputBox関数の引数は共通部分が多いのため、以下にまとめて紹介します。
引数 | メソッド/関数 | 必須 or 省略可能 | 効果 |
---|---|---|---|
Prompt | 両方 | 必須 | ダイアログ ボックスに表示するメッセージを指定 |
Title | 省略可能 | ダイアログ ボックスのタイトルを指定 | |
Default | 入力欄の初期値 | ||
XPos | ウィンドウのX座標(画面の左上隅を基準) | ||
YPos | ウィンドウのY座標(画面の左上隅を基準) | ||
HelpFile | ヘルプファイルを指定 | ||
HelpFile | ContextまたはHelpContextIdにはヘルプファイル内のページを示すコンテキストIDを指定 | ||
Type | InputBoxメソッドのみ | 入力するデータの型を指定 |
各引数のイメージ図
引数の[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メソッドを使った方がその後の変数代入との関係においても重大なエラーが発生しにくくなります。
お疲れ様でした。
最後までお読み頂きありがとうございました。
この記事が役に立ったと感じていただけた人は是非フォローお願いします。
にほんブログ村 |
コメント