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

ACCESS フォームで入力した日付をクエリで読み

ACCESS フォームで入力した日付をクエリで読み替えたい ACCESS フォームで入力した日付をクエリで使用しているテーブルの書式に変換したい フォーム テキスト名:日付にyyyymmdd で入力します クエリ テキスト名:日付はパラメータとして使用しています クエリ内で使用しているテーブルの日付書式は 日付:yyyy/mm/ddです パラメータは 「日付始」と「日付終」の2箇所のテキストに入力されたデータを使用しています。以下がパラメータです。 Between [Forms]![フォーム]![日付始] and [Forms]![フォーム]![日付終] フォームのテキストボックスにyyyymmddと入力してもクエリでエラーが出ることない パラメータを日付に設定したいのですがどうしたらよいでしょうか? ちなみに、以下の式を入れたらエラーです。 Between CDate(Format([Forms]![フォーム]![日付始],"yyyy/mm/dd")) and CDate(Format([Forms]![フォーム]![日付始],"yyyy/mm/dd")) と入力しましたところ、、、、「式が複雑すぎるか、、、」のエラーメッセージが出てしまいました。 どなたか助けてください。お願い致します。

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

  • 回答数3
  • 閲覧数4730
  • ありがとう数2

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

  • ベストアンサー
  • 回答No.1
  • bin-chan
  • ベストアンサー率33% (1403/4213)

> Between [Forms]![フォーム]![日付始] and [Forms]![フォーム]![日付終] これで合ってると思います。 > クエリ内で使用しているテーブルの日付書式は 日付:yyyy/mm/ddです フォームの値が正しく日付として認識できてますか? YYYYMMDDのつもりで8桁の入力なら、ダメですよ。 YYYYMMDDのつもりの8桁の入力なら、betweenを設定する日付の列をformat文で yyyymmddに編集してテキスト同士として比較するとか。

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

質問者からの補足

ご回答ありがとうございます。 下記のパラメータの日付は フォームで yyyymmdd の書式で入力されますが、ここで使用しているテーブルのデータが yyyy/mm/dd のためフォーム入力の値を変換する指揮をいれる必要があります。 日付入力のテキストは1つで複数のコマンドボタンに対応しているため一律yyyymmddで日付を入力されています。 Between [Forms]![フォーム]![日付始] and [Forms]![フォーム]![日付終]   Between句では Between CDate(Format([Forms]![フォーム]![日付始],"yyyy/mm/dd")) and CDate(Format([Forms]![フォーム]![日付始],"yyyy/mm/dd")) と入力しましたところ、自信はなかったもののエラーが出てしまい無理でした、、、、

