オプションボタンを使って連結フィールドに文字列を記録する

 フォームでオプショングループ(フレーム)を使うと択一式のボタンを設置できますが、値として数値しか保持できません。検索用などの用途(非連結)であればさほど差し支えないものの、コンボボックスやリストボックスに比べてやはり不便です。
 そこで、オプショングループとオプションボタンを使って選択された値をもとに連結フィールドに文字列を記録するということをやってみます。ただし、オプショングループ自体は非連結にしますので帳票フォームには適用できません。

 また、そもそもワンクリックで文字列を記録したいという場合はリストボックスを使った方がはるかに簡単ですので、慎重にご検討ください。

手順

f:id:accs2014:20190302155304p:plain:right:w600

 もとになるテーブルはこのようなものです。
 「会員種別」がオプショングループを使って入力しようとする列です。

f:id:accs2014:20190302170119p:plain:right:w550

 このテーブルに基づくフォームを作ります。
 そして非連結のオプショングループを置き、名前を「fra_会員種別」とします。
 また、確認用として普通の連結テキストボックスを置きます(最も下のテキストボックス)。

 さて注意点ですが、各オプションボタンのラベルの標題は”実際に記録しようとする文字列”とします。
 ボタンと記録する文字列をどう対応付けるかについてはいくつかのやり方が考えられますが、ここではラベルの標題を取得するものとします。

f:id:accs2014:20190302155258p:plain:right:w400

 そしてフォームモジュールに次のように記せば完成です。
 まず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

f:id:accs2014:20190302155255p:plain:right:w400

 実際に操作している様子です。
 選択されたチェックボックスに対応するラベルの標題が連結フィールドに記録されているのがわかります。

備考

連結オプショングループにするとどうなるか

f:id:accs2014:20190302155253p:plain:right:w400

 さて、それならそもそもオプショングループを会員種別フィールドと連結してしまえば(コントロールソースを「会員種別」にする)Currentイベントのコードも不要になり簡単なのではないかという気がします。
 しかし実際にやってみると(Me.fra_会員種別.Valueが文字列型になるためAfterUpdateイベント内も若干手直しが必要です)、文字列の記録は問題ないものの、その値はどのボタンのオプション値(数値)とも一致しなくなるため、ボタンはすべて非選択状態となります。

Controls(0).Captionについて

 上記コードの説明では簡単に流していますがControls(0).Captionにより、そのコントロールに結び付けられているラベルの標題が取得できます。
 これについては次の記事をご覧ください。

www.accessdbstudy.net