dポイントプレゼントキャンペーン実施中!

いつも質問ばかりですいません。

指定の日付範囲外の値に対してメッセージを出して再入力させたいのですが上手くいきません。

《条件》
今日より先は NG
今日より2日以上前は NG
1日前:OK
今日:OK

Dim txt01 As Date
' Dim txt02 As String
' Dim txt03 As Integer
Dim ckDate As Date
ckDate = Date - 2

'日付のチェック
If IsNull(Me.txt01) Then 'Nullチェック
MsgBox "txt01=Null"
Me.txt01.SetFocus
Exit Sub
ElseIf IsDate(Me.txt01) <> True Then
MsgBox "日付形式ではありません。"
Me.txt01.SetFocus
Exit Sub
ElseIf Me.txt01.Value < Date Then '前チェック
Debug.Print Me.txt01.Value
MsgBox "今日より先"
Me.txt01.SetFocus
Exit Sub
ElseIf Me.txt01.Value <= ckDate Then
MsgBox "2日以上前!"
Me.txt01.SetFocus
Exit Sub

End If

2番目の、Elseifからの日付範囲の条件設定が上手くいきません。

Me.txt01.valueの後ろを"<"を">"にしたり、"="を付けたりしましたが、希望通りになりません。

多分、もっとスマートな書き方が有るとは思うのですが、あとあとメンテナンスしやすい書き方をお教え頂けたら幸いです。

A 回答 (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
以下省略
ご参考までに。
    • good
    • 0
この回答へのお礼

NotFound404様
度々回答ありがとうございます。

目からうろこの発想です。
うちはPCリテラシーが低い人が多いので、このやり方が一番簡単で良いと面ます。

お礼日時:2014/01/28 16:23

IF文の条件を書きにくい場合は多々ありますから、


Thenで何もせず、Elseのみに処理を記述するのも良いですよ。

If cdDate =Date - 1 Or cdDate = Date Then
'処理日前日と処理日当日を許可する
Else '上記以外はエラーとする
Msgbox "範囲外の日付が入力されました。"
Exit sub
End if
もアリです。

#4は#3さんを批難するつもりではありませんので念のため。
    • good
    • 0
この回答へのお礼

bin-chan様
度々、補足ありがとうございます。
なるほど、今回の場合選択肢が2日だけですから、このやり方もありですね。
勉強になりました、ありがとうございます。

お礼日時:2014/01/28 16:20

#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
と書けばわかりやすいのかな
    • good
    • 0
この回答へのお礼

bin-chan様
回答ありがとうございます、どうも頭が悪いせいか条件式の評価の理解がたりてないようです。

下段の記述が私には、理解しやすいです。

この場合、ORでもよいわけですね。

お礼日時:2014/01/28 16:19

今日と昨日の日付以外は弾きたいのだから


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

みたいな感じで良いんじゃないかと?

この回答への補足

どんなデータでも日付であれば通ってしまったので、少し書換えさせて頂きました。

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型へ変換してもどんな日付でも通ってしまいます。
なにか間違ってますでしょうか?

シンプルなコーディングで、非常にわかりやすいと思ったのですが、式の評価がうまく行きません。

補足日時:2014/01/24 10:09
    • good
    • 0
この回答へのお礼

NotFound404様
回答ありがとうございます。
Nzの使い方が分かり非常に参考になりました。

お礼日時:2014/01/24 10:10

ElseIFの連続も見づらい。



> ElseIf Me.txt01.Value < Date Then '前チェック
不等号の向きが逆?今日より未来はNGなんでしょ?
    • good
    • 0
この回答へのお礼

bin-chan様
回答有難うございます。
不等号の組み合わせを色々試したので、こんがらがって向きが変になっていたんだと思います。

お礼日時:2014/01/24 08:54

>2番目の、Elseifからの日付範囲の条件設定が上手くいきません。


txt01のデータ形式はなんでしょうか?
DATE型なら問題ないはずなのでSTRING型でしょうか?
それならば
CVDate(Me.txt01.Value)
とすればいいと思います。

http://access2010.kjeh34.com/k006-2/59/
    • good
    • 0
この回答へのお礼

mshr1962様
回答ありがとうございます、すいませn他の変数と一緒に宣言したので、ハチョリました。
Dim txt01 As Dateで宣言しているので、Date型です。

お礼日時:2014/01/24 08:52

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