こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

フォームから複数条件を指定してクエリを開く

win10 、アクセス2016です

フォームのテキストボックスに条件を記入して、この条件に基づき選択クエリ実行したいのですが、上手くいきません。
ご指導願います
条件入力フォーム名:フォームA
条件入力テキストボックス:txtMember
実際の入力条件:"日本 太郎" Or "東京 花子"
クエリのデザインビューで[氏名]フィールの抽出条件:[Forms]![フォームA]![txtMember]

これで選択が実行されません。
条件テキストを、直接デザインビューに入力すると上手くいきます。

何が、悪いのでしょうか。
ご指導よろしくお願いします。

投稿日時 - 2019-05-20 10:14:57

QNo.9618338

困ってます

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

クエリの抽出条件では無理だと思います。

> 条件テキストを、直接デザインビューに入力すると上手くいきます。
クエリをSQLビューで見れば分かると思いますが、
Access が 条件を編集しています。

Where フィールド1 = "日本 太郎" Or フィールド1 = "東京 花子"
のような感じに。

テキストボックスを条件にすると
「"日本 太郎" Or "東京 花子"」という人を検索することになりますね。

どうしてもクエリが必要ということなら VBA でクエリのSQL を書き換える、くらいしか思いつきません。

フォームやレポートに結果を表示したり、レコードセットを取得するとかなら、方法はあります。

例はこちら。

複数選択リストボックスで選択したレコードの印刷
https://hatenachips.blog.fc2.com/blog-entry-452.html
スペース区切りの複数ワードからWHERE句を組み立てるサンプル
https://tsware.jp/tips/tips_623.htm

あとは応用です。


以上、1つのテキストボックスに複数の検索条件を入力する場合の回答です。
解釈が間違っていたら後免。
No.1 さんの質問にきっちり答えていれば、もっと早く適切な回答が付いたでしょう。

投稿日時 - 2019-05-23 13:41:14

お礼

ありがとうございました。
深いです。ちょっと簡単には理解できませんが、勉強します。

ありがとうございました。

投稿日時 - 2019-05-24 14:57:23

ANo.7

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.8

一つのテキストボックスで複数のキーワード検索をするという場合、
どうしても初心者の場合は、テキストボックスに

  「"日本 太郎" Or "東京 花子"」

などと入力してデータを求めるということがありますが、
本来、クエリはその構造を確定させてから実行するものです。
したがって、抽出条件を複数にするならば、クエリの
デザインビューであらかじめ設定しておく必要があります。


(1)

質問の"日本 太郎" Or "東京 花子"の「日本 太郎」と
「東京 花子」は二つの条件をOrで抽出したいということですが、
これら二つの条件は本来はパラメータとして設定するべき
もので、たとえばクエリの抽出条件に、

   [一番目の名前] Or [二番目の名前]

と設定し、クエリを開くとパラメータのダイアログを現れ、
「一番目の名前」という表題のダイアログに「日本 太郎」
と入力し、OKを押すと「二番目の名前」という大ログが
現れ、「東京 花子」と入力すると「日本 太郎」と
「東京 花子」のデータが表示されます。この

   [一番目の名前] Or [二番目の名前]

という二つのパラメータをフォームに設定した二つのテキストボックス
「txtMember1」と「txtMember2」に置き換えると

Like "*" & [Forms]![フォーム2]![txtMember1] & "*" Or Like "*" & [Forms]![フォーム2]![txtMember2] & "*"

のように、抽出条件を設定します。
このようにするのが本来の(?)のというか最初の段階の複数条件でのクエリの
作成方法です。ここでは検索に何かと便利なあいまい検索にしてあります。
これだとフルネームでなくても「太郎」とか「日本」という語句を含む
データが表示されます。ただし、一方でも入力がないとすべてのレコードが
表示されます。
ここまでが、第一段階+αです。


(2)

