MSアクセスで絞り込みを繰返す方法

このQ&Aのポイント
  • MSアクセスを使用して、フォームに表示されているレコードを絞り込む方法について教えてください。
  • 絞り込みを柔軟に何度も付け加える方法として、formのレコードセットを利用していますが、filterの使い方が間違っているようです。
  • 他の定番の手法も教えていただけると助かります。
回答を見る
  • ベストアンサー

MSアクセスで絞り込みを繰返すには?

MSアクセスについての質問です。 現在のフォームに表示されているレコードを対象にして、絞り込みをしたいと思っています。 性別で絞り込み→その結果に対して地域で絞り込み→その結果に対して年齢で絞り込み といったように、絞り込みを柔軟に何度も付け加えるというのが目標です(amazonの絞り込みのイメージです)。 そこで、formのレコードセットを利用してできないかと考え、以下のようなものを書いてみました。 Dim mycriteria As String mycriteria = "ID = 1" Me.Recordset.FindFirst mycriteria '動作テスト用 Me.Recordset.Filter = mycriteria '本題 実行すると、ID1番へのレコードの移動(findfirst)は起きるのですが、 ID1番だけに絞り込み(filter)はなされません。 filterに対する理解が間違っているのでしょうか。 ご指導願えれば幸いです。 また、ほかに定番の手法などがあれば、お教え願えれば幸いです。

  • gosui
  • お礼率89% (26/29)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

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)

回答No.2

【訂正と補足】 1、クラスモジュールを書く必要はありません。  条件節を動的にすれば2行だけで実現できます。例えば、条件分を選択するコンボボックスを3つ用意して、それらが選択される都度に非表示の実行条件文を生成するテキストボックスのテキストを完成させる。フィルターの実行においては、それを参照すれば事足ります。ということで、先の回答の後半部分については訂正しておきます。 2、多重フィルターシステムを強いて開発するとすれば・・・  これは、テストしていませんので、あくまでも可能性として。それは、フォームのクローンを利用するというもの。この場合、第一次フィルターをかけたフォームをクローン化して更に第二次フィルターをかけるというアイデア。これでアマゾン流が実現できそうです。が、注意すべきはクローン化したフォームが第二次フィルターの実行時にデータベースを再参照するのかどうか?仮に、そうであれば多重検索することになります。狙い通りにデータベースの再参照なくフィルターが実行されれば目論見は成功。これは、質問者自身でテストされてください。私見では、そこまでは・・・と考えます。  以上、訂正と補足しておきます。なんせ、車検に出した車を取りに行く時間がとっくに過ぎているなかでのバタバタ回答で大変失礼しました。お詫びしておきます。

gosui
質問者

お礼

ありがとうございます! 教えて頂いたことを参考に以下のようなものを試しに作ってみたところ(サブクエリを知りませんでした…)、 なんとかイメージしたことができそうな感じがしています。 ありがとうございます。 それ違う!ということがあればご指摘いただければ幸いです。 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

gosui
質問者

補足

む、これだともしかすると戻すことができませんね。 もう一度よく考えてみます。

