ACCESS勉強中のものです。フォームに日付入力部があります。会社の期毎に管理したいことがありファイルを期毎に分けようと思ってます。そして日付入力があるフォームに期の範囲外であれば注意喚起メッセージをだしたくて(認識後は範囲外の入力も可にしたい)、どうしたらいいかわからず取りあえず初期日だけの1行テーブルを作成してそれをDateSerial関数で最終日を作り、フォームにはそれらをDLookUpで参照して、フォーム入力日付の更新前に下記のコードを記述しました。
Dim kaisi, owari,kaeri
kaisi = "#" & Me.[tx初期日付] & "#"
owari = "#" & Me.[tx最終日付] & "#"
If Me.[入力日付] >= kaisi And Me.[入力日付] <= owari Then
Exit Sub
Else
kaeri = MsgBox("入力日付が今期の範囲外ですが、編集続けます?", vbYesNo)
End If
しかしどの日付を入力してもメッセージがでます。
理由がわからないのです。(多分何かが間違っていると思うのですが)
通報 ...
データ型を意識するようにしましょう。
日付の比較をしたいのなら、日付/時刻型(Date)にすべきです。
"#" & Me.[tx初期日付] & "#"
は文字列(String)です。ちなみに、VBAコード内に直接日付を入力する場合は、# で囲むことで日付/時刻型となりますが、
"#"を前後につけたら文字列です。"で囲まれたものは文字列ですので。
そういうときってありますよね。
とりあえず条件判断を簡単にすればいいと思います。
あと、変数内に希望の値が入っているかを確認するのも重要です。
記載のあるコードの場合、「kaisi」「owari」「Me.[入力日付] 」に本当に自分の想定している値が入っているか、を「Debug.Print」で確認してみてはどうでしょうか。
またIF文の条件を「And」でつなぐとややこしくなるので、まずは分けて記載するのが良いと思います。
うまくいけば、最終的にまとめてみてはどうでしょうか。
hatenaさん有り難うございました。そのコードで上手くいきました。データ形式は重要ですね。#で囲めば日付型になると思ってました。一つ教えて頂きたいのですが変数でDate型にしたら IF式には#で囲まなくても自動的にそう認識されるのでしょうか?(CDateが重要?)
すずやんさんも有り難うございました。確かにそうですね、習慣づけます。
この辺はなかなか複雑なので、いろいろ試しているうちに理解できるようになるでしょう。
イミディエイトウィンドウで下記のように記述して、それぞれの行でEnterキーを押してみてください。
前者はDate、後者はStringになります。後者は最初の質問のコードの記述と同じことですね。
VBAの決まりとして、コード中で#で囲まれた部分はDate型とみなす、"で囲まれた部分は文字列とみなす、となってます。
"#" は " で囲まれている文字列です。
これは決まりなのでそうなっていると覚えておくしかないです。
Date型の変数に代入する場合、Date型以外の値、例えば文字列を代入する場合、日付と判断できるものはDate型に自動で変換してくれます。(「暗黙の型変換」といいます)
数値を代入すると日付シリアル値(記述日からの経過日数)と判断してDate型に変換します。
If文内の比較式で、型が違う値同士を比較すると、「暗黙の型変換」で型を揃えて比較しようとします。
ただ、「暗黙の型変換」がプログラマーの想定通りになるとは限らないので、できれば型を揃えて比較した方が確実です。
テキストボックスの書式に日付書式を設定していれば(例えば yyyy/mm/dd)、Date型の値が返りますが、
回答のコードは念のためにCDate関数でDate型に変換して、Date型の変数と比較しています。
hatenaさん 有り難うございます。大変分かり易く、勉強になりました。データ形式は今後注意していきます。(
念押しも忘れずに)