• ベストアンサー

Accessの検索フォーム

またまたAccessについての質問です。 検索フォームというのを作りました。 テーブルのデータから条件に合うものだけを抽出したいのです。 たとえば1つ目の検索フォーム[A]のテキストボックスに「AAA」を入力します。 そのあとBには「BBB」と入力します。 同じくCには「CCC」と入力します。 そして絞込みボタンを押したらAAAでBBBでCCCのものが抽出されます。 これはうまくいきました。 とりあえず、複数条件なので、わけもわからず「&」で結んでしまいました・・・。 ↓は絞込みボタンのクリック時です。↓ 困ったのは、すべて検索条件を指定しない場合です。 たとえば「AAA」で「CCC」のものを抽出したいとき、[A]のテキストボックスに「AAA」と入れ [C]のテキストボックスに「CCC」と入れます。 そして絞込みボタンをクリック。 するとBが未記入だからか、抽出されたのは真っ白でした・・・。 Option Compare Database Private Sub コマンド50_Click() Me.Filter = "契約='" & Me!テキスト51 & "'and A='" & Me!テキスト57 & "'" Me.FilterOn = True End Sub 組み合わせが自由になる検索フォームにするにはどうすればよいのでしょうか? 誰か助けてくださ~い!

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

  • ベストアンサー
  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.6

>ところが、「A」と「B」というような「契約」が入ってない条件で抽出すると・・・真っ白になりました。 なぜなのでしょうか??? 「契約」の入力の有無にかかわらず、抽出条件に指定されているためです。 ここの部分です。 sFilter = "契約='" & Me!テキスト51 & "'" 入力がないときに抽出条件から外したいのなら、 sFilter = "" IF IsNull(Me!テキスト51) = False Then  sFilter = "契約='" & Me!テキスト51 & "'" End IF としなければなりません。 ただ、これだと「契約」が未入力のとき、sFilterの内容は、 「and A='xxxxx' and B='yyyyy'」 のように、「and」から始まってしまいます。 これではエラーになります。 対策として、ダミーの条件をいれましょう。 つまり、 sFilter = "1=1" IF IsNull(Me!テキスト51) = False Then  sFilter = "and 契約='" & Me!テキスト51 & "'" End IF というようにします。 こうすると、sFilterの内容は、 「1=1 and 契約='qqqqq' and A='xxxxx' and B='yyyyy'」 もしくは 「1=1 and A='xxxxx' and B='yyyyy'」 のようになります。 できるだけ仕組みを覚えてくださいね。 そうしないと、直すことができないですよ。

ringo0120
質問者

お礼

ありがとうございます。 がんばってやってみます。 いろいろ本を読んだりしたのですがいまいち分からなくて・・。 何かオススメの本があったらまた教えてください。 ほんとにありがとうございました。

その他の回答 (5)

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.5

#3です。 >(初心者なもので、基本的な質問ですみません) なるほど。。。 少し、解説しておきます。 ●意味がわかれば簡単です ・「Me」は自分のフォームを指しています。 ・「Me.A」とすると「このフォームの中にあるAという名前のコントロール」となります。 ・「If IsNull(Me.A) = True Then」は、「Aというコントロールに入力がなかったら」となります。  (「End If」まで実行されます) ●テキストボックスの名前は関係あります。  修正・変更などのように、後で見るときのために、適切な名前に変えておくといいでしょう。  今の状態だと、  If IsNull(Me.A) = True Then   sFilter = sFilter & " and A='" & Me.A & "'"  End IF  は、  If IsNull(Me.テキスト57) = True Then   sFilter = sFilter & " and A='" & Me.テキスト57 & "'"  End IF  のようになります。  (上のコードは、全角スペースを入れたので、コピペできません)  *回答したときには、名前に気が付かなかったので、申し訳ないです。  そのまま貼り付けただけだと、「コントロールがありません」とかいうエラーが  でそうな気がしますけど。。。何故?  わからない箇所があれば、また聞いてください。

ringo0120
質問者

お礼

何度も何度もご親切にありがとうございます! 今から仕事に行ってやってみます! また夜に報告します。 ありがとうございました(^-^)

ringo0120
質問者

補足

お久しぶりですみません。 あれからやってみたのですが、90%はできました!! 「契約」と「A」の組み合わせとか、「契約」と「B」の組み合わせとか、「契約と「A」と「C」の組み合わせでうまく抽出できました。 ところが、「A」と「B」というような「契約」が入ってない条件で抽出すると・・・真っ白になりました。 なぜなのでしょうか??? またよろしくお願いします。

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.4

