エクセルVBA|InputBoxの使いかたと入力された値を利用するマクロ

vba

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

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

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

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

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

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

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

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

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

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

構文

1.ApplicationオブジェクトのInputBoxメソッド
Application.InputBox(Prompt,[Title],[Default],[XPos],[YPos],[HelpFile],[HelpContextId],[Type])

2.InputBox関数
InputBox(Prompt,[Title],[Default],[XPos],[YPos],[HelpFile],[HelpContextId])

Application.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引数を指定すると入力された値のデータ型を指定することができます。

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

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

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

検証

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

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

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

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

1.InputBoxメソッドの引数である「Prompt」は最大で約 255 文字使用可能

2.InputBoxメソッドでの戻り値のデータ型はType引数で指定可能

3.Type引数は複数の指定も可能
数値と文字列の両方入力可能とする場合 Type:= 1 + 2 と書く

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

エクセルで繰り返しや転記作業で苦しい思いをした経験はありませんか?
今まで苦労してきたその作業を簡単なプログラムをおぼえるだけで解決できる可能性があります。
なるべくお金や時間をかけずにエクセルマクロ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)型となります。
数値を入力した場合でも文字列で返ってきます。

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

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

InputBox関数で文字列を入力

検証

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

エラーが発生しました。


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

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

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

1.InputBox関数の引数である「Prompt」は最大で約 1024 文字使用可能

2.InputBox関数での戻り値は必ず文字列(String)型となる

3.入力ボックスは255文字まで入力可能で戻り値は254 文字に切り捨てられる

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

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

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

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

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

各引数のイメージ図

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

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

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をコピーしました