#716 チェックボックス付きリストボックス風画面の作り方 フォーム、VBA

AccessのリストボックスコントロールではチェックボックスのON/OFFでその行の選択・非選択を切り替えるようなインタフェースを作ることができません。ここではその代替えとして、サブフォームを使ってそれっぽい画面を作る方法を紹介します。

  1. まず、チェックボックスのON/OFFを保存するフィールドを持ったテーブルを作成します。リストボックスに表示したい項目、それにプラスしてYes/No型のフィールドを持たせます。・・・・ここでは「tbl従業員選択」テーブル、「選択」フィールドとしています



    • サブフォーム側で表示する項目を限定できますので、それ以外のフィールドがあってもかまいません。既存のテーブルがそのまま使えるのであれば、それにYes/No型のフィールドを付け加えることもできます。

    • ここではそのようなテーブルやデータがすでにあるものとしますが、ケースによっては既存のテーブルがそのままでは使えない場合もあるかもしれません。たとえば、グループ化したデータを選択肢としたい、複数ユーザーが共有するリンクテーブルのためYes/No型のフィールドも共有されてしまう、などのケースです。その場合には、元のテーブルから”テーブル作成クエリ”、あるいは”削除クエリ+追加クエリ”を実行することで、作業テーブルを都度生成し、それを画面表示に使うようにします。


  2. 次にサブフォームを新規作成します。状況にもよりますが、ここでは「既定のビュー」を”データシート”としています。

  3. そのサブフォームのレコードソースを「tbl従業員選択」に設定し、表示したいコントロールを適宜配置します。


  4. フォームの「追加の許可」および「削除の許可」プロパティを ”いいえ” に設定します。Yes/No型の「選択」フィールドは更新できかつテーブルに保存しますので、「更新の許可」プロパティだけ ”はい” にします。


  5. 必要に応じて「詳細」セクションの「代替の背景色」を”色なし”に設定します。

  6. よりリストボックス風にするために選択行の文字色・背景色を替えたいのであれば、各”テキストボックス”に「条件付き書式」の設定を行います(”チェックボックス”は条件付き書式は設定できません)。ここでは「式」として『[選択]=True』を指定します。


  7. 今回はフォームを使っているため、別の行に移動するなど、一定の操作を追加しないとそのレコードは保存されません。そのため、”いずれかの欄をクリックしたらすぐに行が選択される””チェックマークが付く”といった動作をしてくれません。それを補完するため、下記のようなイベントプロシージャを作成します。

    Private Sub 選択_AfterUpdate()
    '[選択]の更新後処理

      'カレントレコードを強制的に保存
      DoCmd.RunCommand acCmdSaveRecord

    End Sub

    Private Sub 氏名_Click()
    '[氏名]のクリック時

      '選択のON/OFFをトグル
      With Me!選択
        .Value = Not .Value
        .SetFocus
      End With

      選択_AfterUpdate

    End Sub

    Private Sub 従業員番号_Click()
    '[従業員番号]のクリック時

      '選択のON/OFFをトグル
      With Me!選択
        .Value = Not .Value
        .SetFocus
      End With

      選択_AfterUpdate

    End Sub

    • 選択_AfterUpdate
      「選択」のチェックボックスが更新されたら、すぐにそのレコードを保存しています。

    • 氏名_Click()、従業員番号_Click()
      氏名や従業員番号の欄がクリックされたら「選択」欄のチェックマークの有無が交互に切り替わるようにしています。またそれによって「選択」の値が更新されますので、「選択_AfterUpdate」イベントプロシージャも実行します。

  8. 最後にメインフォームを新規作成し、その中に上記のフォームをサブフォームとして配置します。メインフォーム側のデザインは任意ですので、適宜必要なコントロールを配置するなどしてください。

※メインフォーム側の[OK]ボタンなどで何らかの処理を行う際、どの項目が選択されているかは、サブフォームのRecordsetCloneを取得したり、「tbl従業員選択」テーブルを直接参照することで判断します。


実行例:


| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved