VBA で下図のようなダイアログボックスを表示して、ユーザーさんに何かを入力してもらって、その値を使ってあれやこれやを処理するときに使うのが、Application.InputBox メソッドや InputBox 関数です(どちらも使い方はほとんど同じですが、微妙な違いがあるので、両方とも解説します)。
ダイアログボックスの一番上の青いところに表示されている文字を Title, ユーザーさんが入力するテキストボックスのすぐ上に表示されている文字を Prompt といいます。いずれも InputBox メソッドや InputBox 関数の引数で指定できます。ちなみに prompt は「駆り立てる、促す」という意味の単語です。つまりユーザーさんに「ここに何か書いてくださいな」と促すメッセージなのです。
【VBA】Application.InputBox
VBA の InputBox メソッドは最大で 8 個も引数が指定できて、色々な使い方ができるのですが、それをいっぺんに説明するのは大変だし、おそらく一生使わないような引数もあるので、ここでは普通によく使われる引数をピックアップして、簡単なマクロを作成しながら解説していきます。まずは、InputBox メソッドの基本的な使い方です。
'[VBA] Application.InputBoxメソッドのサンプルコード(1) Sub InputBox_Test_1() Dim x As Variant Dim myprompt As String Dim mytitle As String myprompt = "何か入力してください" mytitle = "セルA1に転記" x = Application.InputBox(myprompt, mytitle) Range("A1") = x End Sub
InputBox_Test_1() を実行すると、ダイアログボックスがぱっと現れて「何か入力してください」と促されるので、素直に適当な文字や数値をテキストボックスに入力すると、その内容がセル A1 に書き込まれます。
ユーザーさんが何を入力するのかわからないので、変数 x は Variant型で宣言してあります。このマクロでは引数に Prompt と Title の 2 つだけを指定しています。InputBoxメソッドの引数のうちのほとんどは省くことがきますけど、Prompt だけは省略できないので注意してください。
InputBox メソッドではテキストボックスに入力されるデータの型を Type という引数で指定することができます。これは後半で解説する InputBox 関数には備わっていない機能です。引数の値と対応するデータ型は次のようになっています。
Type | データ型 |
---|---|
0 | 数式 |
1 | 数値 |
2 | 文字列 |
4 | 論理値 |
8 | セル参照 |
16 | エラー値 |
64 | 値の配列 |
例としてデータ型を数値に限定するマクロを作ってみます。
'[VBA] Application.InputBoxメソッドのサンプルコード(2) Sub InputBox_Test_2() Dim x As Double Dim myprompt1 As String Dim myprompt2 As String Dim mytitle As String myprompt1 = "1つめの数字を入力してください" myprompt2 = "2つめの数字を入力してください" x = Application.InputBox(myprompt1, Type:=1) y = Application.InputBox(myprompt2, Type:=1) MsgBox "答えは" & x + y & "です" End Sub
InputBox_Test_2()を実行して、ダイアログボックスに数字を 2 回入力すると、2 つの数字を足し算して答えを返してくれます。
このマクロでは InputBox の引数で「Type:=1」と指定してあるので、数値以外のものを入力すると「数値が正しくありません」と返されてしまいます。
次は Type に 0 を指定して、数式を入力してもらうマクロを作成してみます。
'[VBA] Application.InputBoxメソッドのサンプルコード(3) Sub InputBox_Test_3() Dim x As Variant Dim myprompt As String myprompt = "計算式を入力してください" x = Application.InputBox(myprompt, Type:=0) Range("A1") = x End Sub
InputBox_Test_3() を実行すると「計算式を入力してください」と促されるので、「=20+30」のように入力すると、答えがセル A1 に表示されます。ただし x を Msgbox関数で表示させようとすると、そのまま「=20+30」が表示されてしまいます。x に入っているのは、あくまで文字列です。しかし、ワークシートのセルは先頭に「=」をつく文字列を数式だと判断して、自動的に計算処理します。つまり上のマクロは、人間がワークシートに数式を入力するのと同じような作業をしているのです。
次はセル参照を引数とする Type = 8 です。ダイアログボックスで範囲を指定して背景色を緑色にするマクロを作成してみます。
'[VBA] Application.InputBoxメソッドのサンプルコード(4) Sub InputBox_Test_4() Dim myarea As Range Dim myprompt As String myprompt = "色をつける範囲をドラッグしてください" Set myarea = Application.InputBox(myprompt, Type:=8) myarea.Interior.ColorIndex = 10 End Sub
InputBox_Test_4() を実行すると「色をつける範囲をドラッグしてください」と促されるので、適当なセル範囲をマウスで選択すると、その部分が緑色になります。
【VBA】InputBox関数
VBA の InputBox 関数は Application.InputBox に良く似たはたらきをします。どちらもダイアログボックスを表示させてユーザーさんから色々なデータを受け取ってマクロで処理します。Prompt のみが省略不可能な引数であることも同じです。
ただし、もちろん細かな違いはいくつかあって、一番大きな違いは InputBox 関数を普通に使っていては、受け取るデータ型を制限することができないということです。つまり、InputBox 関数には Type という引数がありません。Type が指定できないということは、Application .InputBox では可能だったセル範囲の受け取りなどはできないということです。
サンプルコードでInputBox関数の動作を確認してみましょう。ユーザーさんに住所を登録してもらうマクロです。
'[VBA] InputBox関数のサンプルコード Sub Adress_Data() Dim myadress As String Dim myprompt As String Dim mytitle As String myprompt = "住所を入力してください" mytitle = "住所の登録" myadress = InputBox(myprompt, mytitle, Default:="東京都") Range("B2").Value = myadress End Sub
Adress_Data() を実行すると次のようなダイアログボックスが現れます。
すでに「東京都」という文字が入力されていますが、これは引数の Default で指定しているからです。テキストボックスに住所を入力して [OK] ボタンを押すと、その内容がセルB2 に書き込まれます。
コメント
【AI解説】VBAのApplication.InputBox
[ChatGPT] VBAのApplication.InputBoxは、ユーザーから入力を受け取るための機能です。この機能を使うと、ユーザーに対してメッセージを表示し、テキストや数値、範囲などのデータを入力してもらうことができます。以下に、Application.InputBoxの基本的な使い方といくつかのオプションを説明します。
基本的な使い方:
このコードでは、ユーザーに対して「メッセージを入力してください」というメッセージと、「タイトル」というタイトルが表示されます。ユーザーが入力した値は、変数userInputに代入されます。Type:=1は、ユーザーがテキストを入力することを示しています。
オプションの指定:
この場合、Default:=”デフォルト値”というオプションを指定しています。これにより、入力ボックスに初期値として「デフォルト値」という値が表示されます。
入力タイプの指定:
入力ボックスのタイプを指定するには、Type:=の値を変更します。
Type:=1:テキストの入力
Type:=2:数値の入力
Type:=8:数式の入力
Type:=4:ブール値の入力
Type:=16:範囲の選択
これらのオプションは、ユーザーが入力するデータの種類に応じて適切なものを選択します。
入力の確認:
ユーザーの入力を確認するためには、Type:=2として数値の入力を指定し、次のようにコードを記述します。
このコードでは、IsNumeric関数を使ってユーザーの入力が数値であるかを確認しています。もし数値でない場合、警告メッセージが表示され、プロシージャが終了します。