オプションボタン(ラジオボタン)とは
ユーザーフォームで「複数の選択肢から1つだけ選ばせたい」という場面では、オプションボタン(一般的には「ラジオボタン」とも呼ばれます)を使います。チェックボックスが複数選択できるのに対し、オプションボタンは同じグループ内では1つしか選択できないという特徴があります。
この記事では、オプションボタンの基本的な使い方から、選択された項目の判定方法、複数グループを1つのフォームに配置する方法までを、実際に動作するサンプルコードとともに解説します。
オプションボタンの基本プロパティ
オプションボタンはOptionButtonコントロールとしてツールボックスから配置します。選択されているかどうかはValueプロパティ(True/False)で判定します。
以下は、フォーム上に「A」「B」「C」の3つのオプションボタン(OptionButton1〜OptionButton3)を配置した例です。
Private Sub CommandButton1_Click()
Dim selectedText As String
If OptionButton1.Value = True Then
selectedText = "Aが選択されました"
ElseIf OptionButton2.Value = True Then
selectedText = "Bが選択されました"
ElseIf OptionButton3.Value = True Then
selectedText = "Cが選択されました"
Else
selectedText = "何も選択されていません"
End If
MsgBox selectedText
End Sub
同じフォーム上にある複数のオプションボタンは、初期状態では自動的に1つのグループとして扱われます。そのため、OptionButton1を選択するとOptionButton2とOptionButton3は自動的に選択解除されます。
初期値をあらかじめ選択しておく
フォームを表示した時点で、いずれかのオプションボタンをデフォルトで選択させておきたい場合は、UserForm_InitializeイベントでValueをTrueに設定します。
Private Sub UserForm_Initialize()
OptionButton1.Value = True
End Sub
デフォルト選択を用意しておくことで、ユーザーが何も選ばずに次の操作へ進んでしまうミスを防げます。
Frameコントロールで選択肢のグループを分ける
「性別」と「支払方法」のように、1つのフォームに複数の選択グループを配置したい場合は、Frameコントロールで囲みます。同じフォーム上に置くだけだと、フレームで区切らない限りすべてのオプションボタンが1つのグループとして扱われてしまうため注意が必要です。
Private Sub CommandButton1_Click()
Dim genderText As String
Dim paymentText As String
' Frame1内:OptionButton1・OptionButton2
If OptionButton1.Value = True Then
genderText = "男性"
ElseIf OptionButton2.Value = True Then
genderText = "女性"
Else
genderText = "未選択"
End If
' Frame2内:OptionButton3・OptionButton4
If OptionButton3.Value = True Then
paymentText = "現金"
ElseIf OptionButton4.Value = True Then
paymentText = "クレジットカード"
Else
paymentText = "未選択"
End If
MsgBox "性別: " & genderText & vbCrLf & "支払方法: " & paymentText
End Sub
Frame1にOptionButton1とOptionButton2を、Frame2にOptionButton3とOptionButton4を配置しておくことで、性別グループと支払方法グループがそれぞれ独立して1つだけ選択できるようになります。
Frame内のコントロールをループで判定する
オプションボタンの数が多い場合は、If文を並べる代わりにFrame.Controlsをループして選択されているものを探すとコードがすっきりします。
Function GetSelectedOptionCaption(targetFrame As MSForms.Frame) As String
Dim ctrl As MSForms.Control
For Each ctrl In targetFrame.Controls
If TypeName(ctrl) = "OptionButton" Then
If ctrl.Value = True Then
GetSelectedOptionCaption = ctrl.Caption
Exit Function
End If
End If
Next ctrl
GetSelectedOptionCaption = ""
End Function
Private Sub CommandButton1_Click()
Dim result As String
result = GetSelectedOptionCaption(Frame1)
If result = "" Then
MsgBox "選択されていません"
Else
MsgBox result & "が選択されています"
End If
End Sub
TypeName(ctrl) = "OptionButton"でコントロールの種類を判定してからValueを確認することで、フレーム内に他の種類のコントロールが混在していても安全に処理できます。
オプションボタンとチェックボックスの違い
オプションボタンとよく似たコントロールにCheckBox(チェックボックス)があります。使い分けの基準は以下の通りです。
- オプションボタン:同じグループ内から1つだけ選ぶ場合に使う(性別、支払方法など「どれか1つ」)
- チェックボックス:複数の項目を独立してON/OFFできる場合に使う(利用規約への同意、複数条件の絞り込みなど)
「排他的な選択かどうか」がオプションボタンとチェックボックスを使い分ける基準になります。
注意点
- フレームで区切らないと意図せず同じグループになる:フォーム上に複数の選択グループを作りたい場合は、必ず
Frameコントロールで領域を分けましょう。 - 初期値を設定しないとすべて未選択になる:
UserForm_Initializeで初期選択をしておかないと、ユーザーが何も選ばないまま処理が進んでしまう可能性があります。 - コントロール名は分かりやすく変更しておく:
OptionButton1のままだと後から見て何を表すか分かりにくいため、optGenderMaleのような名前に変更しておくとコードの可読性が上がります。
まとめ
ユーザーフォームでオプションボタン(ラジオボタン)を扱う方法を解説しました。
- 選択判定は
OptionButton.Value = Trueで確認する - 同じフォーム上のオプションボタンは自動的に1グループになる
- 複数グループに分けたい場合は
Frameコントロールで領域を区切る - 選択肢が多い場合は
Frame.Controlsをループして判定するとコードがシンプルになる - 「1つだけ選ぶ」ならオプションボタン、「複数選べる」ならチェックボックスを使う
排他的な選択肢を扱うフォームを作るときは、オプションボタンとFrameコントロールの組み合わせを覚えておくと、直感的で分かりやすい入力画面を作れます。


コメント