【VBA】複数の質問項目をオプションボタンで選択させる方法(フレーム活用)

目次

はじめに

ユーザーフォームでアンケートを作成する際、「問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

実行前の準備

  1. ユーザーフォームを作成します。
  2. フォーム上に「フレーム」コントロールを2つ配置します。それぞれの (Name)QuestionFrame1, QuestionFrame2 に、Caption を「問1. ご希望のプランは?」, 「問2. お支払い方法は?」などに変更します。
  3. フレームの中に「オプションボタン」をそれぞれ複数配置します。(例: QuestionFrame1 の中に「プランA」「プランB」、QuestionFrame2 の中に「クレジットカード」「銀行振込」)
  4. フォーム上に「コマンドボタン」を1つ配置し、(Name)SubmitButton に、Caption回答を送信 に変更します。
  5. フォームのコードモジュールに上記のコードを貼り付け、フォームを表示して使用します。

コードの解説

フレームによるグループ化

オプションボタンをフォームに直接配置するのではなく、フレームコントロールの内側に配置することで、そのフレーム内のオプションボタンが一つの独立したグループとして機能します。これにより、「問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 をループ処理することで判定できる。

このテクニックを使えば、アンケートフォームや設定画面など、より複雑な選択肢を持つユーザーフォームを、構造的に分かりやすく作成することができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次