ここから本文です

日付範囲で入力を制限したい

jya********さん

2011/11/1609:47:40

日付範囲で入力を制限したい

現在、伝票を入力するフォームを作成しております。
非連結テキストボックスを年、月、日と3つ置き、数字を入れると「納品日」に日付が入るようにしてあります。
期中の入力だけ制限したいのですが、
年から入力するとすべて、 "日付の内容に誤りがあります!"と出てしまいます。どこを治せばいいでしょうか?

Private Sub 年_AfterUpdate()

cbfSetDate
End Sub

Private Sub 月_AfterUpdate()
cbfSetDate
End Sub

Private Sub 日_AfterUpdate()
cbfSetDate
End Sub

Private Sub cbfSetDate()

Dim strnewdate As String

'年・月・日から日付データを組み立て


strnewdate = Me!年 & "," & Me!月 & "," & Me!日


If IsDate(strnewdate) >= #4/1/2011# And IsDate(strnewdate) <= #3/31/2012# Then
'日付の内容が正しいとき

Me!納品日 = CDate(strnewdate)
ElseIf IsNull(Me!年) Or IsNull(Me!月) Or IsNull(Me!日) Then
'いずれかが未入力のとき
Me!納品日 = Null
Else
'日付の内容に誤りがあるとき(存在しない日付など)

MsgBox "日付の内容に誤りがあります!", vbOKOnly + vbExclamation
Me!納品日 = Null
End If




End Sub

補足みなさんご意見ありがとうございます。
非連結テキストボックスは使う側が入力しやすいように分けて設定しております。
納品日の更新前に2011/04/01~2012/03/31の日付だけ入るにはどのような式がいいのかまだ模索中です。

閲覧数:
400
回答数:
3
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

nor********さん

2011/11/1611:20:10

> 非連結テキストボックスを年、月、日と3つ置き
好みかもしれませんが、私だと年月日でひとつのテキストボックスにしてしまいます。
テキストボックスのプロパティで書式に「yyyy/mm/dd」を設定し、テキストボックスの更新前のイベントをビルドして
Private Sub (テキストボックス名)_BeforeUpdate(Cancel As Integer)
If Me!start_position < #4/1/2011# Or Me!start_position > #3/31/2012# Then
MsgBox "日付は2011/4/1~2012/3/31までで入力してください", vbOKOnly
Cancel = True
End If
のようにするのはどうでしょうか。
それか、ACCESS2003までならカレンダーコントロールを、ACCESS2007以降ならカレンダー入力機能を使うこともできます。
End Sub

この質問は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

mah********さん

編集あり2011/11/1614:07:21

補足。

cbfSetDateは年月日すべてそろってから行なってもいいと思います。
下手すると、年を入れてメッセージボックス、月でまた、日でまた・・となり
使う側からするとうっとおしい。

年月日の各項目の横に「納品日設定」ボタンを用意するとか、
すべてそろったときのみcbfSetDateを行なうなどでも良い。

さらに、
余裕あれば、
月と日はコンボボックスとか、カレンダコントロールなどを使う。

あらかじめ設定される年度が決まっているのであれば、
月日だけは入力で、年は自動設定という手もあります。
--------------------

strnewdate = Me!年 & "," & Me!月 & "," & Me!日
If IsDate(strnewdate) >= #4/1/2011# And IsDate(strnewdate) <= #3/31/2012# Then

もしきちんとした値を指示しているのにエラーとなると、
根本的に間違っていないか、です。
この比較は型は合っている前提で比較しているか検証していますか?。
「日付の内容に誤りがあります」
というのだから、何がどう誤ってそのロジックを通過しているのかがわかれば
対処が見えると思います。

範囲がわかっているのだから、
日付の初期値に2011/04/01とするだけでもエラーは減ります。

入力ミスを防ぐには入力しやすい形にする。
手入力だけでない、日付を選ばせるのも工夫です。

どのような式が・・・、というのは、
判定は考えられる条件すべて網羅されていれば問題ないと思います。
例えば、
年月日すべて入力されているとき
→存在する日付であるとき
→→範囲内であるかを確認
年月日すべて入力されていないとき
→年が入力されているとき
→→範囲の年であるかを確認
→月が入力されているとき
→→1~12であるかを確認
→日が入力されているとき
→→1~31であるかを確認

stt********さん

2011/11/1610:08:04

こんなかんじでしょうか

Private Sub 年_AfterUpdate()

if Me!年>=2011 and Me!年<=2012 then
else
msgbox "2011~20121の範囲しかダメです!"
endif

End Sub

Private Sub 月_AfterUpdate()

if Me!月>=1 and Me!月<=12 then
else
msgbox "1~12の範囲しかダメです!"
endif

End Sub

Private Sub 日_AfterUpdate()

if Me!日>=1 and Me!日<=31 then
else
msgbox "1~31の範囲しかダメです!"
endif

End Sub

Private Sub cbfSetDate()

Dim strnewdate As String

'年・月・日から日付データを組み立て


strnewdate = dateserial(Me!年 , Me!月 , Me!日)


If IsDate(strnewdate) >= #4/1/2011# And IsDate(strnewdate) <= #3/31/2012# Then
'日付の内容が正しいとき

Me!納品日 = CDate(strnewdate)
Else
'日付の内容に誤りがあるとき(存在しない日付など)

MsgBox "日付の内容に誤りがあります!", vbOKOnly + vbExclamation
Me!納品日 = Null
End If

End Sub

ちなみにテストしてませんのでご容赦を。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる