エクセルVBAで使えるデータ入力ダイアログ、InputBoxは2種類あります。
それぞれの特徴を生かした使い分けをすることで、使えるツールの引き出しを増やすことも出来ます。
エクセルVBAのプログラムで、利用者からの入力データを取り込んでコードを実行していくことも多くあります。
その簡潔な方法としてインプットボックスがあります。今回はこのインプットボックス(InputBox)の使い方についてです。
こんにちは、じゅんぱ店長(@junpa33)です。
コンテンツ
2つのインプットボックス 関数とメソッド
エクセル VBAで作るソフトで、利用者にデータ入力をしてもらうためのツールとしてInputBoxを利用します。
ユーザーフォームで入力欄を作成するよりも遥かに簡単に利用することが出来ます。
InputBoxには、2つのタイプがあります。
です。
「どういう使い分けがあるの?」ということですが、最大の違いの一つとしては、
- InputBox関数が表示されているときは「アプリケーションモーダル」つまりシート上のセル操作ができません。
- InputBoxメソッドは表示中でも自由にセルを選択することが出来ます。
ということです。
それ以外にも、違いはいろいろありますが、それぞれの個別説明で解説していきます。
解説例題の設定
この様なデータを想定します。
この表の番号4のデータの「果物」と「値段」をInputBoxから入力する。
InputBoxでデータを番号で呼び出して「果物」名をメッセージボックスで表示する。
というVBAコードを考えます。
例題
インプットボックスで番号4の「果物名」を入力し、「値段」を入力し、「入力した番号」からその番号の果物名を取得します。
InputBox関数の特徴と使い方
InputBox関数の構文
InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile] [, context])
です。
引数は、常用のものとしては、「prompt」「[, title]」「[, default]」だと思います。
引数 | 説明 |
---|---|
prompt | 省略することはできません。「表示されるメッセージ」です。長文で改行する場合は折り返したい部分に「 & vbCrLf &」を挿入します。 |
title | タイトルを指定します。省略可能です。 |
default | ダイアログ表示時に、初期値を表示したいときに指定します。省略すると何も表示されません。 |
xpos | 省略可能です。(x方向)水平方向にモニター画面左端からダイアログまでの位置を指定します。 |
ypos | 省略可能です。(Y方向)垂直方向にモニター画面上端からダイアログまでの位置を指定します。 |
helpfile | 省略可能です。ヘルプファイルを指定します。 |
context | 省略可能です。ヘルプトピックで指定したコンテキスト番号を指定します。 |
注意ポイント
InputBox関数の場合は、入力できるデータのタイプが「文字列」と「数値」になります。
例題
インプットボックスで番号4の「果物名」を入力し、「値段」を入力し、「入力した番号」からその番号の果物名を取得します。
InputBox関数の使用例です。
一見すると普通に問題なく動作するようにも思えますが・・・
Option Explicit
Sub インプットボックス1()
Dim MyDa As Variant
Dim MyDb, MyDc, MyR As Long
Dim MyMsga, MyTitlea As String
Dim MyMsgb, MyTitleb As String
Dim MyMsgc, MyTitlec As String
'文字列を入力
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
- Match関数についてはこちらを参考にしてください。
実行結果
文字列(果物名)の入力すると
数値1(値段)を入力すると(全角数字ですが入力されました。)
数値2(番号)を入力します。それと結果です。
常用する上では結構重要な部分になります。ここは押さえておきましょう!
それぞれの入力ダイアログが表示されたところで、「キャンセル(入力中止)」してみてください。
その結果を表示します。
文字列(果物名)の入力をキャンセルすると
文字列の入力を「キャンセル」すると、・・・ 何も起こりません!
数値1(値段)を入力をキャンセルすると
数値の入力を「キャンセル」すると、・・・ エラーが出てしまいました!
InputBox関数を使った時に、ダイアログで「キャンセル」ボタンを押したときは、
戻り値として「”” (空)」の文字列が返ります。
ここで、エクセル自身が数値と判断できない値ということで、「型が一致しませんエラー」を表示することになりました。
エラー対策
「数値を入力」の部分のコードを、修正していきます。
「Val関数」は、文字列を数値型に変換して返す関数です。
「”” (空)」の文字列を「0」に変換してしまいましょう。
Sub インプットボックス2()
Dim MyDa As Variant
Dim MyDb, MyDc, MyR As Long
Dim MyMsga, MyTitlea As String
Dim MyMsgb, MyTitleb As String
Dim MyMsgc, MyTitlec As String
'文字列を入力
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 |
例題
インプットボックスで番号4の「果物名」を入力し、「値段」を入力し、「入力した番号」からその番号の果物名を取得します。
関数で使った例示をメソッドでも使ってみます。
ダイアログのデザインも関数とは異なっています。
Sub インプットボックス3()
Dim MyDa As Variant
Dim MyDb, MyDc, MyR As Long
Dim MyMsga, MyTitlea As String
Dim MyMsgb, MyTitleb As String
Dim MyMsgc, MyTitlec As String
'文字列を入力
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
とダイアログに入力して、正常に実行できました。
ダイアログで「キャンセル」ボタンを押して行ったときはどうなるかというと、
文字列の入力部分で「FALSE」、数値の入力部分で「0」が表示されました。
InputBoxメソッドを使った時に、ダイアログで「キャンセル」ボタンを押したときは、戻り値として、文字列指定で「False」、数値指定で「False」を数値化したものとして「0」が返ります。
したがって、
InputBoxメソッドの場合は「False」をどのように処理するのかを考えていきます。
今回は、文字列の入力のところで、リスト表示がFALSEではいけないので、
「””(空欄)」になるようにしておきます。If条件文で処理します。
Sub インプットボックス4()
Dim MyDa As Variant
Dim MyDb, MyDc, MyR As Long
Dim MyMsga, MyTitlea As String
Dim MyMsgb, MyTitleb As String
Dim MyMsgc, MyTitlec As String
'文字列を入力
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メソッドに利点がありますし、ダイアログのデザインもこちらの方がいいですし。
お好みでどうぞ!
という所でしょうか。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。