• ベストアンサー
  • すぐに回答を!

クエリーの抽出条件について

「作表条件」というフォームにテキストボックスとして「日付1」、「日付2」を設置しています。 元のテーブルには「日付」という項目があり、「日付1」から「日付2」までのデータを抽出するため、 クエリの条件式に Between Nz([Forms]![作表条件]![日付1],#1800/01/01#) And Nz([Forms]![作表条件]![日付2],#9999/12/31#) と記述しています。 ただ、元のテーブルの日付がNULL値の場合があり、その場合「日付1」および「日付2」が空欄だとNULL値のレコードが抽出されません。 「日付」がNULLの場合でも抽出できるようにするには、どのようにすればよいでしょうか? どなたか教えてください。

共感・応援の気持ちを伝えよう!

  • 回答数7
  • 閲覧数1272
  • ありがとう数7

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

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

No.5です。 > 少なくとも一方が空白以外なら指定範囲のものを抽出 > 双方が空白なら『日付』がNullを含むすべてのものを抽出 了解しました。 とりあえず、フォームのヘッダ(またはフッタ)に『日付1』『日付2』の テキストボックス、及び、抽出を実行させるための『実行』コマンド ボタンが設置されている場合は以下のようになります。 '『実行』コマンドボタンのクリック時イベント Private Sub 実行_Click() On Error Goto エラー処理   '日付1・日付2の評価結果などを記録するための変数を用意   Dim sDate1 As String, sDate2 As String, sRS As String   'レコードソースに使用するテーブル/クエリの名前を定数として用意   Const conTableName As String = "テーブル1"   Const conQueryName As String = "クエリ1"   '日付1・日付2の入力状況を確認   '(後で使用するLen関数は、引数がNullだと演算結果も0では   ' なくNullになってしまうため、Nullを予め空文字に変換)   sDate1 = Nz(Me!日付1, "")   sDate2 = Nz(Me!日付2, "")   '入力状況で場合分け   Select Case True     Case Len(sDate1), Len(sDate2)       '少なくとも一方が空白以外       '(Len関数の結果が0以外なら、Trueとみなされます)       sRS = conQueryName     Case Else       '双方が空白の場合       sRS = conTableName   End Select   'レコードソースを切替   Me.RecordSource = sRS 終了処理:   Exit Sub エラー処理:   'エラー発生時は、エラー内容を表示の上、処理を中止   MsgBox Err.Number & ":" & Err.Description, , Me.Name & " 実行"   Resume 終了処理 End Sub ・・・以上です。 なお、変数や定数を設置せず、いっぺんに処理を行ってしまうなら、 以下のようにも書けます(更にエラー処理も省略)。 『日付1』の値などを繰り返し使う場合(→例えばクエリを用意する 代わりに、VBAでレコードソースに直接SQL文を適用する、等)は 上記のようにした方が効率的ですが、今回はこちらでもOkかと・・・ ※こちらではLen関数を使用せず、「&」での結果が「""」(空文字)   かどうかで判定しているため、テーブル/クエリの出てくる順序が  逆になっているので注意してください(汗) Private Sub 実行_Click()   If (Me!日付1 & Me!日付2 & "") = "" Then     '双方が空白     '※最後の「 & ""」がないと、「""」ではなくNullになり、     '  正しく判断されなくなるので注意     Me.RecordSource = "テーブル1"   Else     '少なくとも一方が空白以外     Me.RecordSource = "クエリ1"   End Select End Sub

共感・感謝の気持ちを伝えよう!

質問者からのお礼

詳しくご説明いただきありがとうございます。 早速参考にさせてもらいます。

