- ベストアンサー
Access 日付範囲の条件指定
- 指定の日付範囲外の値に対してメッセージを出して再入力させたいのですが上手くいきません。
- 日付のチェックを行い、条件に合わない場合はメッセージを表示して再入力を促すことができません。
- 条件としては、今日より先の日付や2日以上前の日付はNGとし、1日前や今日の日付はOKとします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
#3 の NotFound404 でござります。 お恥ずかしい限りです。呆けてます。 orz 前回同様、只今 @酔 なので、ご質問者さまには『ごめんなさい』 #2/4/5さんへ 私に限って言えば、 ドンドンじゃんじゃんバンバンがんがん駄目出しをください。 お気遣いはご無用です。 技術的な話は、それが肝要かと思います。 (でも、やさしくお願い致いしたくです。「ヒック」zzz) ・・・と昨夜に投稿するつもりで寝てしまったようです。。。 これだけだとサイトの規定により丸ごと削除されるかもしれないので ちょっと別案。 日付の手入力ではなくコンボボックスなどで選択するようにした方が ユーザーさんは手間が省けてよいかも? 仮に「コンボ日付」というコンボボックスを作成し フォームの読み込み時イベントでに Private Sub Form_Load() Me!コンボ日付.RowSourceType = "value list" Me!コンボ日付.RowSource = "今日;" & Date & ";昨日;" & Date - 1 End Sub とし 「コンボ日付」のプロパティは データタブ 値集合タイプに、値リスト 連結列に、2 入力チェックに、はい 値リストの編集の許可に、いいえ 編集ロックに、はい 書式タブ 列数に、2 列幅に、1cm;3cm リスト行数に、2 リスト幅に、4cm などと設定してコンボボックスから選んでもらうのはいかが? コンボ日付をプルダウンすると 今日|2014/1/27 昨日|2014/1/26 と表示されます。 連結列が2に設定してあるので コンボ日付.Value で値が得られます。 また、コンボ日付.Column(1) でも可。 例 Private Sub コンボ日付_AfterUpdate() msgbox Me!コンボ日付.Column(0) & Me!コンボ日付.Column(1) & vbcrlf & Me!コンボ日付.Value 以下省略 ご参考までに。
その他の回答 (5)
- bin-chan
- ベストアンサー率33% (1403/4213)
IF文の条件を書きにくい場合は多々ありますから、 Thenで何もせず、Elseのみに処理を記述するのも良いですよ。 If cdDate =Date - 1 Or cdDate = Date Then '処理日前日と処理日当日を許可する Else '上記以外はエラーとする Msgbox "範囲外の日付が入力されました。" Exit sub End if もアリです。 #4は#3さんを批難するつもりではありませんので念のため。
お礼
bin-chan様 度々、補足ありがとうございます。 なるほど、今回の場合選択肢が2日だけですから、このやり方もありですね。 勉強になりました、ありがとうございます。
- bin-chan
- ベストアンサー率33% (1403/4213)
#2です。#3さんの回答への補足について > If cdValue <= Date And cdValue >= Date - 1 Then > Date型へ変換してもどんな日付でも通ってしまいます。 > なにか間違ってますでしょうか? #2でも指摘したことだが、不等合の向きがおかしい。 「どんな日付でも」に昨曰入れてみた? 「今曰以前で、かつ、昨日以上」がThen(エラー検知処理)って何? If cdValue > Date Or cdValue < Date - 1 Then でしょ If cdValue < Date - 1 Or Date < cdDate Then と書けばわかりやすいのかな
お礼
bin-chan様 回答ありがとうございます、どうも頭が悪いせいか条件式の評価の理解がたりてないようです。 下段の記述が私には、理解しやすいです。 この場合、ORでもよいわけですね。
- NotFound404
- ベストアンサー率70% (288/408)
今日と昨日の日付以外は弾きたいのだから dim dValue as variant dvalue = nz(Me.txt01,0) if not isdate(dvalue) then msgbox "日付が間違っています。入力できるのは、今日か昨日の日付だけです" exit sub end if if dvalue <= date and dvalue >= date -1 then msgbox "入力できるのは、今日か昨日の日付だけです" exit sub end if みたいな感じで良いんじゃないかと?
お礼
NotFound404様 回答ありがとうございます。 Nzの使い方が分かり非常に参考になりました。
補足
どんなデータでも日付であれば通ってしまったので、少し書換えさせて頂きました。 Private Sub コマンド8_Click() Dim txt01 As Date Dim dValue As Variant Dim cdValue As Date dValue = Nz(Me.txt01, 0) Debug.Print "--------------------" Debug.Print dValue Debug.Print TypeName(dValue) If Not IsDate(dValue) Then MsgBox "日付が間違っています。入力できるのは、今日か昨日の日付だけです" Debug.Print dValue Exit Sub Else Debug.Print "OK" End If cdValue = CDate(dValue) Debug.Print TypeName(cdValue) If dValue <= Date And dValue >= Date - 1 Then MsgBox "入力できるのは、今日か昨日の日付だけです" Exit Sub Else Debug.Print "OOKK" Debug.Print "dvalue : " & dValue & " | 型 :" & TypeName(dValue) End If End Sub インティミディエイトの値 -------------------- 2014/01/30 String OK Date OOKK dvalue : 2014/01/30 | 型 :String String型なので、評価し出来ないかと考え cdValue = cDate(dValue) 型を変換して↓を実行 If cdValue <= Date And cdValue >= Date - 1 Then -------------------- 2014/01/30 String OK Date OOKK cdvalue : 2014/01/30 | 型 :Date Date型へ変換してもどんな日付でも通ってしまいます。 なにか間違ってますでしょうか? シンプルなコーディングで、非常にわかりやすいと思ったのですが、式の評価がうまく行きません。
- bin-chan
- ベストアンサー率33% (1403/4213)
ElseIFの連続も見づらい。 > ElseIf Me.txt01.Value < Date Then '前チェック 不等号の向きが逆?今日より未来はNGなんでしょ?
お礼
bin-chan様 回答有難うございます。 不等号の組み合わせを色々試したので、こんがらがって向きが変になっていたんだと思います。
- mshr1962
- ベストアンサー率39% (7417/18945)
>2番目の、Elseifからの日付範囲の条件設定が上手くいきません。 txt01のデータ形式はなんでしょうか? DATE型なら問題ないはずなのでSTRING型でしょうか? それならば CVDate(Me.txt01.Value) とすればいいと思います。 http://access2010.kjeh34.com/k006-2/59/
お礼
mshr1962様 回答ありがとうございます、すいませn他の変数と一緒に宣言したので、ハチョリました。 Dim txt01 As Dateで宣言しているので、Date型です。
お礼
NotFound404様 度々回答ありがとうございます。 目からうろこの発想です。 うちはPCリテラシーが低い人が多いので、このやり方が一番簡単で良いと面ます。