プロが教える店舗&オフィスのセキュリティ対策術

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")) と入力しましたところ、、、、「式が複雑すぎるか、、、」のエラーメッセージが出てしまいました。
どなたか助けてください。お願い致します。

A 回答 (3件)

> 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")) と入力しましたところ、自信はなかったもののエラーが出てしまい無理でした、、、、

補足日時:2013/06/07 01:11
    • good
    • 4

> フォームのテキストボックスにyyyymmddと入力してもクエリでエラーが出ることない パラメータを日付に設定したいのですがどうしたらよいでしょうか?



前のお二方の回答で解決だと思いますが、このような方法もあるということで別案を。

フォーム上のテキストボックス「日付始」「日付終」の定型書式を下記のように設定します。

0000/00/00;0;_

こうしておけば、ユーザーは 20130607 と入力すれば、テキストボックスの表示は、2013/06/07 となります。
クエリの抽出条件も下記でOKになります。

Between [Forms]![フォーム]![日付始] and [Forms]![フォーム]![日付終]


ユーザーにとって入力の手間は同じで、表示は 2013/06/07 と見やすくなるので、お勧めです。
    • good
    • 1
この回答へのお礼

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

お礼日時:2013/06/07 23:30

エラーの原因から。



まず、
  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/HA …
なので、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桁である事が条件です。

解り易い関数ではあるのですが、長すぎてスマートとは言いづらい式ですね。
    • good
    • 0
この回答へのお礼

大変丁寧なご説明ありがとうございます。

とても参考になりました。おかげさまで無事にクエリを通すことができました。
今後ともよろしくお願い致します。

お礼日時:2013/06/12 00:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A