関連するQ&A

  • Accessで日付を抽出するパラメータを設定したい

    Accessのクエリで日付に対して与えているパラメータがあります。 パラメータで指定したいデータはフォームのテキストに入力した日の23:59:59 以降の日付を抽出したい。 入力:数値8桁(yyyymmdd)で行う 抽出先テーブルのデータ:yyyy/mm/dd hh:mm:ss 現在以下のパラメータを日付に対して与えると「式が複雑すぎます、、、」と注意されてしまいます。 指定日の23:59:59を抽出範囲として指定するのはどうしたらよいでしょうか? 入力値の変換も含めて、以下のパラメータを入れています。 「+"23:59:59"」をとればエラーは出ません。 <=IIF(Len([Forms]![フォーム名]![日付])=8,CDate(Format([Forms]![フォーム名]![日付],"@@@@/@@/@@")),#9999/1/01#)+"23:59:59" どなたか、お助け下さい。よろしくお願い致します。

  • 【ACCESS】クエリによる正規表現の基本的書き方

    いつもお世話になっております。 ACCESSのクエリで、下記8パターンにマッチする文字列を yyyyMMddの形で抽出する方法が判りません。 例でも構わないので、ご教示いただけないでしょうか。  (1)yyyyMMdd       (数字は半角)  (2)yyyy年M月dd日   (数字は半角)  (3)yyyy年MM月dd日 (数字は全角)  (4)yyyy年M月dd日   (数字は全角)  (5)yyyy年MM月dd日  (数字は半角)  (6)yyyy年M月dd (数字は半角)  (7)yyyy/MM/dd (数字は全角)  (8)yyyy/MM/dd      (数字は半角)   ※12月32日等の日付不正は対象外 数字の全・半角は区別しなくても抽出可能と考えています。 ただ、そもそも、正規表現の基本的な書き方が判らず。。 グループ化させるための括弧「()」や、論理和の「|」を使うと 抽出できませんでした。 accessでは利用不可なのでしょうか。。 一応、私の作成したクエリを掲載致します。 テーブルaからdate列を抽出します。上記8パターンにマッチする場合は、yyyyMMdd形式で、いずれにもマッチしなければ空白を返させたいと思います。 SELECT IIf (a.date Like '[1-9][0-9][0-9][0-9](0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])', a.date, IIf (a.date Like '[1-9][0-9][0-9][0-9]年[1-9]月(0[1-9]|[12][0-9]|3[01])日', Format(CDate(Format(Replace(Replace(Replace(a.date, '年', ''), '月', ''), '日', ''), "@@@@/@@/@@")), "yyyymmdd"), IIf (a.date Like '[1-9][0-9][0-9][0-9]年(0[1-9]|1[012])月(0[1-9]|[12][0-9]|3[01])日', Format(CDate(Format(Replace(Replace(Replace(a.date, '年', ''), '月', ''), '日', ''), "@@@@/@@/@@")), "yyyymmdd"), IIf (a.date Like '[1-9][0-9][0-9][0-9]年[1-9]月(0[1-9]|[12][0-9]|3[01])日', Format(CDate(Format(Replace(Replace(Replace(a.date, '年', ''), '月', ''), '日', ''), "@@@@/@@/@@")), "yyyymmdd"), IIf (a.date Like '[1-9][0-9][0-9][0-9]年(0[1-9]|1[012])月(0[1-9]|[12][0-9]|3[01])日', Format(CDate(Format(Replace(Replace(Replace(a.date, '年', ''), '月', ''), '日', ''), "@@@@/@@/@@")), "yyyymmdd"), IIf (a.date Like '[1-9][0-9][0-9][0-9]年[1-9]月(0[1-9]|[12][0-9]|3[01])', Format(CDate(Format(Replace(Replace(a.date, '年', ''), '月', ''), "@@@@/@@/@@")), "yyyymmdd"), IIf (a.date Like '[1-9][0-9][0-9][0-9]/(0[1-9]|1[012])/(0[1-9]|[12][0-9]|3[01])', Format(CDate(Format(Replace(Replace(a.date, '/', ''), '/', ''), "@@@@/@@/@@")), "yyyymmdd"), IIf (a.date Like '[1-9][0-9][0-9][0-9]/(0[1-9]|1[012])/(0[1-9]|[12][0-9]|3[01])', Format(CDate(Format(Replace(Replace(a.date, '/', ''), '/', ''), "@@@@/@@/@@")), "yyyymmdd"), '' ) ) ) ) ) ) ) ) FROM a 以上、何卒よろしくお願いいたします。

  • ACCESSのDate関数について

    会社のDBにACCESSで繋いで必要な資料を作成しています。そのDBの日付の書式がyyyymmddの型になっていて、クエリの抽出条件でdate()と入力しても上手くいきません。そのために、left(date,4)&"/"&mid(date,5,2)&"/"&right(date,2)としてyyyy/mm/ddの型に直して抽出しています。このやり方だとクエリの実行にとても時間がかかります。yyyymmddのままでパラメータを指定して20070630と入力すると10秒かからずに表示されますが、yyyy/mm/ddの型に直してdate()にすると3分近くかかります。yyyymmddのままでdate()を使う方法はありますか?

その他の回答 (2)

  • 回答No.3

> フォームのテキストボックスにyyyymmddと入力してもクエリでエラーが出ることない パラメータを日付に設定したいのですがどうしたらよいでしょうか? 前のお二方の回答で解決だと思いますが、このような方法もあるということで別案を。 フォーム上のテキストボックス「日付始」「日付終」の定型書式を下記のように設定します。 0000/00/00;0;_ こうしておけば、ユーザーは 20130607 と入力すれば、テキストボックスの表示は、2013/06/07 となります。 クエリの抽出条件も下記でOKになります。 Between [Forms]![フォーム]![日付始] and [Forms]![フォーム]![日付終] ユーザーにとって入力の手間は同じで、表示は 2013/06/07 と見やすくなるので、お勧めです。

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

質問者からのお礼

大変丁寧な回答ありがとうございます。とても勉強になりました。 お陰様で無事にクエリを通すことができました。 今後ともよろしくお願い致します。

  • 回答No.2

エラーの原因から。 まず、   Between [Forms]![フォーム]![日付始] and [Forms]![フォーム]![日付終] これがエラーを返す理由から。 これにフォームに入力された[日付始]と[日付終]を代入すると、例えば   Between 20130601 and 20130610 こうなりますね。 ザックリ言ってしまうと、 「日付型」で「2013/6/7」とされているデータは、 内部的には「41432」と言うシリアル値で保存されています。 当然、上記式のBetweenには該当しないわけです。 アクセス(と言うかMS-Officeソフト)が「日付として認識できる最大のシリアル値」は、 「2,958,465=9999/12/31」です(便宜上、カンマ区切りしました)。 これより先(西暦5桁)は日付に変換できない仕様です。 今回は例えば 「20,130,601(⇒2013/6/1)」 と言うシリアル値での抽出を試みていますから、 当然、アクセスとしては「日付として認識できないシリアル値が入ってきた」となるのですね。 なので、   Format([Forms]![フォーム]![日付始],"yyyy/mm/dd") このFormat式はエラー(複雑すぎ・・)を返します。 そもそも「yyyy/mm/dd(日付型)に変換できないシリアル値だから」です。 では、対策です。 結論から先にいくと   Format([Forms]![フォーム]![日付始],"@@@@/@@/@@") これだと正常に「yyyymmdd(8桁)→yyyy/mm/dd(日付)」の変換が可能です。 「@」はその位置にある「数字」を返すカスタム書式記号です。   参考)http://office.microsoft.com/ja-jp/access-help/HA001233061.aspx なので、8桁入力されてくると8個の「@」をそれぞれその数字に置き換えて、 正しく日付(のような)文字列に変換してくれる、と言う寸法です。 ですので、CDateを使って、   CDate(Format([Forms]![フォーム]![日付始]) が通り、Betweenで括っても   Between CDate(Format([Forms]![フォーム]![日付始],"@@@@/@@/@@")) And CDate(Format([Forms]![フォーム]![日付終],"@@@@/@@/@@")) としてやると処理を通ってくれます。 人間の目で見る範囲だと「yyyy/mm/dd」の方が解り易いんですが、 ここは「日付←→シリアル変換に関する仕様なのだからしょうがない」と割り切って 盲目的に覚えておくしかなさそうです。 以上、参考になりますかどうか。 補記) DateSerial・Mid関数を使って   DateSerial(Mid([forms]![フォーム]![日付始],1,4),Mid([forms]![フォーム]![日付始],5,2),Mid([forms]![フォーム]![日付始],7,2)) こんな書き方でも「yyyymmdd→yyyy/mm/dd」の変換が出来ます。 つまり、   Between DateSerial(Mid([forms]![フォーム]![日付始],1,4),Mid([forms]![フォーム]![日付始],5,2),Mid([forms]![フォーム]![日付始],7,2)) And DateSerial(Mid([forms]![フォーム]![日付終],1,4),Mid([forms]![フォーム]![日付終],5,2),Mid([forms]![フォーム]![日付終],7,2)) なのですが・・・この場合、[日付始][日付終]は必ず8桁である事が条件です。 解り易い関数ではあるのですが、長すぎてスマートとは言いづらい式ですね。

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

