はじめに
本記事の内容は、ユーザーが分析条件を簡単に入力できる「ユーザーフォーム」を使った対話型の分析ツールです。VBAコードを直接編集しなくても、フォームに数値を入力してボタンを押すだけで分析が実行される。そんな、誰にでも使いやすいツールの作成を目指します。
1. ユーザーフォームとは?
ユーザーフォームは、VBAで作成できるオリジナルのダイアログボックスです。テキストボックス、ボタン、ドロップダウンリストなどの部品(コントロール)を自由に配置して、ユーザーからの入力を受け取ったり、情報を表示したりできます。
ユーザーフォームのメリット:
- 操作が直感的: プログラミングを知らない人でも、フォームの指示に従うだけでツールを使える。
- 入力ミスを防ぐ: 入力形式を制限したり、選択肢をリストで提示したりできる。
- 対話的な処理: ユーザーの入力に応じて、実行する処理を動的に変えることができる。
2. ユーザーフォームの作成手順
- VBE(Visual Basic Editor)を開きます。
- 「挿入」メニューから「ユーザーフォーム」を選択します。
- プロジェクトエクスプローラーに「フォーム」フォルダと「UserForm1」が追加され、フォームのデザイン画面が表示されます。
- 同時に「ツールボックス」が表示されます。ここから必要なコントロールをフォーム上にドラッグ&ドロップで配置します。

3. プロジェクト:閾値(しきいち)入力フォームの作成
今回は、「指定した強度以上の材料データを抽出する」という処理を、ユーザーフォームから実行できるようにしてみましょう。
Step 1: フォームのデザイン
UserForm1を挿入します。- ツールボックスから以下の3つのコントロールを配置します。
- ラベル (
Label): 説明文を表示します。「抽出する強度の閾値を入力:」などと入力します。 - テキストボックス (
TextBox): ユーザーが数値を入力する場所です。 - コマンドボタン (
CommandButton): 処理を実行するきっかけとなるボタンです。「実行」などと表示させます。
- ラベル (
配置後、各コントロールを選択し、プロパティウィンドウで(Name)とCaption(またはText)を分かりやすいものに変更しておきましょう。
- ラベル:
(オブジェクト名)=lblThreshold,Caption=抽出する強度の閾値を入力: - テキストボックス:
(=txtThreshold ※初期はTextBoxオブジェクト名) - コマンドボタン:
(=btnExecute,オブジェクト名)Caption=実行 ※初期はCommandButton

Step 2: ボタンのクリックイベントを作成
フォーム上の「実行」ボタンをダブルクリックしてください。すると、UserForm1のコードウィンドウが開き、以下のようなコードが自動で生成されます。
Private Sub btnExecute_Click() End Sub
このbtnExecute_ClickというSubプロシージャの中に、ボタンがクリックされたときに実行したい処理を記述していきます。
Step 3: フォームと標準モジュールを連携させる
実際のデータ抽出処理は、「標準モジュール」に記述するのがセオリーです。フォームの役割は、あくまでユーザーからの入力を受け取り、その情報を標準モジュールのプロシージャに渡す「橋渡し役」に徹します。
標準モジュール (Module1) のコード:
' 引数で閾値を受け取るように改良
Sub ExtractHighStrengthMaterials(threshold As Double)
Dim lastRow As Long
Dim i As Long
Dim outputRow As Long
' 前回の結果をクリア
Range("C:C").ClearContents
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
outputRow = 1
For i = 1 To lastRow
' 引数で受け取った閾値で判定
If Cells(i, "A").Value >= threshold Then
Cells(outputRow, "C").Value = Cells(i, "A").Value
Cells(i, "A").Interior.Color = vbYellow
outputRow = outputRow + 1
End If
Next i
MsgBox "抽出が完了しました。"
End Sub
ユーザーフォーム (UserForm1) のコード:
Private Sub btnExecute_Click()
Dim thresholdValue As Double
' テキストボックスの値が数値かチェック (簡易的)
If IsNumeric(txtThreshold.Text) Then
' テキストボックスの値をDouble型に変換して変数に格納
thresholdValue = CDbl(txtThreshold.Text)
' 標準モジュールのプロシージャを呼び出し、閾値を渡す
Call ExtractHighStrengthMaterials(thresholdValue)
' フォームを閉じる
Unload Me
Else
MsgBox "数値を入力してください。", vbExclamation
End If
End Sub
IsNumeric(): 値が数値として認識できるか判定する関数。CDbl(): 文字列をDouble型の数値に変換する関数。Call ExtractHighStrengthMaterials(thresholdValue): 標準モジュールのSubを呼び出し、フォームで受け取ったthresholdValueを引数として渡しています。Unload Me: 処理が終わった後、フォーム自身を閉じる命令です。
Step 4: フォームを表示するマクロを作成
最後に、このフォームを開くためのSubを標準モジュールに作成します。
標準モジュール (Module1) に追記:
Sub ShowExtractionForm()
UserForm1.Show
End Sub
これで完成です! ShowExtractionFormを実行するとフォームが表示され、閾値を入力してボタンを押すと、その値に基づいてデータが抽出されます。

まとめ
今回は、プロジェクト形式でユーザーフォームを使った対話的なツールを作成しました。
- ユーザーフォームを使えば、VBAを知らない人でも使える分かりやすいUIを提供できる。
- フォームの役割は「入力の受け付け」と「処理の呼び出し」に徹させる。
- 実際の処理は「標準モジュール」に記述し、引数で情報を受け渡すのが良い設計。
ユーザーフォームを使いこなせば、あなたのVBAツールは格段に実用性が増します。データ取得から分析、レポート整形までを一気通貫で行う、より実践的なプロジェクトに挑戦します。
コメント