第二段階は、途端に面倒くさく、難しくなります。そこで質問に対する
そのままの回答として、クエリのデザインビューで新しいフィールドに

  Eval(BuildCriteria("'" & [氏名] & "'",10,"*" & Replace([Forms]![フォーム1]![txtMember],",","* Or *") & "*"))

と、入れ、抽出条件に

   -1

と入れ、保存します。クエリをデザインビューでもう一度
開き、表示にチェックが入っていればチェックをはずして
保存してください。
このときほかのフィールドに

>クエリのデザインビューで[氏名]フィールの抽出条件:[Forms]![フォームA]![txtMember]

などと入れないでください。フォームを開き、テキストボックスにカンマ切りで、


     日本 太郎,東京 花子

と入力し、クエリを開けばデータが表示されます。
また、

     日本 太郎,東京 花子,大阪 鯉太郎

と入力すれば、カンマ切りした語句のデータが表示されます。つまり、抽出の
条件をいくつでも設定できます。この場合は「Or」条件で設定しています。
これだけでは何をしているのか見当がつかないでしょうが、質問の回答としては
これが一番簡単な設定です。


(3)
ということで、三番目は・・・ということになれば、
質問の最初の回答の補足に、

>本当は、リストボックスより氏名を選択して、抽出しようとしています。

とのことでしたが、以下に似た質問の回答があります。まずは
これを読んで理解できるかどうかです。

https://okwave.jp/qa/q6100323.html

ほかにも、いくつかの検索に関する例は、

https://okwave.jp/qa/q5955866.html

こちらは、(2)のBuildCriteriaという関数を用いた例、これが(2)の
ところにくるようなものであるかもしれません。

https://okwave.jp/qa/q5465236.html




まだ、たくさんありますが、わからないところがあれば補足して
ください。

投稿日時 - 2019-05-23 18:11:26

お礼

細かく、ご指導のほど、ありがとうございました。
一読では当方には理解に及びませんが、熟読して、理解してみます。
ありがとうございました。

投稿日時 - 2019-05-24 14:55:34

ANo.6

補足です
★テーブルにはあなたがやろうとした機能【並び替え、条件抽出】は出来てます
テーブルを実行形式で開いてください。
各項目名の右端の▼がそれです。
これをクリックすると確認できます。
 ルックアップを定義すると画面高さまでのコンボボックスが可能です。
 因みに私は48行で使っています。
★メニューフォームのレコードソース を1レコードだけの
 「プロフィール」テーブルとします。
★プロフィールのフィールド
・会社名
・住所
・消費税率
・期初月
★非連結の日付関連ボックス
・基準日
・月初日
・月末日
・期初日
・期末日
これらのボックスは基準日が決まれば、他の日付はVBAで処理できます。

それではフォーム設計のQを楽しみにしてます。

投稿日時 - 2019-05-22 22:09:15

ANo.5

>[Forms]![フォームA]![txtMember].[Text]を
★[Forms]![フォームA]![txtMember]![Text]と変更して下さい。

★最終的にはフォームAをメニューと改名して
このフォーム上に 色々なボックスを配置して、これらのボックスのイベントで
テーブル、クエリ、フォーム、レポートを開きます。
※ ボックスはコマンドボタンに限らず
ラベルボックス、コンボボックッス,テキストボックス等のイベントで開きます。
例えば「名簿登録」のラベルボックスのクリックイベントで
名簿登録フォームを開くには
--------------------------------
Private Sub 名簿登録_Click()
DoCmd.OpenForm "名簿登録"
End Sub
---------------------------------
★アクセスファイルを開いたとき最初に開くフォームを一つ定義できます
ファイル→オプション→現在のページ→ メニュー

投稿日時 - 2019-05-22 16:35:27

補足

分かりました。
訂正して再度チャレンジしてみます。

投稿日時 - 2019-05-24 14:33:29

ANo.4

>(5)クエリのデザインビューで「実際の入力条件」の文字列を
 直接打ち込むと、選択結果は、正しいレコードが選択されます。
