- 締切済み
(続き)accessでの2段階クエリの作り方
お世話になります。 accessで下記の質問を立てましたが、解決できなかったので再度質問いたします。 (http://okwave.jp/qa/q6890851.html) 下記に説明をしています、分かりにくいかもしれません。。 どうぞご指導をお願い致します。 ◆DBの構成◆ 1)テーブル名:名簿(フィールドは下記の通り) ID,名前1、名前2(担当者名)、ふりがな、住所、電話、住所1、住所2(マンション名等)、備考等) 2)フォーム名:検索フォーム デザインビューで初めから作成して、テキストボックスを1つ作っています。 名前は『キーワード検索ボックス1』です。 またテキストボックスの下に検索をしてヒットした名簿を表示するサブフォームを入れています。 3)サブフォームのクエリ ・元データ ⇒名簿のテーブル。全フィールドを挿入して作成。 メインフォーム内のサブフォーム名は『(sub)キーワード検索』 ・抽出条件 ⇒フィールドの『名前1』、『名前2』、『ふりがな』、『住所1』、『住所2』、『備考』の抽出条件欄に 1行ごとずらして、『Like & "*" & [Forms]![検索フォーム]![キーワード検索ボックス1] & "*" とした。 ・マクロ ⇒メインフォームのテキストボックスの隣に検索という名前をつけたボタンを配置。 マクロは再クエリでコントロール名を『(sub)キーワード検索』とした。 ボタンのプロパティのイベントタブでクリック時に上記のマクロが実行されるように登録した。 ◆やりたい事◆ accessで会社の顧客名簿を作成しました。 今の状態は1個のキーワードだと検索結果がサブフォームに表示されます。 それを、2段階で絞りこんでいく方法を探しています。 テキストボックスをもう一個作り、2個のキーワードで絞りこみたいです。 まず、1個のキーワードで『名前1』、『名前2』、『ふりがな』、『住所1』、『住所2』、『備考』のフィールドを検索してヒットしたものをサブフォームで表示させる。さらにそこから、また任意のキーワードを 『キーワード検索ボックス2』に入力してボタンをクリックすると、同じサブフォーム(または別のフォームに)絞りこみ検索結果が表示されるようにしたい。またVBAは苦手なので、クエリで解決をしたいです。 ◆出来たこと、出来なかった事◆ ・質問NO(6890851)で指導を頂いた、chuparkさんのある一つのフィールドに 『Like "*" & [Forms]![検索フォーム]![名前検索1] & "*" And Like "*" & [Forms]![検索フォーム]![名前検索2] & "*"』と入れると、そのフィールドに対しては2個のキーワードがヒットするとサブフォームに表示される事が出来た。 ⇒これだと1つのフィールドに対してなので、やりたい事ではない。 1つのフィールドだけでなく、検索したいフィールド全てに対してまず1個のキーワードで 検索されたものを表示させ、そこから更にキーワードを検索して表示させたい。 ・クエリに新しいフィールドを作りました。そこは全てのフィールドを『&』で結び、 抽出条件にchuparkさんの条件を入れてました。 ⇒これだと一度に2個のキーワードを検索してしまう。1回目と2回目を比較もしたいので、一度ではなく、段階を踏んで検索が出来ない。また、フォーム自体を開いた時にサブフォームが真っ白になり メッセージも出て見辛い。。(どんなメッセージが忘れました…) 以上
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- piroin654
- ベストアンサー率75% (692/917)
No1、No2です。質問で 3)サブフォームのクエリ ・元データ ⇒名簿のテーブル。全フィールドを挿入して作成。 メインフォーム内のサブフォーム名は『(sub)キーワード検索』 ・抽出条件 ⇒フィールドの『名前1』、『名前2』、『ふりがな』、『住所1』、『住所2』、『備考』の抽出条件欄に 1行ごとずらして、『Like & "*" & [Forms]![検索フォーム]![キーワード検索ボックス1] & "*" とした。 ということなので、No1の(1)は同じ事なのでそのままクエリを使ってください。
- ksd_hiro
- ベストアンサー率76% (29/38)
>◆やりたい事◆ > accessで会社の顧客名簿を作成しました。 > 今の状態は1個のキーワードだと検索結果がサブフォームに表示されます。 > それを、2段階で絞りこんでいく方法を探しています。 > テキストボックスをもう一個作り、2個のキーワードで絞りこみたいです。 > まず、1個のキーワードで『名前1』、『名前2』、『ふりがな』、『住所1』、『住所2』、『備 >考』のフィールドを検索してヒットしたものをサブフォームで表示させる。さらにそこから、 >また任意のキーワードを >『キーワード検索ボックス2』に入力してボタンをクリックすると、同じサブフォーム(また >は別のフォームに)絞りこみ検索結果が表示されるようにしたい。 ご希望の事は、クエリを2重にして作成すればVBAを使わなくても、クエリと再クエリのマクロだけで可能です。 サブフォームのレコードソースのクエリ名が記載されていないので、仮に「Q_検索」としておきます。 この「Q_検索」のコピーを作成し名前を「Q_検索2」に変更し、デザインビューで、以下を修正変更して保存します。 1.テーブルの表示から、「Q_検索」を追加し、デザインビュー下側のデザイングリッドのテーブルの名称を全て、「名簿」から「Q検索」に変更します。 2.デザイングリッドの抽出条件の、 Like "*" & [Forms]![検索フォーム]![キーワード検索ボックス1] & "*" の[キーワード検索ボックス1]の部分を全て[キーワード検索ボックス2]に変更します。 3.デザインビュー上側のフィールドリストエリアから、「名簿」テーブルを削除します。 次に、サブフォームをデザインビューで開き、レコードソースを「Q_検索」から[Q_検索2]に変更して保存します。 以上で目的の抽出が可能だと思います。
- piroin654
- ベストアンサー率75% (692/917)
もうついでだから、少し便利に? ボタンを二つ追加します。 名前 標題 cmdすべて表示 すべて表示 cmd検索開始 検索開始 上記を設定したら、フォームの コード表に以下を貼り付け保存してください。 「クエリ名」はサブフォームのレコードソース になるクエリです。実際に合わせて変更してください。 Private Sub cmdすべて表示_Click() Me.埋め込み0.Form.RecordSource = "名簿" Me.埋め込み0.Form.Requery End Sub Private Sub cmd検索開始_Click() Me.埋め込み0.Form.RecordSource = "クエリ名" Me.埋め込み0.Form.Requery End Sub 使い方は、「すべて表示」をクリックすると サブフォームのレコードソースが「名簿」に置き換わり、 サブフォームに全データが表示されます。 「検索開始」をクリックするとサブフォームの レコードソースがクエリに置き換わり、検索 できるようになります。 必要なら設定してみてください。 なお、サブフォームのレコードソースは 初期値はクエリのままでいいです。
- piroin654
- ベストアンサー率75% (692/917)
いろいろ考えてみましたが、やはりVBAを使わないと 簡単にはいきそうもありません。VBAといっても それほど大変なことではないので一応方法を あげておきます。 (1) クエリの抽出条件に Nz([Forms]![検索フォーム]![キーワード検索ボックス1]) を入れていきます。そのとき上記を フィールド|名前1 |名前2 |ふりがな テーブル | | | 並び替え | | | 表示 | | | 抽出条件 |入れる | | または | |入れる | | | |入れる のように重ならないようにいれていってください。 クエリのSQL文ではOrでつながっていきます。 (2) フォームにボタンを三つ設定します。 それぞれプロパティで、名前、標題を 名前 標題 cmd抽出1 抽出1 cmd抽出2 抽出2 cmdフィルタ解除 フィルタ解除 のように設定してください。 (3) 以下をメインフォームのコード表に貼り付け 保存してください。 なお、以下のコード中で 「埋め込み0」 とありますが、これはサブフォームを表示しているコントロール名で サブフォームそのものの名前ではありません。初期値は「埋め込み0」 のような名前で登録されます。 Private Sub cmd抽出1_Click() Me.埋め込み0.Form.Requery End Sub Private Sub cmd抽出2_Click() Dim str As String Dim strFilter As String str = Me!キーワード検索ボックス2 strFilter = " 名前1 Like '*" & str & "*' Or 名前2 Like '*" & str & "*' Or ふりがな Like '*" & str & "*' Or 住所1 Like '*" & str & "*' Or 住所2 Like '*" & str & "*' Or 備考 Like '*" & str & "*'" Me.埋め込み0.Form.Filter = strFilter Me.埋め込み0.Form.FilterOn = True End Sub Private Sub cmdフィルタ解除_Click() Me.埋め込み0.Form.FilterOn = False End Sub (4) 使い方は、 テキストボックスにデータを入れ、ボタンをクリックしていきます。 抽出2まで済むと、フィルタ解除のボタンをクリックすると、 抽出1のデータが表示されます。抽出2のボタンをクリックすると 再び抽出2のデータが表示されます。 わからないところがあれば補足してください。