Excel VBA フレームを使用してオプションボタンをグループ化する

スポンサーリンク

フレームでオプションボタンの項目を分けて状態を取得する方法

OptionButton【オプションボタン】コントロールとFrame【フレーム】コントロールを併用すると、フレーム内のオプションボタンはグループとして管理され他のグループの選択の影響を受けなくなります。


また、フレームを管理するFrame【フレーム】コントロールから得られるフレーム内のすべてのコントロールを表すControls【コントロールズ】コレクションをControls【コントロールズ】プロパティで参照してループ処理を行うことで、フレーム内のコントロールを1つずつ参照してコントロールの値を取得することができます。

Control.Controls【コントロールコントロールズ】プロパティ

フレーム内に配置されたすべてのコントロールを表すControls【コントロールズ】コレクションを参照するには、Control【コントロール】オブジェクトのControls【コントロールズ】プロパティを使用します。

Control.Controls【コントロールコントロールズ】プロパティの書式と設定値の説明

オブジェクト.Conntols

  • オブジェクト(必須)
    Frame【フレーム】コントロールオブジェクトの「オブジェクト名」を指定します。

各フレームのグループで選択されているボタンを表示するコードと解説

Private Sub CommandButton1_Click()
Dim コントロール1 As Control
Dim コントロール2 As Control
For Each コントロール1 In Frame1.Controls
If コントロール1.Value = True Then Exit For
Next
For Each コントロール2 In Frame2.Controls
If コントロール2.Value = True Then Exit For
Next
On Error GoTo エラー処理
MsgBox "Frame1で選択されたボタン:" & コントロール1.Caption & vbCrLf & _
"Frame2で選択されたボタン:" & コントロール2.Caption
Exit Sub
エラー処理:
MsgBox "ボタンを選択してください。"
End Sub
1行目【Private Sub CommandButton1_Click()】
「CommandButton1」ボタンがクリックされたときに発生す「CommandButton1_Click」イベントプロシージャにコードを記述します。



2行目【Dim コントロール1 As Control】
Frame1に配置されているOptionButton【オプションボタン】をControls【コントロールズ】プロパティで参照して格納するオブジェクト変数「コントロール1」をオブジェクト型(Control)で宣言します。


3行目【Dim コントロール2 As Control】
Frame2に配置されているOptionButton【オプションボタン】をControls【コントロールズ】プロパティで参照して格納するオブジェクト変数「コントロール2」をオブジェクト型(Control)で宣言します。


4行目【For Each コントロール1 In Frame1.Controls】
For Each【フォア イーチ】 ステートメントを使用して繰り返し処理の始まりです。オブジェクト変数「コントロール1」にControls【コントロールズ】プロパティで参照したFrame1内のコントロール(OptuionButton)を順に格納して繰り返します。


5行目【If コントロール1.Value = True Then Exit For】
If【イフ】ステートメント(条件分岐)を使用してFrame1内のコントロール(OptionButton)が格納されている変数「コントロール1」をOptionButton【オプションボタン】コントロールオブジェクトのValue【バリュー】プロパティで参照して「参照した値がTrueの場合にExit For【エグジットフォー】ステートメントで繰り返し処理を途中で抜ける」を定義します。

Exit For【エグジットフォー】ステートメントで処理を抜けるときオブジェクト変数「コントロール1」には、値がTrueのCommandButton【コマンドボタン】すなわち、ボタンが選択されているCommandButton【コマンドボタン】が格納されています。


6行目【Next】
4行目のFor Each【フォーイーチ】ステートメントからここまでのForm1に設定されているOptionButtonの設置数の回数または、値がTrueのOptionButtonが見つかるまで繰り返します。


7行目~9行目
Frame2内のコントロール処理です。4行目~6行目のFrame1内のコントロール処理と同じ内容です。


10行目【On Error GoTo エラー処理】
Frame【フレーム】コントロール内のOptionButton【オプションボタン】が選択されていない場合、オブジェクト変数の「コントロール1」または「コントロール2」にOptionButtonコントロールオブジェクトが格納されていないので次のMsgBox関数の値で使用しているCaption【キャプション】プロパティでエラーが発生します。On Error【オンエラー】ステートメントとGoTo【ゴウトゥ】ステートメントを使用して、エラーが発生した場合、処理を「エラー処理:」ラベルがある14行目までジャンプしてエラーを回避します。


11行目~12行目【MsgBox “Frame1で選択されたボタン:” & コントロール1.Caption & vbCrLf & _
“Frame2で選択されたボタン:” & コントロール2.Caption】

変数「コントロール」に格納されたそれぞれのTrue(ボタンが選択されている)のOptionButtonをCaption【キャプション】プロパティで設定されている文字列を取得してMsgBox関数を使用して選択されている「ボタン」をユーザーに伝えます。


13行目【Exit Sub】
Exit Sub【エグジットサブ】ステートメントを宣言してSub【サブ】プロシージャーを途中で抜けます。


14行目~16行目【エラー処理:
MsgBox “ボタンを選択してください。”
End Sub】

エラーが発生した場合の処理です。ボタンが選択されていないことを伝えEnd 【エンド】ステートメントでSub【サブ】プロシージャーを終了します。


実行結果



Frame1内の選択されたボタンの名前をA列セルに
Frame2内の選択されたボタンの名前をB列セルに表示するコードと解説

Private Sub CommandButton1_Click()
Dim コントロール1 As Control
Dim コントロール2 As Control
For Each コントロール1 In Frame1.Controls
If コントロール1.Value = True Then Exit For
Next
For Each コントロール2 In Frame2.Controls
If コントロール2.Value = True Then Exit For
Next
On Error GoTo エラー処理
With Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
.Value = コントロール1.Caption
.Offset(0, 1).Value = コントロール2.Caption
End With
Exit Sub
エラー処理:
MsgBox "ボタンを選択してください。"
End Sub
11行目【With Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)】
Rows.Count【ロウズカウント】プロパティを使用して最終行のセルを参照し、End【エンド】プロパティの引数にXlUpを指定して上方向に値が入力されている最終行番号を参照してOffset【オフセット】プロパティを使用して最後に値が入力されている行の次の行を参照して、With【ウィズ】ステートメントで指定します。


12行目【.Value = コントロール1.Caption】
With【ウィズ】ステートメントで指定したA列の値が入力されている行の次の行のセルにオブジェクト変数「コントロール1」の
Caption【キャプション】(コントロールに表示されている文字列)を代入します。


13行目【.Offset(0, 1).Value = コントロール2.Caption】
With【ウィズ】ステートメントで指定したセルの位置からOffset(0, 1)で列を右に1列ずらした位置、すなわちB列に
オブジェクト変数「コントロール2」のCaption【キャンプション】を代入します。


実行結果


フレームのプロパティ一覧は「フレームのプロパティ」をご覧ください。

以上で、フレームを使用してオプションボタンをグループ化する方法についての解説を終了します。ありがとうございました。

スポンサーリンク

関連記事・広告