#3です。 そうですね。同じようにすればOKです。 (全く同じではでないですけど) 次のような感じになります。 'テキストボックスC If IsNull(Me.C) = False Then sFilter = sFilter & " and C='" & Me.C & "'" End IF の後ろに次のコードを追加します。 'テキストボックス(開始日付) If IsNull(Me.txStartDate) = False Then sFilter = sFilter & " and " & Me.txStartDate & "<=date" End IF 'テキストボックス(終了日付) If IsNull(Me.txEndDate) = False Then sFilter = sFilter & " and date<=" & Me.txEndDate End IF ただし、 ・txStartDateは開始日付のテキストボックス ・txEndDateは終了日付のテキストボックス ・dateはテーブルの日付フィールド名 ・日付のフィールドが、どのように定義されているか不明なので、  上記のコードのままではうまくいかない可能性はあります。  その場合、日付フィールの型に合わせた記述をする必要があります。 を表しています。 また、開始日付と終了日付は一方のみの入力で動作します。

ringo0120
質問者

補足

またまたありがとうございます! 昨夜から帰ってやってみたのですが、いろいろ触ったからでしょうか?うまく出来ていた検索ができなくなってしまいまいした・・・(;;) 「契約」のところはうまく絞り込んでくれるのですが、「A」のボックスのみに入力して絞り込みをしたら 真っ白になってしまいました~・・・。「B」も「C」も同じく絞り込めません。 「契約」に入れて、「A」(またはB/C)に入れて、ふたつ絞り込み条件を入れると「契約」の中の「A」が表示されるはずなのに、「契約」のみが絞り込まれます。 テキストボックスの名前とか関係あるんですか? (初心者なもので、基本的な質問ですみません) いろいろ書き直したので、前回「回答!」に書いて下さってたのをそのままコピーして貼り付けました。 Private Sub コマンド50_Click() Dim sFilter As String sFilter = "契約='" & Me!テキスト51 & "'" 'テキストボックスA If IsNull(Me.A) = True Then sFilter = sFilter & " and A='" & Me.A & "'" End IF 'テキストボックスB If IsNull(Me.B) = True Then sFilter = sFilter & " and B='" & Me.B & "'" End IF 'テキストボックスC If IsNull(Me.C) = True Then sFilter = sFilter & " and C='" & Me.C & "'" End IF Me.Filter = sFilter Me.FilterOn = True End Sub それぞれのテキストボックスのプロパティの名前のところには A テキスト57 B テキスト65 C テキスト67 D テキスト69 となっています。 またぜひよろしくお願いします。 ほんとにすみません~・・・。

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.3

単純に、入力がなければ、条件に加えないようにしたらどうでしょうか? Me.Filterに設定する内容を予め作っておきます。 Private Sub コマンド50_Click() Dim sFilter As String sFilter = "契約='" & Me!テキスト51 & "'" 'テキストボックスA If IsNull(Me.A) = True Then sFilter = sFilter & " and A='" & Me.A & "'" End IF 'テキストボックスB If IsNull(Me.B) = True Then sFilter = sFilter & " and B='" & Me.B & "'" End IF 'テキストボックスC If IsNull(Me.C) = True Then sFilter = sFilter & " and C='" & Me.C & "'" End IF Me.Filter = sFilter Me.FilterOn = True End Sub

ringo0120
質問者

お礼

ありがとうございます!! うまくいきました!! それと・・・もうひとつ質問なんですが・・・。 日付○日~○日、も選びたいんですが、同じようにすれば良いのでしょうか? よろしくお願いします。

  • H-black
  • ベストアンサー率35% (26/73)
回答No.2

私の場合もクエリですけれど、ringo0120さんのおっしゃる「テキスト51」の前後にワイルドカード「"*"」をつけて&で繋げています。あとNull記述もしてますね。 こんなカンジです。 Like "*" & [forms]![フォーム名]![テキスト名] & "*" Or Is Null これを各抽出条件に入れています。 検索条件が多い場合にクエリの抽出条件の列が1列で済むので重宝してます。書くのめんどくさいですけどね。

ringo0120
質問者

お礼

ありがとうございます! ワイルドカード、私も最初やったのですが、どうもうまくいきませんでした。 H-blackさんの言うように書いてみるとできました! なので、もうひとつの巨大検索フォームに使わせてもらいました~!!(^-^) ありがとうございました!

  • yamutya
  • ベストアンサー率15% (3/20)
回答No.1

クエリでうまくできます。 フォームにテキストボックス入力窓を3つ開け クエリの抽出条件の欄にそのフォームの入力窓を入力して行きます。一行目は A と BとCを同じ行に 2行目はAとB 3行目はAとC 4行目は BとC 5行目はA 6行目はB 7行目はCと7行に分ければいいでしょう。アンド ではなくて オア で検索されるので 入力のない欄があってもだいじょうぶです 

ringo0120
質問者

お礼

ありがとうございますーー!! この方法、簡単だし、うまくできました!! なので、これも検索フォームに使わせてもらいます!! ほんとにありがとうございました!!