VBA 日付(Date)比較する方法

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の場合、セルが”日付”になっていれば日付型として値がとれますので、そのまま比較することができます。文字列になっている場合のみ、色々と変換が必要になりますのでご注意を。この辺りが理解できずに苦しむ方、ハマっちゃう方が多いのではないでしょうか。

どのプログラム言語でもいえることですが、日付の解釈は人にとっては簡単に理解できることでも、機械に理解させるためには工夫が必要です。基本をしっかりおさえて実務でも使えるようにしたいですね。

おつかれさまでした。

この記事がお役に立ちましたら シェア をお願いいたします。