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

vbainputboxeyecatch

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

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

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

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

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

2つのインプットボックス 関数とメソッド

vbainputboxp012

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

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

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

です。

「どういう使い分けがあるの?」ということですが、最大の違いの一つとしては、

  • InputBox関数が表示されているときは「アプリケーションモーダル」つまりシート上のセル操作ができません。
  • InputBoxメソッドは表示中でも自由にセルを選択することが出来ます。

ということです。

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

解説例題の設定

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

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

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

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

例題

インプットボックスで番号4の「果物名」を入力し、「値段」を入力し、「入力した番号」からその番号の果物名を取得します。

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関数の場合は、入力できるデータのタイプが「文字列」と「数値」になります。

例題

インプットボックスで番号4の「果物名」を入力し、「値段」を入力し、「入力した番号」からその番号の果物名を取得します。

想定通りの値の入力時

InputBox関数の使用例

InputBox関数の使用例です。

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

VBA
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関数についてはこちらを参考にしてください。
vbamatcheyecatch001 VBAで使うMatch関数 活用度アップでテッパン関数に!

実行結果

文字列(果物名)の入力すると

vbainputbox001

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

vbainputbox002

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

vbainputbox003
vbainputbox004

想定外の値の入力時

InputBox関数の注意点

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

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

その結果を表示します。

文字列(果物名)の入力をキャンセルすると

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

vbainputbox005
vbainputbox006

数値1(値段)を入力をキャンセルすると

数値の入力を「キャンセル」すると、・・・ エラーが出てしまいました!

vbainputbox007
vbainputbox008
原因チェック

InputBox関数を使った時に、ダイアログで「キャンセル」ボタンを押したときは、

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

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

エラー対策

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

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

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

VBA
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の「果物名」を入力し、「値段」を入力し、「入力した番号」からその番号の果物名を取得します。

想定通りの値の入力時

InputBoxメソッドの使用例

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

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

VBA
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

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

vbainputbox011
vbainputbox009

想定外の値の入力時

InputBoxメソッドの注意点

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

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

vbainputbox010
原因チェック

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

したがって、

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

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

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

VBA
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 特徴ごとに使い分け まとめ

vbainputboxp013

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

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

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

個人的には、

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

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

お好みでどうぞ!

という所でしょうか。

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

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

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

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

エクセルVBA業務ツールで日常の業務改善を行いましょう。

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

アンケートでポイ活しよう!!

アンケートに答えれば答えるほど ”使える” ポイントがたまります。

NTTコム サーチ

af_banner01

Dstyle web

dstyleweb_logo
dstyle_320x50-min