2つのインプットボックス。関数とメソッド、特徴を生かした使い分け

vbainputboxeyecatch

エクセルVBAで使えるデータ入力ダイアログ、InputBoxは2種類あります。

それぞれの特徴を生かした使い分けをすることで、使えるツールの引き出しを増やすことも出来ます。

エクセルVBAのプログラムで、利用者からの入力データを取り込んでコードを実行していくことがあります。

その簡潔な方法としてインプットボックスがあります。今回はこのインプットボックス(InputBox)の使い方についてです。

こんにちは、じゅんぱ店長(@junpa33)です。

「関数リファレンス」を調べる

2つのインプットボックス。
関数とメソッド、特徴を生かした使い分け

エクセル VBAで作るソフトで、利用者にデータ入力をしてもらうためのツールとしてInputBoxを利用します。

ユーザーフォームで入力欄を作成するよりも遥かに簡単に利用することが出来ます。

InputBoxには、2つのタイプがあります。

になります。

「どっちがどうなの?」

ということですが最大の違いの一つとしては、

InputBox関数が表示されているときは「アプリケーションモーダル」つまりシートのセル選択ができないということです。

InputBoxメソッドは表示中でも自由にセルを選択することが出来ます。

ということです。

それ以外にも、違いはありますが、それぞれの個別説明で解説していきます。

解説例題の設定

この様なデータを想定します。

この表の番号4のデータの「果物」と「値段」をInputBoxから入力する。

InputBoxでデータを番号で呼び出して「果物」名をメッセージボックスで表示する。

というVBAコードを考えます。

vbainputbox000

InputBox関数の特徴と使い方

InputBox関数の構文としては、

InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile] [, context])

です。

引数は、常用のものとしては、「prompt」「[, title]」「[, default]」だと思います。

prompt省略することはできません。「表示されるメッセージ」です。長文で改行する場合は折り返したい部分に「 & vbCrLf &」を挿入します。
titleタイトルを指定します。省略可能です。
defaultダイアログ表示時に、初期値を表示したいときに指定します。省略すると何も表示されません。
xpos省略可能です。(x方向)水平方向にモニター画面左端からダイアログまでの位置を指定します。
ypos省略可能です。(Y方向)垂直方向にモニター画面上端からダイアログまでの位置を指定します。
helpfile省略可能です。ヘルプファイルを指定します。
context省略可能です。ヘルプトピックで指定したコンテキスト番号を指定します。

注意ポイント

InputBox関数の場合は、入力できるデータのタイプが「文字列」と「数値」になります。

InputBox関数の使用例と注意点

InputBox関数の使用例です。

一見すると普通に問題なく動作するようにも思えますが・・・

MEMO

Match関数についてはこちらを参考にしてください。

vbamatcheyecatch001 エクセルVBAで使うMatch関数 活用度アップでテッパン関数に!

InputBox関数コード
Sub インプットボックス1()

Dim MyDa As Variant, MyDb As Long, MyDc As Long
Dim MyMsga As String, MyTitlea As String
Dim MyMsgb As String, MyTitleb As String
Dim MyMsgc As String, MyTitlec As String
Dim MyR As Long

'文字列を入力
MyMsga = "果物名を入力してください。"
MyTitlea = "果物名入力"

MyDa = InputBox(MyMsga, Title:=MyTitlea)
Range("B5") = MyDa

'数値を入力
MyMsgb = "値段を入力してください。"
MyTitleb = "価格入力"

MyDb = InputBox(MyMsgb, Title:=MyTitleb)
Range("C5") = MyDb

'数値を入力
MyMsgc = "番号を入力してください。"
MyTitlec = "番号入力"

MyDc = InputBox(MyMsgc, Title:=MyTitlec)
MyR = WorksheetFunction.Match(MyDc, Range("A:A"), 0)

MsgBox Range("B" & MyR).Value

End Sub

実行結果

文字列の入力すると

vbainputbox001

数値1を入力すると(全角数字ですが入力されました。)

vbainputbox002

数値2を入力します。それと結果です。

vbainputbox003
vbainputbox004

う~ん 至って正常です。


では、何がダメダメなのかについてです。

常用する上では結構重要な部分になります。ここは押さえておきましょう!

