オプションボタンの中から択一式でどれかひとつを選んでもらい、アプリケーション側で
処理を分岐させるというケースでは、オプションボタンが増えれば増えるほど、
入力チェックのための単純なコードが増えてしまいがちです。
例えばユーザフォーム上に・・・
フレーム×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がクリック
したオプションボタンあらわしているところです。
|