フレームでグループ化、オプションボタンの使い方と選択した値の取得方法

動画でExcel フレームでグループ化、オプションボタンの使い方と選択した値の取得方法
【VBAユーザーフォーム】フレームでグループ化、オプションボタンの使い方と選択した値の取得方法。基礎編第11回
今回は フレームコントロールと
オプションボタンをご紹介したいと思います。
コントロールにはたくさん種類があります。
それをフォームにいろいろ配置していったら
まとまりがなくなって、とても使いづらくなる なんてことがよくあります。
それをグループごとに中に収めて、区別することができる、
フレームコントロールは、そういうコンテナ機能を備えたコントロールです。
マクロ動画 フレームでグループ化、オプションボタンの使い方と選択した値の取得方法
フレームコントロールは先に作る
フレームコントロールを使用して、密接に関連するコンテンツを持つコントロールを
グループ化すると視覚的にも、機能的にも便利です。
下図のサンプルのフォームにはフレームが一つ作成されていて、その中にテキストボックスが3
つあります。それからその外側にもテキストボックスが2つあります。

上の3つは先にフレームを作成し、その中にテキストボックスを設置したので、簡単でした。
あとから、下のテキストボックスもフレームで囲いたいという場合は、
図のようにテキストボックスの上にフレームが上に乗ってしまいテキストボックスが見えません。どのようにすればいいのでしょうか?

フレームをテキストボックスの下側に移動させれば、テキストボックスが見えるようになります。
フレームを選択して右クリックから背面へ移動を選んであげます。

フレームが背面に移動したので、テキストボックスが1つ現れました。もう1回背面に移動させる操作をしましょう。

フレームの中に2つテキストボックスが表示されました。 このように、後からフレームを作成すると、少々手間がかかりますので、フレームは始めに作成することをおすすめします。

フレームのプロパティ
フレームのプロパティにも、他のコントロールと同様のプロパティの他に、Cycle(サイクル)プロパティというのがあります。
フレーム内のコントロールを実行したあとの動作を設定するものです。
fmCycleAllFormsとfmCycleCurrentFormの2種類あります。デフォルトは1-fmCycleAllFormsです。
これはフォーム内の他のコントロールに循環移動します。

実行したところで、フォームのすべてのコントロールを順番に循環することがわかります。

2-fmCycleCurrentFormの場合は、現在のフレーム内を限定して循環移動します。

実行したところで、フォーカスが、現在のフレーム内だけで循環することがわかります。

サイクルプロパティは、フォームの状況に応じて、設定します。
Frameの外に移動する設定は、デフォルトのfmCycleAllForms
Frame内だけで移動する設定は、fmCycleCurrentFormにします。
オプションボタンとフレーム
オプション ボタン ( OptionButton) コントロールは、グループの中の項目を 1 つだけ選択することができるコントロールです。

実行すると、フォーム上のオプションボタンから1つだけしか選択できません。

解決策として、2つのフレーム ( Frame ) コントロールを作成します。
その中にオプション ボタン ( OptionButton) コントロールを配置すると、グループごとに1つのオプション ボタンを選択できるようになります。

実行すると、Frame1で1つ、Frame2で1つのオプション ボタン ( OptionButton) コントロールを選択することができます。

選択されたオプション ボタン ( OptionButton) コントロールの値を取得する
ボタンをクリックしたらオプションボタンの値を取得するようにします。

frame1とframe2それぞれについて、値を取得するためのコードを記述しました。
For Each ctrl In Me.Frame1.Controls以下のコードでは、ctrl.Value = True のボタンを探します。
同様に For Each ctrl In Me.Frame2.Controls以下のコードでも、ctrl.Value = True のボタンを探します。

Private Sub CommandButton2_Click() 'コマンドボタンを押したときに実行 Dim ctrl As Control Dim selectedOption1 As String, selectedOption2 As String 'selectedOption1 がどれかを探す For Each ctrl In Me.Frame1.Controls If TypeName(ctrl) = "OptionButton" And ctrl.Value = True Then selectedOption1 = ctrl.Caption Exit For End If Next ctrl 'selectedOption2 がどれかを探す For Each ctrl In Me.Frame2.Controls If TypeName(ctrl) = "OptionButton" And ctrl.Value = True Then selectedOption2 = ctrl.Caption Exit For End If Next ctrl
コードの後半部分です。取得した結果をDebug.Print に書き出します。

If selectedOption1 <> "" Then Debug.Print "Frame1: " & selectedOption1 Else Debug.Print "Frame1で選択されたオプションボタンはありません。" End If If selectedOption2 <> "" Then Debug.Print "Frame2: " & selectedOption2 Else Debug.Print "Frame2で選択されたオプションボタンはありません。" End If End Sub
実行して値を取得ボタンをクリックすると、結果がイミディエイトウィンドーに表示されます。

今回は フレームコントロールの設置の仕方とサイクルプロパティの動作と違いの説明をしました。 またフレームコントロールを利用したオプションボタンの設置と値の取得方法について解説いたしました。