それぞれの入力ダイアログが表示されたところで、「キャンセル(入力中止)」してみてください。

その結果を表示します。

文字列の入力を「キャンセル」すると、・・・ 何も起こりません!

vbainputbox005
vbainputbox006

数値の入力を「キャンセル」すると、・・・ あらら、エッエラーが出てしまいました。もしかしてバカなの?

vbainputbox007
vbainputbox008

必ず覚えておきましょうInputBox関数を使った時に、ダイアログで「キャンセル」ボタンを押したときは、

戻り値として「”” (空)」の文字列が返ります。

ここで、エクセル自身が数値と判断できない値ということで、「型が一致しませんエラー」を表示することになりました。

したがって、

解決のテクニック

「数値を入力」の部分のコードを、修正していきます。

「Val関数」は、文字列を数値型に変換して返す関数です。

「”” (空)」の文字列を「0」に変換してしまいましょう。

全体として正しくは、このように修正しておきましょう。

VBAValeyecatch Val関数の使い方はデータ型不一致の解決策。値を文字列型から数値型へ

InputBox関数コード改
Sub インプットボックス2()

Dim MyDa As Variant, MyDb As Long, MyDc As Long
Dim MyMsga As String, MyTitlea As String
Dim MyMsgb As String, MyTitleb As String
Dim MyMsgc As String, MyTitlec As String
Dim MyR As Long

'文字列を入力
MyMsga = "果物名を入力してください。"
MyTitlea = "果物名入力"

MyDa = InputBox(MyMsga, Title:=MyTitlea)
Range("B5") = MyDa

'数値を入力
MyMsgb = "値段を入力してください。"
MyTitleb = "価格入力"

MyDb = Val(InputBox(MyMsgb, Title:=MyTitleb))
Range("C5") = MyDb

'数値を入力
MyMsgc = "番号を入力してください。"
MyTitlec = "番号入力"

MyDc = Val(InputBox(MyMsgc, Title:=MyTitlec))
On Error Resume Next
MyR = WorksheetFunction.Match(MyDc, Range("A:A"), 0)

MsgBox Range("B" & MyR).Value

End Sub

InputBoxメソッドの特徴と使い方

InputBoxメソッドの構文としては、

Application.InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile] [, context] [, type])

です。

InputBox関数の時と同様、常用のものとしては、prompt」「[, title]」「[, default]だと思います。

引数の意味も同様です。

ただし、メソッドにしかない引数として [,type]というのがあります。

typeテキストボックスに入力するデータの方を数値で指定します。
省略可能です。省略の場合は選択したデータ型が「文字列」とみなされます。
型 意味
数式0
数値1
文字列(テキスト)2
理論値(TrueまたはFalse)4
セル参照(Rangeオブジェクト)8
エラー値 #N/Aなど16
数値配列64

InputBoxメソッドの使用例と注意点

関数で使った例示をメソッドでも使ってみます。

ダイアログのデザインも関数とは異なっています。

コード
Sub インプットボックス3()

Dim MyDa As Variant, MyDb As Long, MyDc As Long
Dim MyMsga As String, MyTitlea As String
Dim MyMsgb As String, MyTitleb As String
Dim MyMsgc As String, MyTitlec As String
Dim MyR As Long

'文字列を入力
MyMsga = "果物名を入力してください。"
MyTitlea = "果物名入力"

MyDa = Application.InputBox(MyMsga, Title:=MyTitlea, Type:=2)
Range("B5") = MyDa

'数値を入力
MyMsgb = "値段を入力してください。"
MyTitleb = "価格入力"

MyDb = Application.InputBox(MyMsgb, Title:=MyTitleb, Type:=1)
Range("C5") = MyDb

'数値を入力
MyMsgc = "番号を入力してください。"
MyTitlec = "番号入力"

MyDc = Application.InputBox(MyMsgc, Title:=MyTitlec, Type:=1)
On Error Resume Next
MyR = WorksheetFunction.Match(MyDc, Range("A:A"), 0)

MsgBox Range("B" & MyR).Value

End Sub

実行結果

文字列を入力  MyDa = ”バナナ”

数値を入力   MyDb = 250

数値を入力   MyDc = 3

