Excel VBAでは、2つの日付を比較して「同じ日か」「指定日より前か」「指定日以降か」を判定したい場面がよくあります。
たとえば、期限を過ぎたデータだけを抽出したり、今日以降の日付だけを処理したり、指定期間内のデータを判定したりする処理です。
VBAの日付はDate型として扱えるため、基本的には=、<、>、<=、>=といった比較演算子で判定できます。
ただし、セルから取得した値が文字列になっていたり、日付に時刻が含まれていたりすると、見た目では同じ日でも期待どおりに判定できないことがあります。
特に実務では、Excel上に「2026/9/5」と表示されていても、内部では「2026/9/5 15:30:00」のように時刻を含んでいるケースがあります。
この記事では、VBAで日付を比較する基本から、同じ日・前後・以前・以降を正しく判定する方法、実務で注意したい時刻の扱いまで順番に解説します。
✅ VBAで日付を比較する基本と比較演算子の使い方
VBAの日付比較は比較演算子を使えば簡単に記述できますが、「Excelに表示されている日付文字列を比較している」と考えると後で混乱しやすくなります。VBAではDate型の日付を内部的な値として扱えるため、日付の前後関係も数値と同じように比較できます。
一方、セルから取得したデータが必ずDate型として扱えるとは限らず、文字列や空白が混在している場合には注意が必要です。また、「以前」と「より前」、「以降」と「より後」では基準日を含むかどうかも異なります。この違いを曖昧にすると、期限判定などで基準日当日のデータが抜ける原因になります。まずは比較演算子と日付の関係を整理しておきましょう。
・VBAで日付比較に使用する演算子
日付を比較するときは、主に次の比較演算子を使用します。
| 判定内容 | 演算子 | 例 |
|---|---|---|
| 同じ日時 | = | date1 = date2 |
| 異なる日時 | <> | date1 <> date2 |
| 指定日時より前 | < | date1 < date2 |
| 指定日時より後 | > | date1 > date2 |
| 指定日時以前 | <= | date1 <= date2 |
| 指定日時以降 | >= | date1 >= date2 |
特に注意したいのが、<と<=、>と>=の違いです。
たとえば基準日が「2026/9/5」の場合、
targetDate < baseDate
では、基準日そのものは条件に含まれません。
一方、
targetDate <= baseDate
なら、基準日と同じ値も条件に含まれます。
「期限日より前」と「期限日以前」では結果が変わるため、業務上の条件を確認して演算子を選ぶことが重要です。
・Date型の変数を使って日付を比較する例
2つの日付を比較する基本例を確認してみましょう。
Sub CompareDates()
Dim targetDate As Date
Dim baseDate As Date
targetDate = DateSerial(2026, 9, 1)
baseDate = DateSerial(2026, 9, 5)
' 対象日が基準日より前か判定する
If targetDate < baseDate Then
MsgBox "対象日は基準日より前です。"
End If
End Sub
この例では、
targetDate:比較する対象の日付baseDate:比較の基準となる日付
という役割が分かる変数名にしています。
また、
DateSerial(2026, 9, 1)
のようにDateSerial関数を使って日付を作成しています。
コード内で日付を扱う場合、文字列として日付を書いて暗黙的な変換に任せるより、Date型として扱うことを明確にした方が処理の意図を把握しやすくなります。
比較する基準日をVBA側で作成する場合は、DateSerial関数を利用すると年・月・日を明確に指定できます。月末や翌月などを含めて基準日を動的に作成したい場合は、日付の生成方法もあわせて理解しておくと比較処理へ応用しやすくなります。
👉 【VBA】DateSerial関数の完全ガイド|日付計算を安全に行う実務設計では、DateSerialによる日付の作成から日付計算への応用まで詳しく解説しています。
✅ VBAで2つの日付が同じ日か判定する方法
「同じ日かどうか」は単純に=で比較すればよいように見えますが、実務では注意が必要です。日付だけが入力されているデータ同士なら問題になりにくいものの、時刻が含まれていると同じ日でも一致しないことがあります。Excelでは表示形式によって時刻部分を非表示にできるため、画面上では同じ「2026/9/5」に見えても内部値が異なるケースがあります。この状態で=を使うと、「同じ日に見えるのになぜFalseになるのか」という問題につながります。
特にNow関数で取得した日時や、システムから出力されたデータには時刻が含まれることがあります。「同じ日時」を調べるのか、「年月日だけが同じ」を調べるのかを区別することが重要です。
・時刻を含まない日付同士をイコールで比較する
時刻を含まないDate型の値であれば、=を使って比較できます。
Sub CheckSameDate()
Dim firstDate As Date
Dim secondDate As Date
firstDate = DateSerial(2026, 9, 5)
secondDate = DateSerial(2026, 9, 5)
If firstDate = secondDate Then
MsgBox "同じ日付です。"
Else
MsgBox "異なる日付です。"
End If
End Sub
この例では両方とも同じ日付なので、条件はTrueになります。
日付だけを扱うデータであれば、この方法はシンプルで分かりやすい書き方です。
ただし、次の2つは事情が異なります。
2026/9/5 10:00
2026/9/5 15:00
年月日は同じですが、時刻が異なります。
VBAで日時をそのまま比較すると、
firstDate = secondDate
はFalseになります。
つまり、=が判定しているのは画面上の日付表示が同じかどうかではなく、Date型として保持している日時の値が同じかどうかです。
・DateValueで時刻を除外して同じ日か比較する
時刻を無視して年月日だけを比較したい場合は、DateValue関数を利用できます。
Sub CheckSameDayIgnoringTime()
Dim firstDate As Date
Dim secondDate As Date
firstDate = DateSerial(2026, 9, 5) + TimeSerial(10, 0, 0)
secondDate = DateSerial(2026, 9, 5) + TimeSerial(15, 0, 0)
' 時刻を除外して年月日だけを比較する
If DateValue(firstDate) = DateValue(secondDate) Then
MsgBox "同じ日です。"
Else
MsgBox "異なる日です。"
End If
End Sub
この場合、
firstDate → 2026/9/5 10:00
secondDate → 2026/9/5 15:00
と時刻は異なりますが、DateValueで日付部分を取り出して比較するため「同じ日」と判定できます。
実務では、
- 更新日時
- 登録日時
- CSVなどから取得した日時
- Now関数で記録した日時
など、日付と時刻がセットになったデータを扱うことがあります。
このようなデータを「同じ日か」という業務条件で判定するなら、時刻を含めるのか除外するのかを先に決めておくことが重要です。
✅ VBAで指定日より前・後の日付を判定する
日付比較を実務で利用する場合、「同じ日」だけでなく指定日より前または後のデータを判定するケースが多くあります。たとえば期限を過ぎたデータを検出したり、今日より未来の日付だけを処理したりする場面です。ここで注意したいのが、基準日当日を条件へ含めるかどうかです。「より前」と「以前」、「より後」と「以降」を同じ意味でコードにすると、境界の日付で判定結果が変わってしまいます。業務上の期限ではこの1日の違いが重要になることもあります。
また、基準日に時刻が含まれている場合は、単純な日付比較とは結果が異なる可能性があります。まずは時刻を含まない日付を使って、前後を判定する基本を確認しましょう。
・指定日より前かを判定する方法
対象日が基準日より前か調べる場合は、<を使用します。
Sub CheckDateBefore()
Dim targetDate As Date
Dim baseDate As Date
targetDate = DateSerial(2026, 9, 1)
baseDate = DateSerial(2026, 9, 5)
If targetDate < baseDate Then
MsgBox "対象日は基準日より前です。"
Else
MsgBox "対象日は基準日より前ではありません。"
End If
End Sub
この場合、「2026/9/1」は「2026/9/5」より前なのでTrueになります。
一方、両方が「2026/9/5」であればFalseです。
基準日も含めたい場合は、
targetDate <= baseDate
とします。
この違いが、「より前」と「以前」の違いです。
・指定日より後かを判定する方法
反対に、基準日より後かを判定する場合は>を使用します。
Sub CheckDateAfter()
Dim targetDate As Date
Dim baseDate As Date
targetDate = DateSerial(2026, 9, 10)
baseDate = DateSerial(2026, 9, 5)
If targetDate > baseDate Then
MsgBox "対象日は基準日より後です。"
Else
MsgBox "対象日は基準日より後ではありません。"
End If
End Sub
基準日そのものも含めて「基準日以降」と判定する場合は、
targetDate >= baseDate
を使用します。
整理すると、
< 基準日より前
<= 基準日以前
> 基準日より後
>= 基準日以降
となります。
単純な違いですが、期限管理や対象期間の抽出では非常に重要です。
✅ VBAで今日以前・今日以降の日付を比較する
実務の日付比較では、固定された2つの日付だけでなく「今日」を基準に判定するケースが多くあります。たとえば、期限切れデータの確認、今日以降の予定の抽出、処理対象日の判定などです。このとき注意したいのが、DateとNowでは取得する情報が異なることです。今日という日付だけを基準にしたい処理へ時刻まで含めてしまうと、同じ日のデータでも条件から外れる可能性があります。
また、「今日より前」と「今日以前」、「今日より後」と「今日以降」でも条件は異なります。日次処理では境界となる今日を含めるかどうかが結果に直接影響するため、業務条件に合わせて比較演算子を選ぶことが重要です。
・Dateを使って今日以前か判定する方法
今日の日付を基準にする場合は、Date関数を利用できます。
たとえば、対象日が今日以前かを判定するコードは次のようになります。
Sub CheckDateOnOrBeforeToday()
Dim targetDate As Date
targetDate = DateSerial(2026, 9, 1)
' 対象日が今日以前か判定する
If targetDate <= Date Then
MsgBox "対象日は今日以前です。"
Else
MsgBox "対象日は今日より後です。"
End If
End Sub
ポイントは、
targetDate <= Date
としていることです。
Dateは現在の日付を返すため、基準日をコード内へ固定する必要がありません。
条件を変更すれば、
targetDate < Date
なら今日より前、
targetDate >= Date
なら今日以降、
targetDate > Date
なら今日より後
を判定できます。
期限切れだけを判定したいのか、期限当日も対象にするのかによって演算子を使い分けましょう。
・日付だけの比較ではDateとNowを混同しない
現在日時を取得する方法にはNowもあります。
ただし、
Now
には日付だけでなく現在時刻も含まれます。
たとえば今日の日付が「2026/9/5」で、現在時刻が15:00なら、イメージとしては次のような違いがあります。
Date → 2026/9/5
Now → 2026/9/5 15:00
対象データが「2026/9/5 10:00」の場合、
targetDate < Now
ならTrueになります。
しかし、これは「今日より前」という意味ではなく、正確には現在日時より前という判定です。
「今日以前のデータ」を判定したいのであればDate、「現在時刻を過ぎたデータ」を判定したいのであればNowというように、比較したい単位に合わせて使い分けることが大切です。
今日を基準に日付を比較するときは、DateとNowのどちらを使用するかによって、日付だけで判定するのか、現在時刻まで含めて判定するのかが変わります。期限管理などで今日の日付を基準にする処理を作る場合は、両者の違いも理解しておくと安全です。
👉 【VBA】今日の日付を取得する方法|Date・Nowの違いと使い分けでは、DateとNowで取得できる値の違いと実務での使い分けを詳しく解説しています。
✅ VBAでセルに入力された日付を安全に比較する
コード内でDate型の変数同士を比較する場合と違い、Excelセルの値を扱う場合は少し注意が必要です。業務で使用されているシートには、正しい日付だけでなく空白や文字列、入力ミスなどが混在する可能性があります。その状態で「この列には日付しか入らない」と決めつけて処理すると、想定外のデータでエラーが発生することがあります。
一方、すべての値を無条件にCDateで変換すれば安全になるわけでもありません。日付として扱えるか確認してから比較処理へ進める方が、異常データの存在にも気付きやすくなります。特に他の担当者が入力するファイルを自動処理する場合は、正常データだけを前提にしない設計が重要です。
・IsDateで確認してからセルの日付を比較する方法
たとえばA2セルの日付が今日以前か判定する場合、次のように記述できます。
Sub CompareCellDate()
Dim ws As Worksheet
Dim cellValue As Variant
Dim targetDate As Date
Set ws = ThisWorkbook.Worksheets("一覧")
' セルの値を取得する
cellValue = ws.Range("A2").Value
' 日付として扱える値か確認する
If IsDate(cellValue) Then
targetDate = CDate(cellValue)
If targetDate <= Date Then
MsgBox "A2の日付は今日以前です。"
Else
MsgBox "A2の日付は今日より後です。"
End If
Else
MsgBox "A2には日付として扱えない値が入力されています。"
End If
End Sub
処理の流れは次のとおりです。
- セルの値をVariant型で取得する
IsDateで日付として扱えるか確認する- 問題なければ
CDateでDate型として受け取る - Dateと比較して今日以前か判定する
- 日付として扱えない場合は別の処理へ分岐する
ここでは、IsDateやCDateそのものを使うことが目的ではありません。
日付比較へ進む前に、比較可能なデータか確認するために使用しています。
実務では日付として扱えないデータを単純に無視するのではなく、対象セルを記録したり、入力内容の確認を促したりする方法も検討するとよいでしょう。
セルの値を日付比較へ使用する場合は、比較する前に日付として扱えるデータか確認しておくことが重要です。特に空白・文字列・入力形式の異なるデータが混在するシートでは、IsDateやCDateなどを適切に使い分けることで想定外のエラーを防ぎやすくなります。
👉 【VBA】日付かどうか判定する方法|IsDate・CDate・DateValue・VarTypeの使い分けでは、セルや変数の値を日付として扱えるか判定する方法を詳しく解説しています。
✅ VBAで開始日から終了日までの期間内か判定する
日付比較では、「指定日より前・後」だけでなく、対象日が一定の期間内に入っているか判定したいこともあります。たとえば月次処理の対象期間、キャンペーン期間、申請受付期間などです。この場合は開始日と終了日の2つを基準にして判定します。ここでも重要になるのが、開始日と終了日を条件に含めるかどうかです。
また、2つの条件を別々のIf文へ分散すると、どの期間を判定しているのか読み取りにくくなる場合があります。期間判定では境界条件を明確にし、開始から終了までという1つの業務条件として表現すると理解しやすくなります。
・AND条件で指定期間内の日付を判定する方法
対象日が開始日以上、終了日以下であれば期間内と判定できます。
Sub CheckDateInRange()
Dim targetDate As Date
Dim startDate As Date
Dim endDate As Date
targetDate = DateSerial(2026, 9, 15)
startDate = DateSerial(2026, 9, 1)
endDate = DateSerial(2026, 9, 30)
' 開始日から終了日までの範囲内か判定する
If targetDate >= startDate And targetDate <= endDate Then
MsgBox "対象日は指定期間内です。"
Else
MsgBox "対象日は指定期間外です。"
End If
End Sub
条件部分を見ると、
targetDate >= startDate And targetDate <= endDate
となっています。
これは、
対象日 >= 開始日
かつ
対象日 <= 終了日
という意味です。
>=と<=を使用しているため、開始日と終了日そのものも期間内に含まれます。
もし開始日を含めたくないのであれば>、終了日を含めたくないのであれば<へ変更します。
期間判定では「○月1日から○月30日まで」という日本語だけで判断せず、両端の日付を含むのかを業務ルールとして確認してからコードへ落とし込むことが重要です。
✅ VBAで時刻を含む日付比較をするときの注意点
日付比較で特にトラブルになりやすいのが、時刻を含むデータです。Excelのセルに「2026/9/5」と表示されていても、内部では時刻を含んでいる可能性があります。この違いはセルの表示だけでは気付きにくいため、「同じ日なのに条件に一致しない」という原因になりがちです。
さらに、期限日を「2026/9/5」と設定して<=で比較した場合、時刻を含む同日データが範囲外になることもあります。表示形式を変更して時刻を隠しても、内部値から時刻が削除されるわけではありません。日単位で比較するのか、日時単位で比較するのかを明確にしたうえで処理する必要があります。
・期限日当日の時刻が条件から外れるケース
たとえば次の値を比較するとします。
対象日時:2026/9/5 10:00
期限日 :2026/9/5 00:00
次の条件では、
If targetDate <= deadlineDate Then
対象日時は期限日より大きいためFalseになります。
同じ9月5日でも、10:00は0:00より後だからです。
もし業務上の条件が「9月5日中なら期限内」であれば、時刻を無視して比較する必要があります。
If DateValue(targetDate) <= DateValue(deadlineDate) Then
MsgBox "期限内です。"
End If
一方、「9月5日の12:00まで」といった期限なら、時刻を除外してはいけません。
この場合は日時をそのまま比較します。
つまり、
日単位の条件 → 時刻を除外して比較
日時単位の条件 → 時刻を含めて比較
と考えることができます。
どちらが正しいかはコードではなく、業務上の期限が何を意味しているかによって決まります。
日付に時刻が含まれると比較結果が変わるのは、ExcelやVBAが日付と時刻を内部的な値として扱っているためです。「同じ日に見えるのに比較結果が一致しない」という仕組みまで理解しておくと、日時を扱うマクロの原因調査もしやすくなります。
👉 【VBA】時間の計算ができる仕組みとは?シリアル値を理解して日付・時刻を正しく扱う方法では、日付と時刻が内部でどのような値として管理されているのかを詳しく解説しています。
✅ VBAの日付比較を期限管理に活用する実務例
日付比較の構文を覚えても、実際の業務ではセルの取得、データ確認、比較、結果処理を組み合わせる必要があります。特に期限管理では、日付として扱えない値をどうするか、期限当日を期限切れに含めるかなど、コードを書く前に決めるべき条件があります。
また、判定だけを作り込んでも、対象データの意味がコードから分からなければ後から改修しにくくなります。変数名やコメントで業務上の役割を明確にしておくことも重要です。ここでは、セルに設定された期限を今日と比較するシンプルな例で、これまでの内容を組み合わせて確認します。
・期限日を今日と比較して期限切れを判定する例
A2に期限日が入力されているとします。
期限日より今日の方が後なら、期限切れとして判定します。
Sub CheckDeadline()
Dim ws As Worksheet
Dim deadlineValue As Variant
Dim deadlineDate As Date
Set ws = ThisWorkbook.Worksheets("期限管理")
' 期限日の値を取得する
deadlineValue = ws.Range("A2").Value
' 日付として比較できることを確認する
If Not IsDate(deadlineValue) Then
MsgBox "期限日に正しい日付が入力されていません。"
Exit Sub
End If
deadlineDate = CDate(deadlineValue)
' 期限日より今日が後なら期限切れ
If Date > DateValue(deadlineDate) Then
MsgBox "期限を過ぎています。"
Else
MsgBox "期限内です。"
End If
End Sub
この例では、期限当日は期限切れにしていません。
条件が、
Date > DateValue(deadlineDate)
だからです。
もし「期限当日になった時点で処理対象にしたい」という仕様なら、条件は変わります。
このように、日付比較ではコードを書く前に、
- 基準日を含めるのか
- 時刻を考慮するのか
- 不正な日付をどう扱うのか
- 今日を基準にするのか別の日付を基準にするのか
を整理しておくことが大切です。
✅ まとめ:VBAの日付比較で同じ日・以前・以降を正しく判定しよう
VBAではDate型の日付を比較演算子で比較することで、同じ日・前後・以前・以降などを判定できます。しかし、実務では単純に<や>を覚えるだけでは十分ではありません。基準日を条件に含めるか、日付に時刻が含まれているか、セルの値が日付として扱えるかなどによって判定結果が変わります。
特に期限管理や期間判定では、境界条件を曖昧にすると対象データの抜けや誤判定につながります。日付をどの単位で比較するのかを明確にしてから、適切な方法を選択しましょう。
=で同じ日時かどうかを比較できる<と>は基準日を含まない前後判定に使用する<=と>=を使えば基準日を含む以前・以降を判定できる- 時刻を無視して同じ日か比較する場合はDateValueを利用できる
- 今日の日付を基準にする場合はDateを利用できる
- Nowは現在時刻まで含むため、Dateとの違いに注意する
- セル値はIsDateで確認してから日付として比較すると安全
- 指定期間内かどうかは開始日以上かつ終了日以下などのAND条件で判定できる
- 日単位の比較と日時単位の比較を明確に分ける
- 期限管理では「期限当日を含むか」という業務条件を先に決める
まずはDate型の変数を使った基本的な比較から始め、セルデータや期限管理へ応用すると理解しやすくなります。日付の内部値と時刻の扱いまで意識できるようになれば、期限判定・期間抽出・予定管理など、さまざまなExcel業務をVBAで安全に自動化できるようになります。