Excel VBAのインプットボックスの使い方をお探しですね。
広告
Excel VBAのInputBoxで入力値を変数に代入する方法
Excel VBAでマクロを作っていると、「処理の途中でユーザーに名前を入力してもらいたい」「集計対象の数値をその場で指定してもらいたい」といった場面がよくあります。
そんなときに便利なのが**InputBox**です。
InputBoxを使えば、簡単な入力用ダイアログを表示して、入力された文字や数値を変数に入れて、その後の処理に使うことができます。
この記事では、Excel VBAのInputBoxでユーザーに文字や数値を入力してもらい、変数に代入する基本から、数値チェック、キャンセル時の扱い、InputBox関数とApplication.InputBoxメソッドの違いまで、初心者にも分かりやすく解説します。
InputBoxで入力値を変数に代入する基本
Excel VBAでユーザーから値を受け取る一番手軽な方法が、**InputBox関数**です。
InputBox関数を使うと、メッセージ付きの小さな入力画面を表示して、ユーザーが入力した内容を文字列として取得できます。
取得した値は、String型などの変数に代入して、セルへ書き込んだり、条件分岐に使ったりできます。
本格的な入力画面を作る場合はUserFormを使うこともありますが、名前や金額、シート名などを一時的に入力してもらう程度なら、InputBoxで十分です。
基本の形はとてもシンプルです。
次のコードでは、ユーザーに名前を入力してもらって、その内容を変数userNameに代入したうえで、セルA1に書き込んでいます。
“`vb
Sub InputBoxで文字を入力する()
Dim userName As String
userName = InputBox(“名前を入力してください。
“)
Range(“A1”).Value = userName
End Sub
“`
この例で重要なのは、**InputBoxの戻り値を変数に代入している**点です。
`InputBox(“名前を入力してください。
“)` の部分で入力画面が表示されて、OKボタンが押されると、入力された文字列が返ってきます。
その文字列を `userName` という変数に入れているので、その後の処理で何度でも使えるようになります。
InputBox関数の戻り値は基本的に文字列なので、文字を受け取る場合はString型の変数を用意すると分かりやすいですね。
InputBoxには、表示メッセージ以外にもタイトルや初期値を指定できます。
たとえば、現在のシート名を初期値として表示して、ユーザーが変更した名前を変数に代入することもできます。
“`vb
Sub シート名を入力して変更する()
Dim newName As String
newName = InputBox( _
Prompt:=”新しいシート名を入力してください。
“, _
Title:=”シート名の変更”, _
Default:=ActiveSheet.Name)
If newName <> “” Then
ActiveSheet.Name = newName
End If
End Sub
“`
`Prompt`はダイアログに表示する説明文、`Title`はタイトルバーの文字列、`Default`は入力欄に最初から表示しておく値です。
名前付き引数を使うと、何を指定しているのかが分かりやすくなります。
特に仕事で使うマクロでは、後から自分や別の人がコードを読むこともあるので、単に `InputBox(“入力してください”)` と書くより、目的が伝わるメッセージにしておくと親切です。
ちなみに、シート名には使えない文字や文字数制限があるので、実際に使うときはエラー処理も入れておくと安心です。
数値を入力させて変数に代入する方法
InputBox関数は、入力された値を**文字列**として返します。
なので、ユーザーが「100」と入力しても、VBA上ではまず文字列の `”100″` として扱われます。
計算に使いたい場合は、数値かどうかを確認したうえで、`CLng`、`CDbl`、`CInt` などの型変換関数で数値型に変換するのが基本です。
この一手間を省くと、文字が入力されたときにエラーになったり、意図しない計算結果になったりすることがあります。
数値入力を受け付ける基本例は次のとおりです。
ここでは、入力された値をいったんString型の変数ansに入れて、`IsNumeric`関数で数値として解釈できるかを判定しています。
数値ならDouble型の変数amountに変換して代入し、セルA1へ出力します。
“`vb
Sub InputBoxで数値を入力する()
Dim ans As String
Dim amount As Double
ans = InputBox(“金額を入力してください。
“)
If IsNumeric(ans) Then
amount = CDbl(ans)
Range(“A1”).Value = amount
Else
MsgBox “数値を入力してください。
“, vbExclamation
End If
End Sub
“`
`IsNumeric`は、指定した値が数値として扱えるかを判定する関数です。
ただし、全角数字やカンマ区切りの数値などでもTrueになる場合があるので、判定後に必ず数値型へ変換してから使うと安心です。
金額や割合のように小数を含む可能性があるならDouble型、個数や行番号のように整数だけを扱うならLong型を使うなど、用途に合わせて変数の型を選びましょう。
VBAでは型を意識することで、コードの読みやすさと不具合の少なさが大きく変わります。
ユーザーが正しい数値を入力するまで、InputBoxを繰り返し表示したい場合は、Do Loop文を使います。
次の例では、空欄や文字列が入力された場合に再入力を促して、数値が入力されたときだけループを抜けます。
“`vb
Sub 数値が入力されるまで繰り返す()
Dim ans As String
Dim quantity As Long
Do
ans = InputBox(“数量を入力してください。
“)
If ans = “” Then
MsgBox “入力が空です。
数値を入力してください。
“, vbExclamation
ElseIf Not IsNumeric(ans) Then
MsgBox “数値として認識できません。
“, vbExclamation
Else
quantity = CLng(ans)
Exit Do
End If
Loop
MsgBox “入力された数量は ” & quantity & ” です。
”
End Sub
“`
このように、InputBoxで数値を扱う場合は「入力させる」「判定する」「型変換する」という流れで考えると整理しやすくなります。
入力画面そのものは簡単に表示できますが、実際に使うときはユーザーが想定外の値を入力することもあります。
なので、最初から数値だけが入力される前提でコードを書くのではなく、誤入力や未入力を受け止める処理を入れておくことが大切です。
キャンセル・空欄・初期値を正しく扱う
InputBoxを使うときに見落としやすいのが、**キャンセルされた場合の処理**です。
ユーザーがキャンセルボタンを押したり、右上の閉じるボタンでダイアログを閉じたりした場合、InputBox関数では空文字列として扱われます。
また、何も入力せずにOKボタンを押した場合も、見た目上は同じく空文字列になります。
単純に `If ans = “” Then` と判定すると、キャンセルと空欄OKをまとめて「入力なし」と扱うことになります。
多くのマクロでは、キャンセルと空欄を厳密に区別しなくても問題ありません。
たとえば、名前が空なら処理を中止する、数値が空なら再入力を促す、といった仕様なら、`Len(ans) = 0` や `ans = “”` で十分です。
ただし、「空欄のまま登録することは許可するけど、キャンセルなら処理を中止する」というような要件では、両者を区別する必要があります。
その場合は、InputBox関数の戻り値に対して `StrPtr` 関数を使う方法があります。
“`vb
Sub キャンセルと空欄を区別する()
Dim ans As String
ans = InputBox(“コメントを入力してください。
空欄でも登録できます。
“)
If StrPtr(ans) = 0 Then
MsgBox “キャンセルされました。
処理を中止します。
”
ElseIf ans = “” Then
MsgBox “空欄のコメントとして登録します。
”
Else
MsgBox “入力内容:” & ans
End If
End Sub
“`
このコードでは、先に `StrPtr(ans) = 0` を判定している点がポイントです。
キャンセル時に返される値と、空欄でOKしたときの値は、通常の比較ではどちらも空文字列のように見えます。
でも、`StrPtr`を使うと、キャンセルされたときの特殊な空文字列を判別できます。
厳密な判定が必要なケースは多くありませんが、入力フォームの代わりにInputBoxを使って業務データを登録する場合は、仕様に応じて検討しておくと安全です。
初期値を設定する場合も、キャンセル時の扱いに注意が必要です。
`Default`に値を指定すると、入力欄には最初からその値が表示されます。
ユーザーが何も変更せずにOKを押した場合は、その初期値がそのまま変数へ代入されます。
一方で、キャンセルを押した場合は初期値ではなく空文字列扱いになるので、「初期値があるから必ず値が返る」とは思わないようにしましょう。
“`vb
Sub 初期値付きInputBox()
Dim rateText As String
Dim rate As Double
rateText = InputBox( _
Prompt:=”割引率を入力してください。
“, _
Title:=”割引率の入力”, _
Default:=”10″)
If rateText = “” Then
MsgBox “入力がキャンセルされたか、空欄です。
”
Exit Sub
End If
If IsNumeric(rateText) Then
rate = CDbl(rateText)
MsgBox “割引率は ” & rate & “% です。
”
Else
MsgBox “数値を入力してください。
“, vbExclamation
End If
End Sub
“`
InputBoxは簡単に使える反面、ユーザー操作によって戻り値が変わります。
文字を入力した場合、何も入力しなかった場合、キャンセルした場合、初期値のままOKした場合を分けて考えると、実際に使いやすいマクロになります。
特に、変数へ代入した後にシート名変更、ファイル名作成、金額計算などを行う場合は、未入力のまま処理が進まないようにチェックを入れることが大切です。
InputBox関数とApplication.InputBoxメソッドの使い分け
Excel VBAには、似た名前のInputBoxが**2種類**あります。
ひとつはここまで紹介してきた `InputBox` 関数で、もうひとつは `Application.InputBox` メソッドです。
どちらも入力用ダイアログを表示しますが、機能には違いがあります。
特に数値やセル範囲を入力させたい場合は、Application.InputBoxメソッドを使うと便利です。
InputBox関数は、入力結果を基本的に文字列として返します。
なので、数値として使いたい場合は `IsNumeric` で判定して、`CDbl` や `CLng` で変換する必要があります。
一方、Application.InputBoxメソッドには `Type` 引数があって、受け付けるデータの種類を指定できます。
たとえば `Type:=1` を指定すると数値、`Type:=2` を指定すると文字列、`Type:=8` を指定するとセル範囲を受け取れます。
“`vb
Sub ApplicationInputBoxで数値を入力する()
Dim v As Variant
Dim amount As Double
v = Application.InputBox( _
Prompt:=”金額を入力してください。
“, _
Title:=”金額入力”, _
Type:=1)
If v = False Then
MsgBox “キャンセルされました。
”
Exit Sub
End If
amount = CDbl(v)
Range(“A1”).Value = amount
End Sub
“`
この例では、変数vをVariant型にしています。
Application.InputBoxメソッドは、キャンセルされたときにFalseを返すので、最初からDouble型の変数で受け取ると扱いにくくなることがあります。
いったんVariant型で受け取って、キャンセルかどうかを確認してから数値型へ代入すると、エラーを避けやすくなります。
特に `Type:=1` を使うと、数値以外が入力されたときにExcel側が入力を受け付けないので、InputBox関数で自前チェックを書くより簡潔になる場面があります。
セル範囲をユーザーに選択させたい場合は、`Type:=8` が便利です。
この場合、戻り値はセルの値ではなくRangeオブジェクトになります。
Rangeオブジェクトを変数に代入するときは、通常の代入ではなく `Set` を使う点に注意してください。
“`vb
Sub セル範囲を選択させる()
Dim targetRange As Range
On Error Resume Next
Set targetRange = Application.InputBox( _
Prompt:=”対象セルを選択してください。
“, _
Title:=”セル範囲の選択”, _
Type:=8)
On Error GoTo 0
If targetRange Is Nothing Then
MsgBox “選択がキャンセルされました。
”
Exit Sub
End If
MsgBox “選択された範囲は ” & targetRange.Address(False, False) & ” です。
”
End Sub
“`
InputBox関数とApplication.InputBoxメソッドは、目的に応じて使い分けるのが基本です。
文字列を手軽に入力させたいだけならInputBox関数で十分です。
数値だけを入力させたい、セル範囲を選択させたい、入力できる型をある程度制限したい場合はApplication.InputBoxメソッドが向いています。
どちらを使う場合でも、最終的には「戻り値をどの型の変数で受け取るか」「キャンセル時にどうするか」「入力後に型変換や検証が必要か」をセットで考えることが、安定したVBAコードを書くポイントです。
まとめ
Excel VBAのInputBoxは、使い方自体は簡単ですが、変数への代入、数値変換、キャンセル判定まで含めて理解すると、実際に使うときの安心感が全然違います。
まずは文字列をString型の変数に代入する基本から始めて、数値入力ではIsNumericやApplication.InputBoxのType指定を使い分けるとよいでしょう。
さらに、空欄やキャンセル時の処理を丁寧に書いておけば、ユーザーが想定外の操作をしても止まりにくいマクロになります。
ぜひこの記事を参考に、InputBoxを使った便利なマクロ作りにチャレンジしてみてください。
広告