関連するQ&A

  • Accessクエリの抽出条件にフォームから挿入する方法(2)

    フォームにいくつかの抽出条件を指定するためのテキストボックスをセットし、そこに入力されたデータをクエリの抽出条件に挿入しデータ抽出を行っておりますが、たとえば販売期間でデータを抽出するために、クエリの抽出条件に Between [Forms]![フォーム名]![売上日FROM] And [Forms]![フォーム名]![売上日TO]と入力しているのですが、テキストボックスに指定日付が入っていれば問題なく抽出できるのですが、販売期間の指定なしの場合、売上日from及び売上日TOがNULLとなるためか抽出結果がゼロ件になってしまいます。 期間指定なしの場合でも抽出ができるようにするためにはどのように記述すればよいか教えてください。よろしくお願いいたします。

  • 選択クエリでの複数抽出条件の記述について

    フォーム上に「テキストボックス」、「コンボボックス」、「チェックボックス」の項目があって、それぞれの条件に合致した、データを抽出する選択クエリを書いてるのですが、うまく抽出してくれません。 「テキストボックス」、「コンボボックス」には、[Forms]![テーブル名]![入力するボックスの名前] or 、[Forms]![テーブル名]![入力するボックスの名前] is nullと記述しています。 「チェックボックス」には、、[Forms]![テーブル名]![チェックボックスの名前] = True or [Forms]![テーブル名]![チェックボックスの名前] = Falseと記述しています。 しかしながら、任意のコンボボックスからテキストを選択し、チェックボックスにレのついたデータを抽出したくても正しいデータを表示してくれません。 どなたか、クエリに詳しい方よろしくお願いいたします。

  • フォームからクエリの抽出条件を入力する方法

    既存のデータベースより複数のテーブルを結合し、必要なカラムだけを表示させるようなクエリを作成しました。 他の人でも操作ができるように、フォームを作成し、テキストボックスにて抽出条件を指定し、クエリやレポートを出力するような形にしたいと思っています。 このクエリの抽出条件をフォームより指定する方法で悩んでいます。 現在、作成したクエリの抽出条件の中に [Forms]![フォーム名]![テキストボックス名] と入力し、フォームのテキストボックスで抽出条件を記入してクエリを実行させているのですが、これでは複雑な条件 (Between~ や 条件1 or 条件2 等の指定) を入れると「直前の操作はキャンセルされました」とポップアップが出てしまい、思うとおりにうごきません。 フォーム内でこのような抽出条件範囲の指定ができるようにするにはどうしたらよろしいでしょうか? よろしくおねがいします。

その他の回答 (6)

  • 回答No.7
  • layy
  • ベストアンサー率23% (292/1222)

片方に値がないかもしれない、ことより、必ず2つの日付に値があるとき検索、と考える方がはっきりします。 自=値あり、至=値あり 自=値あり、至=値なし 自=値なし、至=値あり 自=値なし、至=値なし 片方に値なし、はある方の値代入でよい。 2~4は問題なく検索 2~は2~2と同意、 ~4は4~4と同意、 双方無しは警告。 至は自があってこその値入力とすべき。 今回は、入力チェックでの対応と思います。

共感・感謝の気持ちを伝えよう!

  • 回答No.5

>「日付1」および「日付2」が空欄だとNULL値のレコードが > 抽出されません。 ご希望の動作は、テキストボックスが   少なくとも一方が空白以外なら指定範囲のものを抽出   双方が空白なら『日付』がNullのものを抽出 ということでよろしいでしょうか。 上記推測でよろしければ、以下の方法でできます。 (方法1はクエリのみの対応で済むが抽出速度が鈍化、  方法2は抽出が比較的早いがマクロ又はVBAが必要) 【方法1】クエリにOr条件を追加する 1)当該クエリをデザインビューで開く 2)空白になっている『フィールド』欄に、以下の式を入力  IsNull([Forms]![作表条件]![日付1] & [Forms]![作表条件]![日付2])  ※入力を終了すると、先頭に「式1: 」が追加されます。 3)今追加した列の『表示』チェックボックスをオフに設定 4)『日付』フィールドに指定している「Between Nz(~)」の  すぐ下の枠に「Is Null」を入力 5)「2」で追加した列の、「Between Nz(~)」と同じ行に  「False」を入力 6)同じく列の、「Is Null」を入力したのと同じ行に「True」を  入力 7)クエリを保存して閉じる 【方法2】フォームのレコードソースを差し替える 現在作成済みのクエリの他に、新たに、『日付』フィールド の抽出条件に「Is Null」を指定したクエリを作成しておいて 下さい。 これを、マクロ又はVBAで、フォームのレコードソースとして 使用します。 ※マクロなら『値の代入』アクションで、『式』にクエリ名を、  『アイテム』に「[Forms]![作表条件].[RecordSource]」を  指定します。  VBAで、当該フォームへの記述なら、「Me.RecordSource」  でもOkです。  (これについては、必要なようでしたら補足説明します:   その際はマクロ/VBAどちらを使用しているかお報せ下さい) ・・・以上です。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

具体的なご返答誠にありがとうございます。 希望の動作は   少なくとも一方が空白以外なら指定範囲のものを抽出   双方が空白なら『日付』がNullを含むすべてのものを抽出 ということです。 説明不足ですいません。 結局、良く考えたら日付は必要なので、必須入力項目にしてNULL値を許さない方向で考えたいと思います。 ただ、参考のために、よろしければVBAを使った方法についてもう少し詳しく補足いただけませんでしょうか?

  • 回答No.4
  • MRT1452
  • ベストアンサー率42% (1392/3296)

