こんにちは、Ryoです。
ユーザーが入力できるテキストボックスを備えたダイアログボックスを手軽に表示できる「インプットボックス」を利用する機会は多いと思いますが、InputBox関数とメソッドで設定可能項目やキャンセル処理などに多少の差異がありますので、それぞれの使用例を交えて内容について書いていこうと思います。
1.InputBox関数
InputBox関数を利用すると、ユーザーフォームなどを作成しなくてもテキストボックスを有するダイアログ=インプットボックスを表示することができますが、「入力されたデータは文字列型」となります。
構文:InputBox(prompt[, title][, default][, xpos][, ypos][, helpfile, context])
この関数に指定する項目としては以下の通りです。
≪Inputbox関数の指定項目≫
| 指定項目 | 内容 |
| prompt | メッセージとして表示する文字列を指定(文字数は半角で1024文字)、vbCrLfで改行も可 |
| title(省略可) | タイトルバーに表示する文字列を指定。省略時はタイトルバーにアプリケーション名が表示される。 |
| default(省略可) | テキストボックスに既定値として表示する文字列を指定。省略時はテキストボックスが空欄となる。 |
| xpos(省略可) | 画面左端からダイアログボックス左端までの水平方向の距離をポイント(twip)単位で指定。省略時は水平方向に対し画面中央位置に配置。 |
| ypos(省略可) | 画面上端からダイアログボックス上端までの垂直方向の距離をポイント(twip)単位で指定。省略時は垂直方向に対し画面上端から約1/3の位置に配置 |
| helpfile(省略可) | ダイアログボックスにヘルプを設定する為に使用するヘルプファイルを指定。この引数を指定した場合は引数contextも指定する必要あり。 |
| context(省略可) | ヘルプトピックに指定したコンテキスト番号を表す数式を指定。この引数を指定する場合は引数helpfileも指定する必要あり。 |
InputBox関数を使用し、テキストボックスへ入力した値を対象セル範囲の中から検索する簡易的なサンプル概要/コードが以下になります。
◆サンプル概要
例として準備した表のセルA2~A8の範囲に対して処理を実行します。

サンプルコードを実行するとインプットボックスが表示され、検索対象とする都道府県名入力を促されますので、テキストボックスに入力し「OK」をクリックします。

入力された値が指定範囲(セルA2~A8)に有れば、該当セルを選択します。対象が無い場合はメッセージボックスで警告表示し終了になります。


インプットボックス上のキャンセルボタンをクリックすると、メッセージボックスでキャンセルしたことを表示して終了します。


以上がInputBox関数を利用したサンプル動作の概要になります。
◆サンプルコード
Sub Sample1()
'※※InputBox関数※※
Dim Pname As String
'インプットボックスを表示し、入力値を変数に代入
Pname = InputBox("検索する都道府県名(関東圏)を入力")
'*****************************
'<InputBox関数のキャンセル処理>
'
' InputBox関数では「キャンセル」ボタンクリックで、
' 「値0の文字列」という特殊な文字列が返されます。
' これをチェックするにはStrPtr関数があり、この関数は
' 引数に「値0の文字列が指定」された際に0を返すものです。
'*****************************
If StrPtr(Pname) = 0 Then
MsgBox "キャンセルします"
Exit Sub
End If
'エラー処理開始
On Error Resume Next
'セルA2~A8範囲に検索対象の文字列が有る場合、
'対象セルをアクティブ(選択)する
Range("A2:A8").Find(Pname).Activate
'指定セル範囲に検索対象の文字列が無い場合、
'メッセージボックスを表示する
If Err.Number <> 0 Then MsgBox "対象なし", vbCritical
End Sub
ここではインプットボックスに入力された値をセルA2~A8範囲でFindメソッドを利用して検索し、見つかった場合は該当セルをアクティブにする処理を行っています。
Findメソッドは対象が見つからない場合はNothingが返され、その状態でActivateメソッドを実行するとエラーとなりますので、エラー処理(On Error Resume Next)を行っています。
キャンセルボタンが押された際の処理については、サンプルコード内のコメントに記述している通りで「値0の文字列」という特殊な文字列が返されます。この「値0の文字列」の判定にはStrPtr関数を利用することで対処可能です。
後は検索対象が見つからない場合のエラー処理としてエラー番号の確認を行い、メッセージボックスを表示する形としています。
2.InputBoxメソッド
InputBoxメソッドもテキストボックスを有するダイアログ=インプットボックスを同様に表示することができます。それに加えて「入力されるデータは引数Typeで指定できる」という点がInputBox関数との主な違いになります。
また、「キャンセル」ボタンを押すとInputBoxメソッドでは「False」(Boolean型)が返されます。
構文:オブジェクト.InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextID, Type)
このメソッドに対する指定項目は以下の通りです。
≪InputBoxメソッドの指定項目≫
| 指定項目 | 内容 |
| Prompt | メッセージとして表示する文字列を指定。この引数には文字列、数値、日付、またはブール値を指定可。 |
| Title(省略可) | ダイアログボックスのタイトルを指定。省略時は既定値の「入力」がタイトルバーに表示。 |
| Default(省略可) | テキストボックスに表示する初期値を指定。省略時はテキストボックスが空欄。 |
| Left(省略可) | 画面の左上隅を基準としダイアログボックス左端までの水平方向の距離をポイント(twip)単位で指定。 |
| Top(省略可) | 画面の左上隅を基準としてダイアログボックス上端までの垂直方向の距離をポイント(twip)単位で指定。 |
| HelpFile(省略可) | ダイアログボックスで使うヘルプファイルの名前を指定。引数HelpFileと引数HelpContextIDが共に指定されている場合、ダイアログボックス内に[ヘルプ]ボタンを表示。 |
| HelpContextID(省略可) | 引数HelpFileで指定したヘルプファイル内のヘルプトピックのコンテキストID番号を指定。 |
| Type(省略可) | 返されるデータの型を指定。省略時、ダイアログボックスは文字列を返す。 |
≪引数「Type」への指定値≫
| 値 | 内容 |
| 0 | 数式 |
| 1 | 数値 |
| 2 | 文字列 |
| 4 | 論理値(True/False) |
| 8 | セル参照(Rangeオブジェクト) |
| 16 | #N/Aなどのエラー値 |
| 64 | 数値配列 |
このInputBoxメソッドを利用した簡易的なサンプルが以下になります。
◆サンプル概要
こちらも同様に準備した表を使用しますが、例としてセルの範囲を選択してデータクリアする処理を実行します。

