フォームとコントロールの活用−フレーム内に配置したオプションボタンの選択と入力チェック
 オプションボタンの中から択一式でどれかひとつを選んでもらい、アプリケーション側で
処理を分岐させるというケースでは、オプションボタンが増えれば増えるほど、
入力チェックのための単純なコードが増えてしまいがちです。

例えばユーザフォーム上に・・・

	フレーム×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がクリック
したオプションボタンあらわしているところです。

Excel97、2000



戻る


Excel Word Access VBA! モーグ