フォームでオプショングループ(フレーム)を使うと択一式のボタンを設置できますが、値として数値しか保持できません。検索用などの用途(非連結)であればさほど差し支えないものの、コンボボックスやリストボックスに比べてやはり不便です。
そこで、オプショングループとオプションボタンを使って選択された値をもとに連結フィールドに文字列を記録するということをやってみます。ただし、オプショングループ自体は非連結にしますので帳票フォームには適用できません。
また、そもそもワンクリックで文字列を記録したいという場合はリストボックスを使った方がはるかに簡単ですので、慎重にご検討ください。
手順
もとになるテーブルはこのようなものです。
「会員種別」がオプショングループを使って入力しようとする列です。
このテーブルに基づくフォームを作ります。
そして非連結のオプショングループを置き、名前を「fra_会員種別」とします。
また、確認用として普通の連結テキストボックスを置きます(最も下のテキストボックス)。
さて注意点ですが、各オプションボタンのラベルの標題は”実際に記録しようとする文字列”とします。
ボタンと記録する文字列をどう対応付けるかについてはいくつかのやり方が考えられますが、ここではラベルの標題を取得するものとします。
そしてフォームモジュールに次のように記せば完成です。
まずAfterUpdateイベントですが、オプショングループ内のコントロールを走査してオプションボタンのオプション値とオプショングループの値を比較します。そして値が一致したら(そのボタンが選択されていたら)そのオプションボタンのラベルの標題を会員種別フィールドに転記します。走査とラベル標題の転記にはいずれもControlsコレクション(そのコントロールに結び付いたコントロール)を利用しています。
Currentイベントではオプショングループの値をクリアしたうえで(新規レコード用)、上記と逆の操作を行っています(レコード移動時用)。
Option Compare Database Private Sub Form_Current() Dim i As Control Me.fra_会員種別.Value = Null For Each i In Me.fra_会員種別.Controls If i.ControlType = acOptionButton Then If i.Controls(0).Caption = Me.会員種別 Then Me.fra_会員種別.Value = i.OptionValue Exit For End If End If Next End Sub Private Sub fra_会員種別_AfterUpdate() Dim i As Control For Each i In Me.fra_会員種別.Controls If i.ControlType = acOptionButton Then If i.OptionValue = Me.fra_会員種別.Value Then Me.会員種別 = i.Controls(0).Caption Exit For End If End If Next End Sub
実際に操作している様子です。
選択されたチェックボックスに対応するラベルの標題が連結フィールドに記録されているのがわかります。
備考
連結オプショングループにするとどうなるか
さて、それならそもそもオプショングループを会員種別フィールドと連結してしまえば(コントロールソースを「会員種別」にする)Currentイベントのコードも不要になり簡単なのではないかという気がします。
しかし実際にやってみると(Me.fra_会員種別.Valueが文字列型になるためAfterUpdateイベント内も若干手直しが必要です)、文字列の記録は問題ないものの、その値はどのボタンのオプション値(数値)とも一致しなくなるため、ボタンはすべて非選択状態となります。
Controls(0).Captionについて
上記コードの説明では簡単に流していますがControls(0).Captionにより、そのコントロールに結び付けられているラベルの標題が取得できます。
これについては次の記事をご覧ください。