★これはクエリのフィールドのデータ型がテキスト型です
 txtMemberのデータ型も同じテキスト型ですか

投稿日時 - 2019-05-21 20:05:43

補足

テキスト型です。
適当かどうかわかりませんが、クエリでデザインで、
氏名フィールドの抽出条件に
[Forms]![フォームA]![txtMember].[Text]
としても同様に、抽出できません。

投稿日時 - 2019-05-22 08:20:44

ANo.3

>(4)クエリを開くとレコード数0となります。
★[フォームA]に[フォームA]にテキストボックス[txtMember]がありますか
 添付(1)
 このフォームを開いて、このボックスに検索値()を入力した後クエリーを開きます
 条件入力テキストボックス:txtMember
 条件情報("日本 太郎" Or "東京 花子")を入力

★クエリ
 添付(2)
 (3)フィールドを列にドラッグで展開しますが、
  このようにワイルドカード(*)が使えます
  氏名は検索条件設定の為の配置(*)と重複表示になるため
  (5)のチェックを外します

 クエリのデザインビューで[氏名]フィールの抽出条件:[Forms]![フォームA]![txtMember]
  ここはコピペせずに、Forms!と入力してください、次の候補がListされます
  このようにAccessには、ナビ機能があります。
 (4)これ以下の行が検索条件設定に使います。
  複数行に設定するとOr条件、複数の列に設定するとAnd条件
               表示?を外せばフィールドを複数配置できる         
  条件はフィールド名の他 フィールド名+(<、=<、>、=>、<>)

投稿日時 - 2019-05-21 17:56:37

補足

ご指導いただいた、とおりにしているはずなのでが・・・
どうしても、実現できません。

投稿日時 - 2019-05-22 08:38:28

ANo.2

>フォームのテキストボックスに条件を記入して、
 この条件に基づき選択クエリ実行したいのですが、ご指導願います
 条件入力フォーム名:フォームA
 条件入力テキストボックス:txtMember
 実際の入力条件:"日本 太郎" Or "東京 花子"
 クエリのデザインビューで[氏名]フィールの抽出条件:[Forms]![フォームA]![txtMember]
 これで選択が実行されません
★実行順序が間違えていませんか

 1.フォームAを開く
 2.txtMemberに検索値を入力
 3.クエリを開く
尚、検索値を変更するとクエリを閉じて開き直す。

投稿日時 - 2019-05-20 21:34:06

補足

申し訳ありません。ご指摘のおとりの順番で記述しているつもりです。
(1)フォームを開く
(2)リストボックスの選択データが、テキストボックスに反映される.
これは、上記質問の「実際の入力条件」のとおりとなります。
(3)すでに、クエリの条件は、当該フォームのコントロールを指定してます。
(4)クエリを開くとレコード数0となります。
(5)クエリのデザインビューで「実際の入力条件」の文字列を直接打ち込むと、選択結果は、正しいレコードが選択されます。

投稿日時 - 2019-05-21 14:52:31

ANo.1

質問の意味(下記)を、補足しておいた方がよいのでは。
質問表題からは、1名の名前を入れて、その名前で選択(SELECT)するのかと思ったが、質問本文では、"日本 太郎" Or "東京 華子"と2名、ないし複数名の例になっている。1つのテキストボックスに、複数名の名前を何かのDelimiterで区切って入れるのか?。また"”を入れるのか。
コンピュターの関連の質問は厳密に書かないとダメだよ。
普通は5個ぐらいの氏名のテキストボックスを作って、氏名を入れさせるのではないのかな。

投稿日時 - 2019-05-20 14:39:02

補足

申し訳ありませんでした。
本当は、リストボックスより氏名を選択して、抽出しようとしています。
ですが実行しようとしてもできなかったので、あえてテキストボックスを作って、そこにリストボックスの選択氏名を記述してテストしています。

投稿日時 - 2019-05-20 15:27:30

あなたにオススメの質問