VBA 日付(Date)比較する方法
VBAで日付(Date)比較する方法です。
正確には日付文字列(String)となります。
日付の比較としては、今日より過去の日付なのか、未来なのか、何日前なのか、何日後なのか・・・求めたいケースは様々あると思います。今月中なら OK で、それ以外なら NG なんてのも実務ではよく使う日付比較ですね。
ここでは 最も簡単な日付比較の方法と、日付の比較によく使われている「DateDiff」「DateAdd」「DatePart」の関数を使って日付の比較 をしたいと思います。
最も簡単な日付比較の方法
最も簡単な日付比較の方法はこちらです。
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関数で日付型に変換し、直接比較することができます。
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 (週)
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
第二引数には負の数を指定すると減算した日時を返します。
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)"
日付書式に変換
仮に "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の場合、セルが”日付”になっていれば日付型として値がとれますので、そのまま比較することができます。文字列になっている場合のみ、色々と変換が必要になりますのでご注意を。この辺りが理解できずに苦しむ方、ハマっちゃう方が多いのではないでしょうか。
どのプログラム言語でもいえることですが、日付の解釈は人にとっては簡単に理解できることでも、機械に理解させるためには工夫が必要です。基本をしっかりおさえて実務でも使えるようにしたいですね。
おつかれさまでした。