関連するQ&A

  • Access 壁にぶつかってます。助けて

    ACCESS VBAの記述でエラーになります。 教えてください。 Private Sub cmd抽出_Click() Dim db As DAO.Database Dim rs As DAO.Recordset Dim mySQL As Long '抽出条件 Set db = CurrentDb() 'レコードセットを作成 mySQL = "SELECT * FROM T_貸付明細 " _ & "WHERE 顧客ID ='" & Me!txtID & "';" Set rs = db.OpenRecordset(mySQL, dbOpenDynaset) 'サブ フォームに表示 Set Me!sub結果.Form.Recordset = rs ' Me!sub結果.Form!日付.ControlSource = "日付" Me!sub結果.Form!貸付.ControlSource = "貸付" Me!sub結果.Form!受領.ControlSource = "受領" Me!sub結果.Form!利息.ControlSource = "利息" Me!sub結果.Form!元金入金.ControlSource = "元金入金" Me!sub結果.Form!貸付残高.ControlSource = "貸付残高" Me!sub結果.Form!次支払日.ControlSource = "次支払日" End Sub 上記の記述で「型が一致しません」とエラーが出ます。 'レコードセットを作成 mySQL = "SELECT * FROM T_貸付明細 " _ & "WHERE 顧客ID ='" & Me!txtID & "';" ここの記述がLongになってない事の間違いだと察するのですが、正しい記述方法を教えていただけませんか。

  • Access VBAでのデータ抽出の仕方

    Access VBAでのデータ抽出の仕方 Access VBAでデータを抽出して、テキストボックスにデータを配置したいと思います。 Formにtxt1~txt10までのテキストボックスが10個あります。 テーブルからデータを引っ張ってきてレコードセットにいれます。 Dim objADOCON As ADODB.Connection Dim objADORS As ADODB.Recordset Dim strSQL As String Dim SQL As string SQL = "Select * from Table1" Set objADOCON = Application.CurrentProject.Connection Set objADORS = objADOCON.Execute(SQL) これでレコードセットを取得しました。このレコードセットは「ID」列があり、プライマリーキーを設定しています。またZAIKOという列もあります。 ID=001の時、在庫は100 ID=002の時、在庫は200 といったように条件を絞って、テキストボックスに値を入れたいと思います。 objADORS.Filter = "[ID] = '001'" txt1.value = objADORS!ZAIKO objADORS.Filter = "[ID] = '002'" txt2.value = objADORS!ZAIKO ..... を10回繰り返せば条件毎に値がセットするのはわかります。 ただし、あまりスマートなやり方ではなく、もっといい方法があるんじゃないかと思うのですが考えつきません。 何か良い方法、手段がありましたらお教え下さい。 よろしくお願いします。

  • Currentイベントを発生させない方法

    アクセスのForm_Openイベントで Me.Recordset.FindFirst "主キー = '" & str主キー & "'" のコードを実行するとForm_Currentイベントが発生してしまうのですが Me.Recordset.FindFirstコードを使っても、Form_Currentイベントを発生させない方法はありますか?

  • アクセスでコードを使って日付からレコードの検索ができません。

    Dim rs As DAO.Recordset Set rs = Me.RecordsetClone rs.FindFirst "生年月日 = #1968/05/03#" 上の場合は問題ないのですが、次の様に、捜そうとする日付を変数にするとどうしても rs.NoMatch = true になってしまいます。 どうしてでしょうか。アクセスは2002、OSは2000です。 Dim Abc As Date Abc = "1968/05/03" rs.FindFirst "生年月日 = " & Abc

  • Access VBAでの構文エラー

    Access2003を使って画像DBを作成しています。 VBAを利用して、AテーブルのidとBテーブルのidの一致を検索し、 検索結果を表形式の「検索結果Form」に表示するプログラムを 作成していますが、以下のコードをコンパイルすると 「構文エラー」が出てしまいます。 どなたか、解決策を教えてください。よろしくお願いいたします。 Dim objCon As DAO.Database Dim objRs As DAO.Recordset Dim strSQL As String Set objCon = Application.CurrentDb strSQL = " select * " _ & " FROM A, B " _ & " where A!id = B!id" Set objRs = objCon.OpenRecordset(strSQL, dbOpenDynaset) '他のフォームに検索結果を表示する方法 'もし検索結果が見つかった場合 If objRs.EOF = False Then MsgBox "見つかりました!", vbOKOnly, "結果" DoCmd.OpenForm "検索結果Form", , , strSQL '検索結果が見つからなかった場合 Else 'Me.txtAge.Value = vbNullString MsgBox "見つかりませんでした", vbOKOnly, "結果" End If objRs.Close

  • アクセス2000 二段階絞込み コマンドボタン使用

    はじめて投稿させていただきます、宜しくお願いいたします。 アクセスは初心者です。 現在はじめてシステムを作っているんですが、1つどうしても上手く出来ないことがあります。 二段階(もしくは三段階以上)絞込みを「コマンドボタン」を使用してやりたいんですが、 関係するスレをいろいろ探しても「コンボボックス」を利用するやり方の説明はよく見受けられますが、「コマンドボタン」でのやり方のスレを見つけるのに苦労しています。。。 どのように使っていきたいかの具体的内容は以下の通りです。 (1)親フォームに検索条件を入力して、 サブフォームで検索結果を表示する⇒これは一段階の絞込みであれば問題なく出来ています。 (2)問題はここでの二段階絞込みですが、 具体的には、、、 まず、親フォームのテキストボックスの検索条件に「品番」を入力し、それをサブフォームに結果を表示します。その時のコードは以下の通りです。 ※サブフォームの名前は「生産課マスタSub」です。   コマンドボタンの名前は「検索Cmd1」です。  テキストボックスの名前は「品番検索Txt」です。 Private Sub 検索Cmd1_Click() Me!生産課マスタSub.Form.FilterOn = True Me!生産課マスタSub.Form.Filter = "[品番] Like '*" & Me.品番検索Txt & "*'" End Sub 次に、テキストボックスで「品名コード」の検索をかけ、二段階に絞込みをし、それをサブフォームに反映させたいのです。 つまり、例えば品番「1997」をコマンドボタンで検索をかけ、サブフォームに表示させたあと、次に品名コード「C1997」で同様にコマンドボタンで検索をかけ絞り込めるようにしたいのです。 (そこから更に条件を追加してどんどん絞込みをかけていけたらと思いますが、、、) 出来ましたら、わかりやすく全体的なプロシージャを表記して説明していただけるとありがたいです。勉強不足で申し訳ありませんが、ご指導宜しくお願いいたします。

  • MSアクセスで抽出した結果が何もなかった場合

    こんにちは。コンボボックスに入力した言葉でフィルターをかけるため下記のように記載しました。 ヒットした場合は問題ないのですが、ヒットしなかった場合、エラーが出ます。ヒットしなくてもエラーとせず、”ありません”のようにメッセージを出すにはどのようにすればよいのでしょうか? 宜しくお願いします。 Dim rs As New ADODB.Recordset Dim cn As ADODB.Connection Dim DETA1(1 To 10) i = 1 Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset DBnm = Me.CYUSYUTSU.Value KI = Me.KeyWord2.Value rs.Open DBnm, cn, adOpenKeyset, adLockOptimistic '********************************************** rs.Filter = "Tget='" & KI & "'" TI = rs!管理番号 NM = rs!名前 Do Until rs.EOF DETA1(i) = rs!地域 i = i + 1 rs.MoveNext Loop

  • アクセスで3つのフィルターを連携させたい

    3つのコンボックスがあります Combo1 → 都道府県 Combo2 → 市区 Combo3 → 町村 都道府県と市区までは正常にフィルター出来るのですが、町村を選ぶと都道府県や市区も 同じ町村の名前のデータを引っ張ってきてしまいます。 ボタンを付けることも考えましたが、VBAの能力があまりないので、失敗ばかりしています。 良い知恵を教えて頂けないでしょうか。 Private Sub Combo1_AfterUpdate() Dim Strkubun As String Strkubun = Me.Combo1 Me.Filter = "[都道府県]= '" & Strkubun & "'" Me.FilterOn = True Me.Requery End Sub Private Sub Combo2_AfterUpdate() Dim Strkubun As String Strkubun = Me.Combo2 Me.Filter = "[市区]= '" & Strkubun & "'" Me.FilterOn = True Me.Requery End Sub Private Sub Combo3_AfterUpdate() Dim Strkubun As String Strkubun = Me.Combo3 Me.Filter = "[町村]= '" & Strkubun & "'" Me.FilterOn = True Me.Refresh End Sub

  • Access レコードの検索と追加

    日報というフォームに日付とリンクしたサブフォームを作成しました。 複数の人がデータを入力するのですが、日報フォームの日付は重複したくありません。 それで日付入力というテキストボックスを作成して、その日付と同じ日付を検索して、なければ新規のレコードを作成するというようにしたいと思っています。 Private Sub txt日付入力_AfterUpdate() Dim rs As DAO.Recordset Set rs = Me.Recordset.Clone rs.FindFirst "日付 = #" & Me!txt日付入力.Value & "#"  If rs.NoMatch Then   rs.AddNew  Else   Me.Bookmark = rs.Bookmark  End If rs.Close: Set rs = Nothing End Sub というようにしたのですが、新規のレコードを作成する部分がどうしても分かりません。 どなたか分かる方、よろしくお願いします。

  • アクセスのMoveLastの使い方について

    初めてアクセスでツールを作っています。 リストを登録するツールを作っており、フォームに入れた情報を 「テーブル」に登録する仕様となっております。 フォームを開く際、自動的にIDのフォームにID番号を採番したいです。 ID番号はリストを登録する「テーブル」を参照し、既存のレコードの最後の行を検索し 最後の行に+1をした番号を振るようにしました。 下記のようにプログラムを組み、最初のID:1、2、3まではフォームを開いた際に自動的に採番できました。 ところが次の4番目のデータを登録する際にフォームを開くと 何故かIDは3のまま表示されてしまいます。 デバックしたところ、Debug.Print rs!ID の箇所は何故か数字が2が入っております。 MoveLast でレコード末尾を参照しようとしているのですが、 何故か末尾であるはずの3にはなりません。 アクセスでこのようなツールを作るのは初めてになるため、原因がわかる方お願い致します。 Private Sub Form_Load() 'フォーム読み込み時にID番号を付与 Dim rs As New ADODB.Recordset Me.ID.Value = Null rs.Open "テーブル", CurrentProject.Connection If rs.EOF = True Then Me.ID.Value = 1 Else rs.MoveLast Debug.Print rs!ID Me.ID.Value = rs!ID.Value + 1 End If rs.Close End Sub

専門家に質問してみよう