オプションボタン
オプションボタンはチェックボックスに似ていますが、複数のオプションボタンのうち、どれか1つしか選択できないという点が異なります。
(そもそも「ボックス」と「ボタン」という名前の違いまありますね、、、)
昔はラジオボタンなどと呼ぶこともありましたが今時の人は「ラジオボタン」をご存じないでしょう。
排他処理
オプションボタンは、どれか1つを選択した時に他の全てを未選択状態にしてくれます。
これは、単体のコントロールであるにも関わらず他のコントロールにも自動で影響が及ぶという点が他のコントロールと大きくことなります。
このような処理を排他処理と呼ぶことがあります。
グループ分け
「他のコントロールを未選択にする」ということはグループ化されてなければいけないわけですが、オプションボタンでは、「フォーム」単位、「フレーム」単位、「グループ名」単位でグループ化できます。
ちなみ1つのユーザーフォームでも「タブコントロール」に分ければ2つのフォームが存在する事になります。
ユーザーフォームにオプションボタンをただ並べますと、これらは全て1つのグループになります。

これらのうちいくつかをフレームコントロールで囲む事で、グループを2つに分けることができます。下の例では Frame1 と それ以外の2つにグループ分けされています。

さらに、オプションボタンにグループ名を設定することで新たにグループ分けできるようになります。下の例では、GroupNameプロパティをそれぞれ Group1とGroup2に設定しています。

グループ分けをすると、その中の1つだけが選択できるようになります。
どれが選択されているか
グループ分けは自動でできても、グループを指定して選択されているコントロールを見つけるのはプログラミングで特定しなければなりません。
グループの特定の仕方や選択されているコントロールの特定方法には定石がありますので、プログラムコードを通じて見ていくことにしましょう。
選択されているかを確認するコード
オプションボタンもチェックボックスと同様に選択されている状態では、ValueがTrueとなります。
ですからIf文を使って、
If Me.OptionButton1.Value = True Then
MsgBox Me.OptionButton1.Caption
End If
などとすれば選択されているオプションボタンを特定する事が出来ます。
キャプション名を取得するのもチェックボックスと同じです。
グループを特定する方法
各オプションボタンのグループをプログラマーが把握していれば、If、ElseIfを使って個別に特定しても構いませんが、後で改造する場合を考慮すると構造的なプログラムにした方が意味が分かりやすいでしょう。
フレームやグループ名でグループ分けされない時
全てのコントロールを巡り、それがオプションボタンであるかを判断して見分けます。
TypeName(コントロールオブジェクト)とすれば、オブジェクト名の「OptionButton」と文字列で返ってきます。
Private Sub CommandButton1_Click()
Dim myCtr As Control
For Each myCtr In Me.Controls
Debug.Print TypeName(myCtr)
If TypeName(myCtr) = "OptionButton" Then
Debug.Print myCtr.Caption
End If
Next myCtr
End Sub
この例では、コントロールがオプションボタンの時に、キャプション名を得ています。
キャプション名の無いコントロールの場合はエラーとなるためです。
フレームでグループ分けする時
今度は、Frame1を追加して、OptionButton1とOptionButton2をFrame1内に移動して動作を見てみます。
フレームを追加する事で、2つのグループに分ける事が出来たため2つ選択できるようになっています。
フレーム内のコントロールを巡るには、
Me.Frame1.Controls
としてコレクション(配列)を得れば良いでしょう。
Private Sub CommandButton1_Click()
Dim myCtr As Control
For Each myCtr In Me.Frame1.Controls
If TypeName(myCtr) = "OptionButton" Then
Debug.Print myCtr.Caption
End If
Next myCtr
End Sub
グループ名でグループ分けする時
オプションボタンのグループ分けはGroupNameというプロパティで設定します。
プロパティ値は、プロパティウインドウ、またはプログラムコードで設定可能です。
プログラムコードでグループ分けする場合は、Initialize(初期化)のタイミングで設定すれば良いでしょう。
’ユーザーフォームモジュールに記述します
Private Sub UserForm_Initialize()
Me.OptionButton3.GroupName = "group1"
Me.OptionButton4.GroupName = "group1"
End Sub
Private Sub CommandButton1_Click()
Dim myCtr As Control
For Each myCtr In Me.Controls
'Debug.Print TypeName(myCtr)
If TypeName(myCtr) = "OptionButton" Then
If myCtr.GroupName = "group1" Then
Debug.Print myCtr.Caption
Debug.Print myCtr.Value
End If
End If
Next myCtr
End Sub
オプションボタンのまとめ
オプションボタンを使えば、決まった値を得ることができ集計などには便利でしょう。
使い方のコツとしては、
・グループ分けの方法を特定する
・選択されている項目を特定する
以上の2点を押さえれば難しい事はないでしょう。
前述のプログラムコードのパターンを参考にしてみてください。
ユーザーフォームの使い方
・ユーザーフォームのプログラミング(準備編)
・ユーザーフォーム 第1回(起動と終了)
・ユーザーフォーム 第2回(ボタン)
・ユーザーフォーム 第3回(ラベル)
・ユーザーフォーム 第4回(テキストボックス)
・ユーザーフォーム 第5回(モーダル・モードレス)
・ユーザーフォーム 第6回(チェックボックス)
・ユーザーフォーム 第7回(オプションボタン)
・ユーザーフォーム 第8回(コンボボックス)
・ユーザーフォーム 第9回(リストボックス)
・ユーザーフォーム 第10回(リストボックス複数選択)
・ユーザーフォーム 第11回(タブストップ)
・ユーザーフォーム 第12回(スピンボタン)