Home > 即効テクニック > Excel VBA > ユーザーフォーム関連のテクニック > フォームとコントロールの活用−フレーム内に配置したオプションボタンの選択と入力チェック

即効テクニック

ユーザーフォーム関連のテクニック

フォームとコントロールの活用−フレーム内に配置したオプションボタンの選択と入力チェック

(Excel 97/2000)
オプションの中から択一式でどれかひとつを選んでもらい、アプリケーション側で処理を分岐させるというケースでは、オプションが増えれば増えるほど、入力チェックのための単純なコードが増えてしまいがちです。例えばユーザフォーム上に・・・	フレーム×2、各フレームにオプションボタン4つを配置したとすると、フレーム内に配置したオプションボタンはそれぞれグループ化されますので、フレーム内でどれかひとつが確実に選択されているかどうかを調べる必要があります。
このようなケースでしばしば以下のようなコーディングが見られます。
If OptionButton1.Value = False And OptionButton2.Value = False ・・・
つまり、選択状況を知るために、オプションボタンの数の分だけValueプロパティーをチェックするためのコードを記述しているのです。
上記のような比較的少数のオプションボタンであれば特に気にかけるほどでもありませんが、コードの可読性再利用性などを考えるとあまり効率的なコーディング手法であるとはいえません。

以下上記のケースを想定しオプションボタンの使用に関するサンプルです。

●入力チェック●
ユーザフォーム上に配置された各コントロールの入力チェックを行う段階でオプションボタンの値を効率的にチェックするには、フレームコントロール配下のControlsプロパティーから取得されるコレクションから各オプションボタンを取得し、Valueプロパティーを評価します。
'=================================================================================

(For Each ループのネストによる手法)
※他のコントロールの評価も同時に行うことを想定しています

Dim CtrlFrm As Control
Dim CtrlOpt As Control
Dim cntFrm As Integer, cntOptTrue As Integer

For Each CtrlFrm In Me.Controls

If CtrlFrm.Name Like "Frm*" Then 'コントロール名による分岐処理
    cntFrm = cntFrm + 1 'フレーム個数カウンタ加算
    For Each CtrlOpt In CtrlFrm.Controls '対象フレーム内のコントロール分ループ
   'オプションボタンの値がTrueの場合にオプションボタンカウンタ加算
        If CtrlOpt.Name Like "Opt*" And CtrlOpt.Value = True Then
            cntOptTrue = cntOptTrue + 1
            Exit For
        End If
    Next
ElseIf '・・・Else(if)でフレーム以外のコントロールの入力チェック

End If

Next

'フレーム数とTrueであったオプションボタンの個数とを比較
'OKが表示されない場合は未選択のオプショングループあり。
If cntFrm = cntoptrue Then MsgBox "OK"

'==============================================
また、フレームの数分だけのループを指定して入力チェックを行う場合は・・・
">'==============================================

(Controlsコレクションのインデックスからフレーム内のコントロールにアクセスする手法)

Dim cntFrm As Integer, cntOptTrue As Integer
Dim i As Integer, j As Integer

cntFrm = 2 'フレームの数

For i = 1 To cntFrm
    For j = 1 To Me.Controls("Frame" & i).Controls.Count
        If Me.Controls("Frame" & i).Controls(j - 1).Value = True Then
            cntOptTrue = cntOptTrue + 1
        End If
    Next j
Next i

If cntOptTrue = cntFrm Then MsgBox "OK"

'">'==============================================
●親フレームとクリックされたオプションボタン●
クリックされたオプションボタンが配置されたフレーム名とクリックされたオプションボタンの名前を知るには以下のようにします。
※各オプションボタンのクリックイベントよりより下記のOptProcプロシージャを呼び出す。
'==============================================
Private Sub OptProc()

	MsgBox Me.ActiveControl.Name & "内の" & Frame1.ActiveControl.Name

End Sub

Private Sub OptionButton1_Click()
Call OptProc
End Sub

Private Sub OptionButton2_Click()
Call OptProc
End Sub

・・・以下オプション数分のクリックイベント
このサンプルのポイントは、ユーザフォーム上のActiveControlが、クリックされたオプションボタンの属するフレームであり、フレーム内のActiveControlがクリックしたオプションボタンあらわしているところです。