動作確認: Excel 365 v2509 · Excel 2021 · Excel 2019 · 最終確認 2026-06-06
要点(TL;DR) — Excel には InputBox という名前の関数が2つあります。単純なほうは文字列を返し、Excel のほうは数値・日付を要求でき、さらにユーザーにマウスで範囲を選ばせることもできます。
' 1. VBA の InputBox — 常に文字列(String)を返す
Dim userName As String
userName = InputBox("お名前は?", "セットアップ")
' 2. Application.InputBox — Type:=1 で数値を強制、Type:=8 で範囲を取得
Dim qty As Variant
qty = Application.InputBox("いくつ?", "数量", Type:=1)
Dim rng As Range
On Error Resume Next
Set rng = Application.InputBox("データを選択:", "範囲", Type:=8)
On Error GoTo 0
間違ったほうを選ぶこと——これが、本当は要らない検証ループを手書きで抱えた InputBox マクロが量産される原因です。選び方を見ていきましょう。
考え方:同じ名前、別の道具
エディタで InputBox と打つと、VBA は2回候補を出します。これはバグではなく、本当に2つあるのです。
InputBox(...)— VBA 言語の関数。とても単純で、どの Office アプリでも動き、常に文字列を返します。ユーザーが何を打ち込んでも、返ってくるのはテキストです。Application.InputBox(...)— Excel 専用のメソッドで、切り札の**Type引数*を持ちます。数値・日付・真偽値・セル範囲を要求でき、その型付きの値*を返します——あとで変換が必要な文字列ではありません。
MsgBox が一方的に放送するだけのインターホンだとすれば、InputBox は、丸ごとUserFormを作らずに、手早いマクロが入力された1つの値を受け取れる唯一の場所です。自由テキストなら単純なほう、答えが数値・日付・範囲になるなら Application.InputBox を選びます。
欲しい答えで選ぶ
' 自由テキスト → 単純な InputBox が一番短い
Dim memo As String
memo = InputBox("コメントを追加:")
' 計算に使う数値 → Application.InputBox Type:=1
Dim rate As Variant
rate = Application.InputBox("金利 %:", Type:=1)
' ユーザーがマウスで指す範囲 → Type:=8(切り札)
Dim target As Range
On Error Resume Next
Set target = Application.InputBox("合計するセルを選択:", Type:=8)
On Error GoTo 0
この Type:=8 の範囲選択は、ほかの軽量ダイアログには真似できない唯一の機能です——ユーザーがシート上をドラッグすると、本物の Range オブジェクトが返ってきます。範囲を1つ取りたいだけで RefEdit コントロール付きの UserForm を作るのは、これがある以上やりすぎです。
覚えておきたい Type の値
Type |
受け取るもの | 返るもの |
|---|---|---|
1 |
数値 | 数値(Double) |
2 |
テキスト | 文字列(String) |
4 |
真偽値 | True / False |
8 |
セル参照 | Range(Set で受ける) |
0 |
数式 | 数式の文字列 |
「どちらでも」なら足し算できます——Type:=1 + 2 は数値またはテキストを受け付けます。Type の要点は、Excel が入力を代わりに検証してくれること。Type:=1 の欄に文字を打てば、あなたのコードが動く前に Excel が弾きます。あなたが書こうとしていた検証ループは——もう組み込み済みなのです。
両方を壊す落とし穴:キャンセルの判定
InputBox のバグの大半はここに潜み、しかもバージョンごとに違います。
単純な InputBox は、ユーザーがキャンセルを押すと空文字列 "" を返します——しかも、空欄のまま OK を押したときも同じです。この2つは区別できません。
Dim s As String
s = InputBox("コードを入力:")
If s = "" Then Exit Sub ' キャンセルと「空のOK」を同じ扱い — たいていは問題ない
Application.InputBox はキャンセル時に真偽値の False を返します。落とし穴は、型付き変数に代入する前に捕まえる必要があること。まず Variant に受けます。
Dim v As Variant
v = Application.InputBox("何行?", Type:=1)
If VarType(v) = vbBoolean Then Exit Sub ' ユーザーがキャンセルした
' ここからは数値として安全に使える
Range("B1").Value = v
⚠️ ここで If v = False Then Exit Sub と書いてはいけません。 ユーザーが正しく 0 を入力すると v = False も真になり(VBA は 0 を False として扱う)、有効な入力なのにマクロが終了します。VarType(v) = vbBoolean を調べるのが唯一の確実な方法です——本物の数値は vbBoolean ではなく必ず vbDouble で返ります。Type:=8 の範囲なら、要点ブロックの Is Nothing パターンを使ってください。
検証ループを手書きするのはやめる
Application.InputBox がすでに型を強制してくれるので、おなじみの*「正しい数値が入るまで聞き続ける」*ループは、たいてい無駄なコードです。
' ❌ 単純な InputBox で書きがちなループ
Dim s As String
Do
s = InputBox("数値を入力:")
Loop Until IsNumeric(s) And s <> ""
' ✅ Excel に強制させる
Dim n As Variant
n = Application.InputBox("数値を入力:", Type:=1)
If VarType(n) = vbBoolean Then Exit Sub
合言葉: 値の種類を検証していると気づいたら、InputBox の選択を間違えています——正しい Type を付けた Application.InputBox に切り替えましょう。値の意味の検証(範囲内か? 既にあるか?)は、引き続きあなたの仕事です。
InputBox が適さなくなるとき
1つ、せいぜい2つの値なら InputBox の連続でも問題ありません。それを超えると崩れます——5つを順に聞けば、2問目で打ち間違えたユーザーには戻る手段も、全体を見渡す手段も、「全部キャンセル」する手段もありません。それが UserForm へ進む合図です。フォームなら全項目が一度に見え、OK を押すまで編集できます。必要より早く手を出さないこと——検証のない3つの単純なテキスト欄なら、3つの InputBox で十分快適です。
よくある InputBox の間違い(と直し方)
| 症状 | 原因 | 直し方 |
|---|---|---|
有効な 0 でマクロが終了 |
Type:=1 の後に If v = False(0 = False) |
代わりに VarType(v) = vbBoolean を調べる |
| 範囲選択で「型が一致しません」 | Dim r As Range がキャンセル(False)を受ける |
On Error Resume Next + If r Is Nothing |
| 数値が文字列で返る | 単純な InputBox を使った(常に String) |
Type:=1 を付けた Application.InputBox |
| 範囲セレクタが出ない | Application.InputBox(...) ではなく InputBox(...) |
Type:=8 は Application. 版だけ |
| キャンセルと空入力が区別できない | 単純な InputBox は両方とも "" を返す |
Application.InputBox に切り替える(キャンセルで False) |
| 既定値が表示されない | 引数の位置が違う | InputBox(prompt, title, default) — 既定値は3番目 |
1回の入力は簡単 — そのあとのロジックが難しい
InputBox で数値や範囲を取るのは簡単な部分です。仕事はそのあと——「選んだ範囲について、列ごとに合計し、空白は飛ばし、平均を超えるものに印を付ける」。ExcelMaster Agent なら、その一連の処理を自然な日本語で説明するだけでマクロを書いてくれます——入力のやり取りも、範囲の扱いも、全部まとめて。無料で試す →
関連ガイド
- VBA MsgBox — はい/いいえ・ボタン・カッコのルール
- VBA UserForm — 本格的な入力フォームを作る
- VBA Range — セルの参照・読み取り・書き込み
- VBA For ループ — 実務で使える8例
よくある質問(FAQ)
VBA の InputBox とは何ですか?
InputBox は、ユーザーに値の入力を促し、それをマクロに返すダイアログです。VBA には実は2つあります:単純な InputBox 関数(常に文字列を返す)と、Application.InputBox(Excel 専用で、数値・日付・範囲を返せる Type 引数を持つ)です。
InputBox と Application.InputBox の違いは?
InputBox は常にテキストを返し、どの Office アプリでも動く、最も短い選択肢です。Application.InputBox は Excel 専用で Type 引数を加え、数値(Type:=1)やマウスで選んだ範囲(Type:=8)などを強制して返せます。キャンセル時は False を返します。
VBA の InputBox で数値を受け取るには?
Application.InputBox("メッセージ", Type:=1) を使い、結果を Variant に保存します。Excel が数値以外の入力を自動で弾きます。数値を使う前に If VarType(v) = vbBoolean Then Exit Sub でキャンセルを確認してください。
VBA の InputBox でキャンセルを判定するには?
単純な InputBox はキャンセル時に空文字列 "" を返します(空の OK と区別不可)。Application.InputBox は False を返すので、Variant に受けて VarType(v) = vbBoolean を調べます。範囲(Type:=8)なら、呼び出しを On Error Resume Next で囲み、If rng Is Nothing を調べます。
InputBox でユーザーに範囲を選ばせるには?
Application.InputBox("セルを選択:", Type:=8) を使い、Set で受け取ります。キャンセルが型エラーを起こさないよう呼び出しを On Error Resume Next … On Error GoTo 0 で囲み、If rng Is Nothing Then Exit Sub を調べます。