#2です。 UNIONを使えばと書きましたが、確かにNo3の方のように段階を踏むというやりかたでも良いと思います。 あまりデータベースの扱いになれていないのであればNo3の方のやり方の方が視覚的にわかりやすいでしょう。 Accessですので、クエリを組み合わせて実現することも可能です。 つまり、 (1)NULLの物だけを集めたクエリ (2)日付範囲を集めたクエリ (3)(1)と(2)をくっつけるクエリ フォームは(3)を参照 というやり方もあります。No3の方の考え方だと (1)NULLの物だけを集め、テーブルにINSERT(UPDATE)するクエリ (2)日付範囲を集め、テーブルにINSERT(UPDATE)するクエリ で、フォームはクエリではなくテーブルのフィールドを参照。 という感じになりますかね。 蛇足ではありますが。 Accessは正直言って、一部、特殊なSQL記法を使うので、 Accessのやり方はOravleやPostgreSQLなどを扱う際に使えない事があるので。 もしAccess以外のDBを使うことになったら注意してください。 この辺はAccessがプログラム開発とデータベースをごちゃ混ぜにした形で、 そこを利便化させるために独自の手法を取る事ができるので。 Accessではクエリ等から簡単にフォームのフィールドに連携」させられますが、 一般的なDBではDBとプログラムは切り離されているので、 その辺の処理を作りこんだりしないといけません。 その反面、プログラムとDBの組み合わせの自由度が高いです。 また、Accessはセキュリティ面や、データロックといったような多重アクセス制御、 バックアップ等のデータ保守というのが非常に苦手なので、 重要性を伴うアプリケーション開発や、 多人数が扱うシステムには通常Accessは使いません。 Accessを使うにしても上記のOracle等を組み合わせて使います。 (AccessのテーブルやSQLを一時的なものとして使う) ご参考まで。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

いろいろとご指南ありがとうございます。 SQLやORACLEもそのうち使えるようになりたいものです。

  • 回答No.3
  • layy
  • ベストアンサー率23% (292/1222)

いったんテーブルに出力して、追加します。2段階操作。でも可能です。 ユニオンクエリは結果がどうなるかほかより見えにくいかと思います。条件間違うと膨大です。使えば便利ですが。 ユニオンクエリの使い方が理解できてない、馴れない最初なら、手順面倒でもクエリデザインで確認しながら順次結果を出すのもいいでしょう。 たまたまうまくいった、で終わらせるのは良くないですから。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

度々のご返答ありがとうございます。 参考にさせていただきます。

  • 回答No.2
  • MRT1452
  • ベストアンサー率42% (1392/3296)

No1の方が書かれているように、 NULLのデータと、範囲指定のデータをUNIONでくっつける形になると思います。 BETWEENはあくまで範囲指定ですので値でも何でもないNULLは拾えません。 また、「空白」と「NULL」はまったく別物です。 (空白は本当に長さ0の値ですが、NULLは何の値が入っているか分からない。(NULLという何らかのデータ)) 開発環境等によっては、一緒くたに判定してくれる場合もありますが。 別物として扱うクセをつけましょう。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答ありがとうございます。 UNIONですかー。 ちょっと敷居が高いので今までやった事ありませんでした。 チャレンジしてみます。 また、恥ずかしながら「空白」=「NULL」と理解していました。 ご指摘ありがとうございます。

  • 回答No.1
  • layy
  • ベストアンサー率23% (292/1222)

「日付」が NULLで抽出したもの と NULL以外でー、BETWEEN使って抽出したもの これらが合わさればいいのでは?、どうですか?。 NULLの分までBETWEEN使ってなんとか抽出しようとしてますか。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご返答ありがとうございます。 NULLの分までBETWEENで抽出しようとはしていませんが、どうしたらいいのかわからず困っていました。