サンプルコードを実行するとインプットボックスが表示され、削除範囲の選択を促されます。ここではセルA2~B8範囲を選択しています。

範囲を選択後に「OK」をクリックすることで対象範囲のデータはクリアされます。

また、「キャンセル」ボタンを押した場合は以下のメッセージボックスを表示して終了します。

以上がInputBoxメソッドのサンプル概要になります。
◆サンプルコード
Sub Sample2()
'※※InputBoxメソッド※※
' InputBox関数とほぼ同等ですが、入力データのタイプを
' 指定することができる引数Typeを扱えます。
Dim smp As Range
'「キャンセル」ボタンクリック時のエラー処理
On Error Resume Next
'セル範囲を選択するインプットボックスを表示し、
'選択された範囲への参照を変数smpに代入
Set smp = Application.InputBox _
("削除範囲を選択してください", Type:=8)
'引数「Type」の設定値
'0 : 数式、 1 : 数値、 2 : 文字列、 4 : 論理値(True/False)
'8 : セル参照(Rangeオブジェクト)、 16 : #N/Aなどのエラー値
'64 : 数値配列
'※※注記※※
'InputBoxメソッドでは「キャンセル」クリックで
'False(Boolean型)が返りますが、Type:=8のセル参照では
'取得出来ないのでエラー処理でキャンセルを検出しています
If Err.Number <> 0 Then MsgBox "Cancel!", vbCritical
'選択したセル範囲の値をクリアする
smp.ClearContents
End Sub
このサンプルではセル範囲を扱いますのでRangeオブジェクトとして変数smpをセットし、InputBoxメソッドの引数Typeに8を指定することで入力データを「セル参照」としています。
後はsmp.ClearContentsで入力されたセル範囲のデータクリア処理を実行していますが、その過程でキャンセルボタンが押された場合の処理も実行しています。
コメントにも記述しているようにInputBoxメソッドではキャンセルボタンが押された場合に「False」が返されますが、このサンプルではRangeオブジェクトとして処理している都合上取得できないので、If Err.Number <> 0 Then~のようにエラー番号を拾うという形でキャンセルボタンが押されたことを検出しメッセージボックスを表示しています。
キャンセル時の処理はBoolean型になるので、通常であれば受け取る変数をVariant型で宣言してVarType関数を利用して変数のデータ型を確認することで「キャンセル」ボタンが押されていることを確認することができます。
例:If VarType(smp) = vbBoolean Then ~
このように入力されるデータを指定したいケースではInputBoxメソッドを利用すると良いと思います。
3.まとめ
ユーザーフォームを使用すれば機能も豊富ですが、用途によってはフォームを作成するほどでもないケースがありますので、そのような際にはとても有用なインプットボックスだと思います。
私自身、ちょっとしたデータ入力を求めたい場合などには使う機会も多いのでInputBox関数=文字列データのみ/メソッド=入力Type指定可という差異やキャンセル処理の扱い方などを知っておくとVBA活用の幅が広がります。
以上、InputBox関数/メソッドを使用する内容についてでした!今回の記事が何かの参考になれば幸いです。
Ryo

