チェックボックスの選択できる数を制限する

 フォームに多数のチェックボックスを置いたうえで「3つまでOnにできる」というように選択数の上限を設ける方法についてです。
 ただし、ここで示すのは各レコード内の連結チェックボックス、またはヘッダやフッタに設置する非連結のチェックボックスの選択数を制限する対する方法です。「チェックをOnにできるレコードの数を制限する」という内容ではありません。

 連結コントロールの(テーブルのYes/No型の列に結びついている)チェックボックスであればテーブルの入力規則やデータマクロで制限できますが、チェックボックスをクリックした時点ではチェック(上限数を超えていないかどうかのチェック)がはたらきませんし、その方法では非連結のチェックボックスには適用できません。
 そこでチェックボックスをクリックするたびにチェックがはたらき、また非連結のチェックボックスにも適用できる方法を示します。


手順

f:id:accs2014:20190211113325p:plain:right:w650

 サンプルとしてこのようなテーブルを用います。
 

f:id:accs2014:20190211113322p:plain:right:w650

 このテーブルをレコードソースとするフォームを設けて、Yes/No型の列(チェックボックス)をすべてフォーム上に置きます。
 そしてチェックボックスの本体のみをすべて同時に選択し、3つのプロパティを次のように設定します。
 なお、これはチェックボックスを3つまで選択できるようにする設定です。例えば4つまでにするのであれば入力規則の「-3」の部分を「-4」とし、エラーメッセージも適宜変更してください。

既定値:False
入力規則:[新聞]+[テレビ]+[ラジオ]+[Web]+[SNS]+[その他]>=-3
エラーメッセージ:選択できるのは3つまでです

 補足ですがこの例の場合は既定値の設定はなくても同じように機能します。
 ただし、非連結のチェックボックスで同じように設定したとき(「トリプルステート」プロパティの設定にかかわらず)フォームを開いたときチェックボックスがNullになり、このときチェックがうまくはたらきません。入力規則の式にNz関数を使っても同様です。よって既定値も設定するようにしています。

f:id:accs2014:20190211113319p:plain:right:w500

 以上で設定は終了です。
 フォームビューで開いてチェックボックスをクリックしたところ、上記の入力規則に抵触した(最初のレコードで4つ目のOnになる)ためメッセージダイアログが表示されています。

f:id:accs2014:20190211113315p:plain:right:w500

 ダイアログを閉じるとただちにチェックが消えて元に戻ります。
 本来なら3つ選んだ時点で未選択のチェックボックスが使用不可になるのが理想かと思いますが、このぐらいでも悪くないだろうと思います。

備考

 本格的に考えるならクラスモジュールで多数のコントロールのイベントをひとまとめに……といった話になるかと思いますが、とにかく早く簡単にやりたい場合はこれで足りるかと思います。
 なお、チェックボックスの数が多い場合はチェックボックスの名前を「チェック1」「チェック2」などと付け直してから設定する方が扱いやすいでしょう。
 当たり前ですがテーブルを直接操作された場合は制限がはたらきませんので、必要であればテーブルの入力規則と併用するようにしてください。