ユーザーフォーム 第7回 オプションボタン

ユーザーフォーム

オプションボタン

 オプションボタンはチェックボックスに似ていますが、複数のオプションボタンのうち、どれか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点を押さえれば難しい事はないでしょう。
 前述のプログラムコードのパターンを参考にしてみてください。

タイトルとURLをコピーしました