毎回違う条件!ユーザーの入力を受け取る「InputBox」

Level5 VBA・マクロ

毎回同じように機能してくれるマクロは便利です。
しかしその反面、ユーザーが指定した条件でマクロを作動させたいことがありますよね。

「この支店のデータだけを処理したい」
「何月分のレポートを作成しますか?」
と、ユーザーが指定しないといけないことがたくさんあります。

今回は、マクロを一時停止させて「ユーザーに質問」
その答えをマクロの処理に活かす対話型インターフェースの作り方を学びます。
この機能を担うのがInputBox(インプットボックス)です。


InputBoxは「ユーザーからの質問箱」

InputBox は、ユーザーに情報を入力させるための小さなダイアログボックス(質問箱)を表示します。ユーザーが入力した内容は、変数に格納してマクロ内の様々な処理に利用できます。

例えば、オートフィルタの条件や転記先のファイル名など、その時々で求められるものが異なるものを入力できます。

たんたん
たんたん

毎回同じ動きをするマクロなら必要ないよ!

例えば、毎回違う月のデータ抽出をしたい時
や毎回参照するファイルが違う時とか!

ユーザーがその時々に求める情報をマクロに教える
仕組みが「インプットボックス」だよ!

InputBoxの基本構造

変数 = InputBox(プロンプト, タイトル, デフォルト値)
引数名役割設定値(例)解説
プロンプト質問文“支店名を入力してください”ダイアログボックスに表示される質問の文章です。
タイトルウィンドウ名“レポート生成ツール”ダイアログボックスの上部に表示されるタイトルです。
デフォルト値初期値“東京”ユーザーが何も入力しなかった場合の初期値です。
たんたん
たんたん

インプットボックスは必ず変数に入れるよ!

ユーザーの希望する情報をマクロで利用するためだからね。

変数に入れておけば、後で自由にマクロで使えるよ。


InputBoxを使った実戦的な活用例

InputBoxで受け取った値は、変数に格納し、
その後の If文や AutoFilterの条件として利用するのが基本です。

たんたん
たんたん

VBAの条件分岐やフィルタについては確認しておいてね。

【実例:入力された支店名でフィルタをかける】

ユーザーに支店名を入力させ、その支店名でデータリストを絞り込みます。

Sub 支店別フィルタツール()
    Dim targetBranch As String ' 入力された支店名を格納する変数
    
    ' 1. ユーザーに質問し、答えを変数に格納する
    targetBranch = InputBox("レポート対象の支店名を入力してください。", "支店フィルタツール", "東京")
    
    ' 2. 入力がキャンセルされたか、何も入力されなかったか判断する
    If targetBranch = "" Then
        MsgBox "処理がキャンセルされました。"
        Exit Sub ' マクロを終了する
    End If
    
    ' 3. 入力された値を使ってフィルタをかける
    ' B列(2列目)に、入力された支店名でフィルタを適用
    ' Range("A1")のAutoFilterメソッドのField:=2に、targetBranchを指定する
    Range("A1").AutoFilter Field:=2, Criteria1:=targetBranch
    
    MsgBox targetBranch & "支店のデータ抽出が完了しました。"
End Sub
たんたん
たんたん

インプットボックスで「キャンセル」をしたらどうなるのか。

正解は「変数に空白を代入」してマクロが続行されるよ!

なのでキャンセルを押す可能性を考えて
空白ならマクロ終了(Exit Sub)を用意しておこう!


InputBoxの応用:数値の入力とエラー処理

InputBox は基本的に「文字列」を返すため、数値の入力を促す場合は、ユーザーが誤って文字を入力しても処理を続行できるよう、エラー処理を加える必要があります。

【実例: InputBoxで受け取った値を使って計算する】

ユーザーに入力された数値が正しいかをチェックする方法です。

Sub 金額計算()
    Dim amountText As String
    Dim amountNum As Long
    
    ' 1. 文字列として金額を受け取る
    amountText = InputBox("処理したい金額を入力してください。", "金額入力")
    
    ' 2. 入力が数値かどうかを If文でチェックする
    ' VBAの関数 IsNumeric() は「値が数値かどうか」を True/Falseで教えてくれる
    If IsNumeric(amountText) = False Then
        MsgBox "入力された値は数値ではありません。処理を中止します。"
        Exit Sub
    End If
    
    ' 3. 数値と判断されたら、Long型変数に変換して計算に利用する
    amountNum = CLng(amountText) ' 文字列をLong型の数値に変換する
    
    ' 4. 処理を実行
    MsgBox "入力金額の10%は " & amountNum * 0.1 & " 円です。"
End Sub
たんたん
たんたん

はじめに伝えておくと、暗記はしなくていいよ!
こんなエラー回避方法があるんだって学習してね。

IsNumeric():値が数値かを確認する関数
Clng():文字列のデータ型を数値のLongに変換

こんなのを利用して
もしユーザーが文字列を入力してしまったときに対応しているんだ。

実際、マクロ作成の時には、
できる限り起こりうるミスを想定して対応できるような仕組みを用意すると便利だよ。


今回のクエストを終えて

  • InputBox はユーザーから情報を変数として受け取るための機能。
  • 基本構造は 変数 = InputBox(質問文, タイトル, デフォルト値)
  • ユーザーがキャンセルした場合は、変数が "" (空文字) になるため、必ず If 変数 = "" Then Exit Sub で処理を終わらせるマナーを守る。
  • 数値を期待する場合、IsNumeric() でチェックし、CLng() で数値に変換してから計算に利用する。

これでマクロはユーザーとの対話が可能となり、より柔軟で実用的なツールへと進化します。

次回は「ユーザー設定のダイアログボックス(MsgBox)」です。
マクロからユーザーへ「警告」や「処理完了」を伝える方法を学びましょう!

コメント

タイトルとURLをコピーしました