(VBA) Access のサブフォームからチェックしたレコードを取得
2014-08-24 01:39:08
Access のサブフォームにチェックボックスをつけてチェックの付いている行だけを処理したい…。.netでは簡単にできることですが、Accessでは簡単ではないのですね。
以下にざっと手順を紹介します。
- サブフォームに表示させるデータを設定する。その際、一意となる番号(IDなど)も取得できるようにしておく。
- サブフォームに非連結でチェックボックスを追加。
- サブフォームに非連結でIDを格納するためのテキストボックス(または変数等)を追加。テキストボックスは処理でしか使用しないので、フォームヘッダなどの見えない所に配置し、非表示設定とします。
- チェックボックスのフォーカス取得後イベントで、チェックボックスのオンオフにより処理を記載する。
- オン時の処理:選択行のIDを「ID,」としてテキストボックスに設定する。必ず、「1,2,3」のような形で格納する。
- オフ時の処理:選択行のIDを「,ID,」の形でテキストボックス内を検索し、あれば「,」に置き換える。置換した結果、テキストボックスが「,」から始まっている場合、「,」を削除する。
- チェックボックスのコントロールソースの設定として、InStr()を用いて、「,ID,」の文字列をテキストボックスから検索するように設定。この設定で、一致する文字列があればチェックがつき、無ければ未チェックとなります。
- 結果として、テキストボックスに格納しているIDが選択行ということになるので、テキストボックスのIDを使って処理を行うというような形です。
- あとは、メインフォームからサブフォームのテキストボックスの値を取得することで、チェックの付いている行に対しての処理を行うことができます。
以上です。
このことから、サブフォームのチェックボックスとテキストボックスは必ずイコールとなるように設定する必要があります。
キモとしては、テキストボックスには必ず「1,2,3,」の形で保存すること。
検索する場合には必ず「,1,」の形で検索することです。
なので、検索時には頭に「,」の文字を付加した上で検索することになります。
しかし、Access はデータありきなので、こういう方法でしかこういうことができないのですね。
サブフォームはJOINやUNION使っているので編集できないし、なるほどーと思った一件でした。
サンプル
Access2013 で作成しています。