VBA 日付(Date)比較する方法
VBAで日付(Date)比較する方法です。
正確には日付文字列(String)となります。
日付の比較としては、今日より過去の日付なのか、未来なのか、何日前なのか、何日後なのか・・・求めたいケースは様々あると思います。今月中なら OK で、それ以外なら NG なんてのも実務ではよく使う日付比較ですね。
ここでは 最も簡単な日付比較の方法と、日付の比較によく使われている「DateDiff」「DateAdd」「DatePart」の関数を使って日付の比較 をしたいと思います。
Sponsored Links
最も簡単な日付比較の方法
最も簡単な日付比較の方法はこちらです。
Const STR_DATE As String = "2017/4/13" If CDate(STR_DATE) = Date Then Debug.Print "今日です。" ElseIf CDate(STR_DATE) < Date Then Debug.Print "過去の日付です。" Else Debug.Print "未来の日付です。" End If
正しいフォーマット("yyyy/mm/dd"など)で記述されている日付文字列の場合、CDate関数で日付型に変換し、直接比較することができます。
Sponsored Links
DateDiff関数を使う
DateDiff 関数は、指定した2つの日付の時間間隔を整数値で返します。 間隔の単位は引数で指定します。
DateDiff("d", "2017-1-1", "2017-4-13") ⇒ 102 (日) DateDiff("m", "2017-1-1", "2017-4-13") ⇒ 3 (ヶ月) DateDiff("ww", "2017-1-1", "2017-4-13") ⇒ 14 (週)
Sponsored Links
DateAdd関数を使う
DateAdd 関数は、日時に指定した時間を加算(減算)して日付型を返します。間隔の単位は引数で指定します。
DateAdd("d", -1, "2017-4-13 09:10:11") ⇒ 2017/04/12 9:10:11 DateAdd("m", 2, "2017-4-13 09:10:11") ⇒ 2017/06/13 9:10:11 DateAdd("yyyy", 3, "2017-4-13 09:10:11") ⇒ 2020/04/13 9:10:11 DateAdd("h", 4, "2017-4-13 09:10:11") ⇒ 2017/04/13 13:10:11
第二引数には負の数を指定すると減算した日時を返します。
Sponsored Links
DateAdd関数を使う
DatePart 関数は、指定した日付の同一年における時間間隔を整数値で返します。間隔の単位は引数で指定します。
DatePart("d", "2017-4-13") ⇒ 13 (日目、月初から) DatePart("y", "2017-4-13") ⇒ 103 (日目、年始から) DatePart("w", "2017-4-13") ⇒ 5 (日目、週初めから) DatePart("ww", "2017-4-13") ⇒ 15 (週目、年始を1週目として) DatePart("q", "2017-4-13") ⇒ 2 (四半期)
使用例
上記を踏まえて、いくつか使用例を作ってみましょう。仮に「今月中なら返品OK」って関数を作るとすれば、
Public Function IsThisMonth(StrDate As String) As Boolean If IsDate(StrDate) = False Then Debug.Print "日付がNG" IsThisMonth = False Exit Function End If If DatePart("m", Date) = DatePart("m", StrDate) Then Debug.Print "返品OK" IsThisMonth = True Else Debug.Print "返品NG" IsThisMonth = False End If End Function
となるでしょうか。
イミディエイトウィンドウ(Ctrl + G)で下記を実行すれば検証できます。
IsThisMonth "★対象となる日付(例:2017/04/13)"
仮に「3か月以内なら返品OK」って関数を作るとすれば、
Public Function IsWithinThreeMonths(StrDate As String) As Boolean If IsDate(StrDate) = False Or CDate(StrDate) > Date Then Debug.Print "日付がNG" IsWithinThreeMonths = False Exit Function End If If DateAdd("m", -3, Date) < CDate(StrDate) Then Debug.Print "返品OK" IsWithinThreeMonths = True Else Debug.Print "返品NG" IsWithinThreeMonths = False End If End Function
となるでしょうか。
イミディエイトウィンドウ(Ctrl + G)で下記を実行すれば、検証できます。
IsWithinThreeMonths "★対象となる日付(例:2017/04/13)"
Sponsored Links
日付書式に変換
仮に "20170413" という文字列の場合、VBAは文字列や数値として判断してしまい、日付として解釈してくれません。これを "YYYYMMDD" 形式といいますが、日付として解釈させるには、事前に変換する処理をおこないます。
イミディエイトウィンドウ(Ctrl + G)で下記を実行すれば、検証できます。
?Format("20170413", "@@@@/@@/@@") 2017/04/13 ?Format("20170413", "@@@@-@@-@@") 2017-04-13
このように Format 関数を使って日付文字列に変換し、CDate 関数で日付型に変換してやれば Date 関数の返す今日の日付と比較できるようになります。
サンプルを書くとこんな感じでしょうか。
Dim StrDate As String StrDate = Format("20170413", "@@@@/@@/@@") If CDate(StrDate) = Date Then Debug.Print "今日です。" Else Debug.Print "今日以外です。" End If
まとめ
VBAで日付(Date)比較する方法を紹介しました。
Excelの場合、セルが”日付”になっていれば日付型として値がとれますので、そのまま比較することができます。文字列になっている場合のみ、色々と変換が必要になりますのでご注意を。この辺りが理解できずに苦しむ方、ハマっちゃう方が多いのではないでしょうか。
どのプログラム言語でもいえることですが、日付の解釈は人にとっては簡単に理解できることでも、機械に理解させるためには工夫が必要です。基本をしっかりおさえて実務でも使えるようにしたいですね。
おつかれさまでした。
Sponsored Links