VBA 日付(Date)比較する方法 ホームページ制作 | 墨田区

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

LINEで送る
Pocket

VBAで日付(Date)比較する方法のご紹介です(正確には、日付文字列(String)となります)。
VBA 日付(Date)比較する方法

日付の比較としては、今日より過去の日付なのか、未来なのか、何日前なのか、何日後なのか・・・求めたいケースは様々あると思います。今月中なら OK で、それ以外なら NG なんてのも実務ではよく使う日付比較ですね。

ここでは 最も簡単な日付比較の方法と、日付の比較によく使われている「DateDiff」、「DateAdd」、「DatePart」の関数を使って、日付の比較 をしたいと思います。




【PR】マジか?!「アレ」してるLINEスタンプっていったい・・・


最も簡単な日付比較の方法

最も簡単な日付比較の方法はこちらです。
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

まとめ

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

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

おつかれさまでした。

LINEで送る
Pocket

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

コメントを残す

コメント(必須)

お名前 (必須)
メールアドレス
(アドレスは公開されません)

Trackback URL