はじめに
VBAのユーザーフォームで、「複数の選択肢の中から、ユーザーに一つだけを選んでもらいたい」という場面は非常に多くあります。例えば、性別の選択(男性/女性)や、アンケートの評価(良い/普通/悪い)などです。このような択一式の選択には、「オプションボタン」コントロールが最適です。
同じグループ内のオプションボタンは、どれか一つを選択すると、他のボタンの選択が自動的に解除される(排他的選択)という特性を持っています。
この記事では、ユーザーフォーム上に配置した複数のオプションボタンの中から、ユーザーがどれを選択したのかをVBAで判定する、基本的で確実な方法を解説します。
選択されたオプションボタンを判定するVBAサンプルコード
このマクロは、ユーザーフォームに配置された「決定」ボタンがクリックされたときに、3つのオプションボタンの状態を調べ、選択されている項目のキャプション(表示テキスト)をメッセージボックスに表示します。
ユーザーフォームのコード
' 「決定」ボタン(SubmitButton)がクリックされたときの処理
Private Sub SubmitButton_Click()
'== 変数を定義します ==
Dim i As Long
Dim selectedChoice As String
' デフォルト値を設定(何も選択されなかった場合)
selectedChoice = "未選択"
'== 1番から3番までのオプションボタンをループ処理 ==
For i = 1 To 3
' .Valueプロパティで、選択状態(True)か非選択状態(False)かを判定
If Me.Controls("ChoiceOption" & i).Value = True Then
' 選択されていたら、そのボタンのCaptionを取得してループを抜ける
selectedChoice = Me.Controls("ChoiceOption" & i).Caption
Exit For
End If
Next i
'== 結果をメッセージボックスに表示 ==
MsgBox "選択されたプラン: " & selectedChoice, vbInformation, "選択結果"
End Sub
実行前の準備
- ユーザーフォームを作成します。
- フォーム上に「オプションボタン」を3つと、「コマンドボタン」を1つ配置します。
- 3つのオプションボタンの
(Name)
プロパティを、上から順にChoiceOption1
,ChoiceOption2
,ChoiceOption3
に変更します。Caption
はそれぞれ「プランA」「プランB」「プランC」のように設定します。 - コマンドボタンの
(Name)
をSubmitButton
に、Caption
を決定
に変更します。 - フォームのコードモジュールに上記のコードを貼り付け、フォームを表示して使用します。
コードの解説
If Me.Controls("ChoiceOption" & i).Value = True Then
この一行が、どのオプションボタンが選択されているかを判定する核心部分です。
Me.Controls("ChoiceOption" & i)
:For
ループのカウンタ変数i
を使って、ChoiceOption1
,ChoiceOption2
,ChoiceOption3
という名前のコントロールを順番に参照しています。.Value
: オプションボタンのValue
プロパティは、そのボタンが選択されている状態であればTrue
を、選択されていなければFalse
を返します。- この
If
文で、Value
がTrue
のボタンが見つかった瞬間に、中の処理が実行されます。
selectedChoice = Me.Controls("ChoiceOption" & i).Caption
選択状態のボタンが見つかったら、そのボタンの .Caption
プロパティ(画面に表示されているテキスト、例: “プランA”)を取得し、結果を格納する文字列変数 selectedChoice
に代入しています。
Exit For
オプションボタンは、グループ内で必ず一つしか選択されません。そのため、選択されているボタンが一つ見つかった時点で、それ以上ループを続ける必要はありません。Exit For
を使ってループを即座に抜けることで、無駄な処理を省き、コードを効率化しています。
まとめ
今回は、ユーザーフォームのオプションボタンで、どの項目が選択されたかを判定する方法を解説しました。
- オプションボタンの選択状態は
.Value
プロパティで確認できる(選択済み =True
)。 - 複数のオプションボタンは、
Controls
コレクションとループを組み合わせることで効率的に判定できる。 - 一つ見つかったら
Exit For
でループを抜けるのが定石。
この基本を応用すれば、ユーザーの選択に応じて実行する処理を分岐させたり、シートに書き込む値を変えたりと、様々な対話的なツールを作成することができます。