とダイアログに入力して、正常に実行できました。

vbainputbox011
vbainputbox009


次に、ダイアログで「キャンセル」ボタンを押して行ったときはどうなるかというと、

文字列の入力部分で「FALSE」、数値の入力部分で「0」が表示されました。

vbainputbox010

必要なもの
InputBoxメソッドを使った時に、ダイアログで「キャンセル」ボタンを押したときは、戻り値として、文字列指定で「False」、数値指定で「False」を数値化したものとして「0」が返ります。

したがって、

InputBoxメソッドの場合は「False」をどのように処理するのかを考えていきます。

今回は、文字列の入力のところで、リスト表示がFALSEではいけないので、

「””(空欄)」になるようにしておきます。If条件文で処理します。

コード
Sub インプットボックス4()

Dim MyDa As Variant, MyDb As Long, MyDc As Long
Dim MyMsga As String, MyTitlea As String
Dim MyMsgb As String, MyTitleb As String
Dim MyMsgc As String, MyTitlec As String
Dim MyR As Long

'文字列を入力
MyMsga = "果物名を入力してください。"
MyTitlea = "果物名入力"

MyDa = Application.InputBox(MyMsga, Title:=MyTitlea, Type:=2)
If MyDa <> False Then
    Range("B5") = MyDa
Else
    Range("B5") = ""
End If

'数値を入力
MyMsgb = "値段を入力してください。"
MyTitleb = "価格入力"

MyDb = Application.InputBox(MyMsgb, Title:=MyTitleb, Type:=1)
Range("C5") = MyDb

'数値を入力
MyMsgc = "番号を入力してください。"
MyTitlec = "番号入力"

MyDc = Application.InputBox(MyMsgc, Title:=MyTitlec, Type:=1)
On Error Resume Next
MyR = WorksheetFunction.Match(MyDc, Range("A:A"), 0)

MsgBox Range("B" & MyR).Value

End Sub

2つのInputBox 特徴ごとに使い分け まとめ

InputBoxメソッドはエクセルVBAの中に属しているメソッドで、

InputBox関数はVisual Basicの中の関数ですので、出自が違います。

そういうことからも、ちょっとした違いが存在しているということです。

個人的には、

InputBox関数の方が、アプリケーションモーダルになるので、誤クリックによる変な入力ミスを防げるという面があるかと思います。

入力したいデータ型を限定できるという面では、InputBoxメソッドに利点がありますし、ダイアログのデザインもこちらの方がいいですし。

お好みでどうぞ!

という所でしょうか。

対話型のコード作成で重要な「InputBox」の
基本を学ぶために

エクセルVBAの初級より「InputBox」は参考書に登場します。

初級の参考書では、その項目だけをいきなり読むのではなくて、

最初からちゃんと順に読んでいく方がいいでしょう。基礎ベースはしっかり積み上げておきましょう。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

エクセルVBAの独習には動画学習という方法もあります。 目と耳両方を使って学習することでさらに勉強効率を上げることもできると思います。

Udemy1eyecatch エクセルVBA初級者がUdemyで動画学習する講座おすすめ5選と無料講座の上手な使い方。

改訂新版 てっとり早く確実にマスターできるExcel VBAの教科書
定番参考書の改定新版が、動画付きになりもっと分かり易くなった
vbastudy022a
vbastudy023a

電子書籍版「改訂新版 てっとり早く確実にマスターできるExcel VBAの教科書」をamazonで見てみる

(著者)大村あつし
(出版社)技術評論社
(税込価格)2,508円(本体2,280円+税)

30冊を超えるExcelのマクロやVBAの解説書を執筆してきた著者による考え抜かれた本書の内容と構成。
独創的な解説手法で必ずExcel VBAが理解できます!
初級からの参考書ですが、より実践的切り口での解説をしています。
QRコードから操作の流れを動画(無音です)で確認することもできるようになりました。
文章解説と動画との関係性は、主は文章での解説、サポートが動画になります。

このサイトでよく使うVBAのコードのトピックを纏めています。

エクセルVBA最速理解で必要な知識を集めよう!

今回の記事はここまでです。   最後までご覧いただき有難うございました。

<記事内容についての告知>VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。