質問者からのお礼

大変丁寧なご説明ありがとうございます。 とても参考になりました。おかげさまで無事にクエリを通すことができました。 今後ともよろしくお願い致します。

関連するQ&A

  • ACCESSの日付変換

    アクセスDBのテキスト型で来館日というテキスト型の8桁日付入っているフィールド(例18731023のような)があり、これを帳票タイプのフォームでyyyy/mm/ddで表示させようと思い、 =CDate(Format([来館日],"@@@@\/@@\/@@")) これでうまくいったのですが、 この来館日フィールドにはNullも入るのでNUllでエラーが返ってきてしまいます。これを空白のままで表示する方法がわかりません。 どなたかご教授おねがいいたします。

  • accessのnot検索

    access2000で テーブル[日付](yyyy/mm/ddで入力されています)   [内容](なんでも。空白の場合もあります) フォーム  「日付」(yyyy/mm/ddのみ入力可能にしています)  「NGword」(どんな文字でも入力できます) という項目を作成し・・・ 1、クエリでフォームの「日付」に入力したものかつ 2、フォームの「NGWord」を含まないレコードのみを抽出したいのですがうまくいきません。 「日付」「NGword」が空白の場合は入力された条件のみ適用させたいです。 (「日付」・「NGWord」が両方空の場合は全レコード抽出したいです) クエリを作成して・・・ [日付]の抽出条件を like "*" & forms![フォーム名]![日付] & "*" で [内容]の抽出条件を (not like "*" & forms![フォーム名]![NGword] & "*") or (is null) で設定したのですがうまくいきませんでした・・・泣 宜しくお願いします。

  • Accessクエリで100年単位で抽出したい

    いつも、お世話になります。 Win7, Access2013 パラメータクエリで行き詰まっています。ご存知の方がいらっしゃいましたら、ご教示お願いします。 年月日のコントロールがあり、yyyy/mm/dd の書式から 1900年代を抽出したいのです。 月だけを抽出したい場合、webの事例で フィールド:Format([年月日],"mm") にして、パラメータクエリで 05 と入力すると 5月のリストが抽出できるようになりました。 パラメータクエリで、この年月日に「1900」又は 「19」と入力すると 1900年代のリストが抽出できるようしたいのです。 ご存知の方がいらっしゃいましたら、ぜひお願いいたします。

  • 変数に昨日の日付を入力したい

    XP Excel2003を使っています day_z = Format(Now, "yyyy/mm/dd")で当日の日付を入力していますが、これを昨日の日付で入力したいのですがよろしくお願いします。

  • accessのフォームで日付を定形入力にした場合

    access2000です。 フォームでテキストボックスに日付を入力しているのですが、定形入力にしてyyyy/mm/ddの形にしています。 テキストボックスをクリックすると必ず、カーソルがdの後ろあります。今はカーソルクリックし直すなどしていますがとても面倒です。テキストボックスをクリックしたら、yの先頭にカーソルくるようにできないですか?

  • Access テキスト型を日付/時刻型へ変更

    いつもお世話になっております。 Accessについてお願い致します。 テーブル「メインデータ」に日付と時刻が一緒になっているデータがあります。例:2004/01/01/ 10:00 現在、 フィールド名:受付時間 データ型:テキスト型 フィールドサイズ:12 定数入力:0000/00/00\ 00:00;0;_ と設定してあり、問題はこのデータをテキスト型から日付/時刻型「「yyyy/mm/dd @@:@@」)へ変更したいのですが、 テキスト型→日付/時刻型へ変更すればデータが消えてしまいます。 そこで、クエリでFormatを使ったのですがエラーが出てしまいます。 何か良い案はございませんでしょうか? 宜しくお願い致します。

  • ACCESS日付形式について質問です。

    日付抽出条件を含んだフォームを作成したのですが、午前中までyyyy/mm/ddの形式で入力し、抽出できたのですが、今mm/ddの形式で入力しないと抽出できなくなりました。 変更をした覚えはないのですが・・・ yyyy/mm/ddで抽出できる方法を教えてください。 おねがいします。

  • 【access】テキストから日付へ変換するとエラーになる

    環境 OS:windowsXP pro Access:access2000 こんにちは。いつもお世話になっております。 テキスト形式(20080119)のデータをクエリで日付型(2008/01/19)にしたいのですが上手くいきません。 過去ログ等からCDATE(format([フィールド名],"yyyy/mm/dd"))とすれば良いというのはわかったんですが クエリを実行すると「#Error」となってしまいます。 ちなみに書く場所は選択クエリの「フィールド:」の所でいいんですよね?別フィールドを隣に挿入して記入しました。 テーブルのプロパティから書式を日付(S)に変更するとデータが消えてしまったのでそれは避けたいです。 他のやり方などありましたらご教授願います。よろしくお願い致します。

  • ACCESS 日付の比較

    日付を比較してstrToDateよりstrFromDateの日付が未来日だった場合エラーを出したいのですがうまくいきません。 日付型に合わせたつもりなのですがこれだとダメなのでしょうか strFromTime = txtFromYear & "/" & Format(txtFromMonth, "00") & "/" & Format(txtFromDay, "00") strToTime = txtToYear & "/" & Format(txtToMonth, "00") & "/" & Format(txtToDay, "00") If (Format(strFromTime, yyyy / mm / dd) >   Format(strToTime, yyyy / mm / dd)) Then MsgBox MSG_ERR, vbCritical, SYSTEM_NAME Exit Sub End If

  • 日付入力

    テキストボックスにYYYY/MM/DDの形式で入力します。 入力中に、YYYYが入力されたら自動的にスラッシュを付け加えて、またMMと入力したらスラッシュが自動的に入るようにしたいです。その過程で、日付のチェックも同時に行ないたいです。 どう書けばよいのでしょうか。ぜひ教えてください。お願いします。