関連するQ&A

  • Access 抽出クエリーについての条件

    先の投稿に重複しますが、 それぞれ異なるテーブルについて、 クエリーで、、 Between #5:00# And #19:00# Between 500 And 1900 上記の方法等で同じ数値ではなく、 期間に幅をもたせて一致としそれぞれの 一致データを抽出するクエリーは つくれますか? もちろん抽出対象のテーブル、列はそれぞれ同じ書式です。 > between関数を使って、 フィールドのデータ型が日付/時刻型の場合 抽出条件欄に、 > 5:00から19:00を抽出したい、 Between #5:00# And #19:00# > 5:00から25:00を抽出したい、 Between #5:00# And #23:59# OR Between #0:00# And #1:00# Access の日付/時刻型では、25:00 というような表現はできないので、上記のように分割することになります。 > また上記がテキストだった場合も、 > 500から1900を抽出したい フィールドがテキスト型の場合、テキスト比較になり数値比較とは異なる抽出結果になるので、 フィールドに Val([テキスト型フィールド]) と式を設定して数値型に変換します。このの抽出条件に、 Between 500 And 1900 と設定します。 通報する

  • クエリでの抽出条件について

    クエリでの抽出条件について クエリで納品がまだ済んでいない物件について、抽出期間を設定して抽出したいのですが、うまくいかず教えてください。 抽出したいフィールドは、[納品日]、[部署]、[変更]の三つです。 フィールド[変更]は、[納品日]が変更になることがあるので、[納品日変更]というフィールドに日付が入っていたら、[変更]に[納品日変更]の日付が入るように、[納品日変更]に何も入っていなかったら、[変更]に[納品日]の日付が入るように、判定式を入れています。 [変更]の動作は、目的通りになっており問題無いのですが、いざ[納品日]、[部署]、[変更]で抽出条件を入れるとうまくいきません。 抽出条件の所に [納品日]には、Is Null [部署]には、抽出したい部署名 [変更]には、Between #2010/04/01# And #2010/05/31# それぞれAndで組んで入れていますが、何も抽出されません。 [納品日]の、Is Null と [部署]の、抽出したい部署名 のふたつだけでやると、[納品日][部署]での抽出は動作します。 しかし、この二つに[変更]をプラスし、期間を追加するとダメなようです。 [変更]のように、判定式で作ったフィールドは、抽出条件に使ってはいけないのでしょうか? それとも抽出条件のAndは二つまでとか制限があるのでしょうか? 全く別の基本的な問題が原因だと思うのですが、教えて頂きたく。

  • Access クエリ抽出条件の「Between」の記述で

    こんにちは。Access2000を使用しています。 「抽出条件」フォーム上のテキストボックス "txt開始コード"と"txt終了コード"の入力条件を 「抽出」選択クエリの抽出条件として Between [forms]![抽出条件][txt開始コード] And [forms]![抽出条件][txt終了コード] 記述しました。 抽出条件は「業務データ」テーブルの"業務コード" に対応しており、「業務コード」はテキスト型長さ4 で定義してありますが、「0000」~「9999」の数値 が格納されています。また、フォーム上のテキストボックスの書式は「0000」としています。 条件を何も入力しない時はデータを抽出しますが、条件 を指定すると何も抽出されなくなってしまいます。条件 の指定を、 Between '[forms]![抽出条件][txt開始コード]' And '[forms]![抽出条件][txt終了コード]' のようにシングルクォーテーションで囲んでもうまくいき ません。文字列なのに数値が入っているのでアクセス側で 自動認識しうまくいかないのか、検討がつきません。 どなたか解決策をお願いいたします。

  • クエリの抽出条件で困っています

    Access2007にて、クエリの抽出条件に下記を指定していますが、データが1件も抽出されません。 ※エラーは表示されません IIf([forms]![F_Home]![アンケート種別]="1級",1 Or Is Null,2 Or Is Null) この抽出条件をしているフォールドには"1"、"2"、nullのデータしか存在しません。 「アンケート種別」が"1級"の場合は、"1"とnullのデータをかえし、 それ以外の「アンケート種別」の場合は、"2"とnullのデータをかえしたいと思っています。 どのように条件を指定すれば、データを抽出できるようになるでしょうか。 宜しくお願い致します。

  • フォームからクエリの抽出期間を指定するにあたって

    フォームのテキストボックス(開始日付,終了日付)に入力された期間内の レコードをクエリで抽出するために、以下のような抽出条件を設定しています。 Between [Forms]![フォーム1]![from date] And [Forms]![フォーム1]![終了日付] ここまでは問題なく出来ています。 ですが、例えばテキストボックスに何も入力していないときに、 全ての期間から全件表示させるような方法はありませんでしょうか? IIf(IsNull([Forms]![フォーム1]![開始日付]),True,~ というような形で、IIfとIsNullの組み合わせも考えたのですが、 日付は直接フィールドでは無く抽出条件のため、 Trueより後が設定できずに悩んでおります。 出来ればVBAは使いたくないのですが、 何か良い方法はありませんでしょうか?

  • Accessのクエリデザインで条件抽出のテキストボックス

    アクセス初心者です。 既に作成済みのクエリを実行する時、いつも「開始日」と「終了日」を入力するテキストボックスが 出てきていました。 例えば開始日のボックスに2009/04/01を入力してEnterを押すと次に終了日を入力する ボックスが出てきて2009/05/31と入力して実行するとそのデータベースのその日付の期間の データが抽出されるようになっていました。 あるとき必要がありそのクエリのデザインを開き別のテーブルの抽出条件を追加したり していたときに、その日付(登録日時というテーブル)の部分の抽出条件を消してしまいました。 元通りにしたいのですが、どのような式が入力されていたのかわかりません。 私なりに調べてみて、テキストボックスは表示されないのですが、クエリのデザインを 開いている状態でそこに 「Between #2009/04/01# And #2009/05/31#」などと日付を入力すればできることは わかったのですが、テキストボックスが表示されるように元通りにすることはわかりませんでした。 お分かりになる方、教えてください。

  • ACCESS条件別抽出

    Access2000を使用しております。 クエリより抽出条件を元に値をとってくるということがしたいです。 抽出条件として日付を指定します。 以下はwhere以降で、BETWEENを使用しましたが「日付の構文エラー」とでて、抽出できませんでした。 他の方法はございますか? (2006年10月のものだけ) where (クエリー名.クエリーカラム名) BETWEEN #200610# AND #200610# よろしくお願いします。

  • 不一致クエリでnullまで抽出されてしまいます

    質問です。 現在、accessにて不一致クエリを使用し、テーブルAをチェックし、 マスタテーブルに無い情報が書かれてしまっているフィールドがある場合 抽出して確認をする、というクエリを作りたいと考えています。 不一致クエリにて自動で入る「is null」を使用すると マスタテーブルに無い事が書いてあるレコードは抽出するのですが (逆になぜis nullで相違するレコードが抽出されるのか理解に苦しんでもいるのですが) is nullですので、nullのレコードも抽出されてしまいます。 抽出条件として、マスタテーブルと相違するもの&nullは抽出しない、としたいのですがお知恵を拝借出来ませんでしょうか。 よろしくお願いいたします。

  • ACCESSでのクエリ抽出条件について

    ACCESS超初心者です。 自分なりに調べたのですが、知識不足によりお手上げ状態です。 クエリの抽出条件について、どなたかご教授いただけますでしょうか? OS:XP ACCESS:2000 ・フォーム上に自由に入力できるテキストを3つ用意します。 ・入力された3つのテキストが1つのフィールドに含まれるものをクエリで抽出したい。 ・3つのテキストが空欄の場合は全てのデータを抽出したい。 ■フォーム上のテキスト  テキスト1:テキスト10  テキスト2:テスト11  テキスト3:テスト12 ■テーブル  フィールド1:問合せ内容(1) ■クエリ内の抽出条件 Like "*" & [Forms]![F_検索テスト]![テキスト10] & "*" And Like "*" & [Forms]![F_検索テスト]![テスト11] & "*" And Like "*" & [Forms]![F_検索テスト]![テスト12] & "*" テキスト名がおかしいのですが、ご了承下さい。

  • ACCESS クエリの抽出条件

    毎度お世話になります。 クエリをレコードソースとするフォームから、コマンドボタンでアクションクエリを実行するときの抽出条件の書き方を教えて頂けないでしょうか? 二つのテーブル(別のACCESSファイルからリンク)を基にパラメータクエリを作っています。 そのクエリを基にフォームを作っています。 さらに、そのフォームに追加クエリを実行するボタンを置いています。 フォームに表示してあるレコードだけ(パラメータで抽出されたレコードだけ)、他のテーブルに追加しようと思っているのですが、実行ボタンを押すともう一度パラメータが出てきてしまいます。 多分テキストボックスの値を読み取る際にレコードソースがテーブルでないのが問題じゃないかと思うのですが。。。 テーブル:Container / Items クエリ:From_Con(パラメータは[Container]フィールド) フォーム:From_Con(テキストボックス名は[txtContainer]) 追加クエリ:From_Con_App(抽出条件は[Forms]![From_Con]![txtContainer]としてみたがうまく動きません。) デザインビューの抽出条件を使う方法? SQLを使う方法? QueryDefを使う方法? いろいろありそうですが、ネットで検索してもヒットしません。 分かりにくい説明で申し訳ありませんがご教授願います。