はじめに
ユーザーフォームでアンケートを作成する際、「問1. 年代を選択」「問2. 性別を選択」のように、複数の設問に対してそれぞれ択一式の回答を求める場面があります。
しかし、オプションボタンをそのままフォームに配置すると、全てのボタンが一つの大きなグループと見なされ、ブック全体で一つしか選択できなくなってしまいます。この問題を解決するのが「フレーム」コントロールです。
この記事では、フレームを使ってオプションボタンをグループ化し、複数の設問それぞれで選択された項目をVBAで判定する方法を解説します。
フレームでグループ化したオプションボタンの値を判定するVBAサンプルコード
このマクロは、2つのフレーム(QuestionFrame1
, QuestionFrame2
)にそれぞれ配置されたオプションボタンの中から、選択された項目の情報を取得します。
ユーザーフォームのコード
' 「回答を送信」ボタン(SubmitButton)がクリックされたときの処理
Private Sub SubmitButton_Click()
'== 変数を定義します ==
Dim answer1 As String, answer2 As String
Dim optButton As MSForms.OptionButton ' ループ用の変数
' デフォルト値を「未回答」に設定
answer1 = "未回答"
answer2 = "未回答"
'== 設問1(QuestionFrame1)の選択肢をチェック ==
For Each optButton In Me.QuestionFrame1.Controls
If optButton.Value = True Then
answer1 = optButton.Caption
Exit For
End If
Next optButton
'== 設問2(QuestionFrame2)の選択肢をチェック ==
For Each optButton In Me.QuestionFrame2.Controls
If optButton.Value = True Then
answer2 = optButton.Caption
Exit For
End If
Next optButton
'== 結果をメッセージボックスに表示 ==
MsgBox "【回答内容】" & vbCrLf & vbCrLf & _
Me.QuestionFrame1.Caption & ": " & answer1 & vbCrLf & _
Me.QuestionFrame2.Caption & ": " & answer2, _
vbInformation, "回答の確認"
End Sub
実行前の準備
- ユーザーフォームを作成します。
- フォーム上に「フレーム」コントロールを2つ配置します。それぞれの
(Name)
をQuestionFrame1
,QuestionFrame2
に、Caption
を「問1. ご希望のプランは?」, 「問2. お支払い方法は?」などに変更します。 - フレームの中に「オプションボタン」をそれぞれ複数配置します。(例:
QuestionFrame1
の中に「プランA」「プランB」、QuestionFrame2
の中に「クレジットカード」「銀行振込」) - フォーム上に「コマンドボタン」を1つ配置し、
(Name)
をSubmitButton
に、Caption
を回答を送信
に変更します。 - フォームのコードモジュールに上記のコードを貼り付け、フォームを表示して使用します。
コードの解説
フレームによるグループ化
オプションボタンをフォームに直接配置するのではなく、フレームコントロールの内側に配置することで、そのフレーム内のオプションボタンが一つの独立したグループとして機能します。これにより、「問1」と「問2」でそれぞれ一つずつ、合計二つのオプションボタンを選択できるようになります。
For Each optButton In Me.QuestionFrame1.Controls
この一行が、特定のグループ内の選択肢を判定するための核心部分です。
Me.QuestionFrame1
: 1つ目のフレームコントロールを指します。.Controls
: そのコントロール(この場合はフレーム)の内部に含まれる全てのコントロールのコレクションを返します。- この
For Each
ループは、QuestionFrame1
の中に配置されたオプションボタンを一つずつ順番にチェックしていきます。QuestionFrame2
も同様です。
If optButton.Value = True Then ...
ループの中で、各オプションボタンの .Value
プロパティを調べ、選択状態(True
)のボタンを見つけます。見つかったら、そのボタンの .Caption
(表示テキスト)を変数に格納し、Exit For
でループを抜けて処理を効率化しています。
まとめ
今回は、フレームコントロールを使ってオプションボタンをグループ化し、複数の設問への回答を取得する方法を解説しました。
- 複数の択一式設問を作りたい場合は、フレームでオプションボタンをグループ化する。
- 各グループの選択結果は、
フレーム名.Controls
をループ処理することで判定できる。
このテクニックを使えば、アンケートフォームや設定画面など、より複雑な選択肢を持つユーザーフォームを、構造的に分かりやすく作成することができます。