- ベストアンサー
MSアクセスで絞り込みを繰返す方法
- MSアクセスを使用して、フォームに表示されているレコードを絞り込む方法について教えてください。
- 絞り込みを柔軟に何度も付け加える方法として、formのレコードセットを利用していますが、filterの使い方が間違っているようです。
- 他の定番の手法も教えていただけると助かります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Filter の実態とは、フォームのレコードソースの Where 節を安直に書き換える機能です。 Me.Recordsource="SELECT * FROM Test;" ↓ Me.Recordsource="SELECT * FROM Test WHERE 性別='F';" この機能では、次のような構文はサポートされていません。 Me.Recordsource="SELECT * FROM {SELECT * FROM Test WHERE 性別='F'} WHERE XXXX;" ですから Me.Recordsource="SELECT * FROM Test;" ↓ Me.Recordsource="SELECT * FROM Test WHERE 性別='F' AND 年齢=20;" と Where節の条件を多重化するしかありません。 これを Filter で実現すれば Option Compare Database Option Explicit Private Sub コマンド10_Click() Me.Filter = "性別='F'" Me.FilterOn = True End Sub Private Sub コマンド12_Click() Me.Filter = "性別='F' AND 年齢=20" Me.FilterOn = True End Sub Private Sub コマンド13_Click() Me.Filter = "性別='F' AND 年齢=20 AND 地域='A'" Me.FilterOn = True End Sub となります。 【1つのクリックイベントで実現することも可】 その為には、クリックイベントを生成するクラスモジュールを用意します。そうすれば、フィルターのレベルの指示に従って絞り込むことが可能。 Private Sub コマンドXX_Click() Me.Filter = strFilter Me.FilterOn = True End Sub 添付図は、1、2、3と絞り込んだ最後の様子です。
その他の回答 (1)
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
【訂正と補足】 1、クラスモジュールを書く必要はありません。 条件節を動的にすれば2行だけで実現できます。例えば、条件分を選択するコンボボックスを3つ用意して、それらが選択される都度に非表示の実行条件文を生成するテキストボックスのテキストを完成させる。フィルターの実行においては、それを参照すれば事足ります。ということで、先の回答の後半部分については訂正しておきます。 2、多重フィルターシステムを強いて開発するとすれば・・・ これは、テストしていませんので、あくまでも可能性として。それは、フォームのクローンを利用するというもの。この場合、第一次フィルターをかけたフォームをクローン化して更に第二次フィルターをかけるというアイデア。これでアマゾン流が実現できそうです。が、注意すべきはクローン化したフォームが第二次フィルターの実行時にデータベースを再参照するのかどうか?仮に、そうであれば多重検索することになります。狙い通りにデータベースの再参照なくフィルターが実行されれば目論見は成功。これは、質問者自身でテストされてください。私見では、そこまでは・・・と考えます。 以上、訂正と補足しておきます。なんせ、車検に出した車を取りに行く時間がとっくに過ぎているなかでのバタバタ回答で大変失礼しました。お詫びしておきます。
お礼
ありがとうございます! 教えて頂いたことを参考に以下のようなものを試しに作ってみたところ(サブクエリを知りませんでした…)、 なんとかイメージしたことができそうな感じがしています。 ありがとうございます。 それ違う!ということがあればご指摘いただければ幸いです。 Dim mycriteria As String, SQLold As String, SQLnew As String mycriteria = "ID>100" SQLold = Me.RecordSource SQLnew = "select * from (" & SQLold & ")where " & mycriteria & "" Me.RecordSource = SQLnew
補足
む、これだともしかすると戻すことができませんね。 もう一度よく考えてみます。