【VBA】日付の比較・計算方法

Access

VBAで日付の比較・計算を行う方法、および注意点を説明いたします。

日付と認識できるかを判定する方法

まず、扱う変数がString型(文字列)の場合は、日付として認識できる文字列でないと、正しく扱えません。
そこで、扱う変数が日付以外の可能性がある場合は、IsDate関数で日付かどうかを判定できます。

Debug.Print IsDate("2025/3/16")			'結果は「True」
Debug.Print IsDate("2025.3.16")			'結果は「False」
Debug.Print IsDate("2025/03/16")		'結果は「True」
Debug.Print IsDate("20250316")			'結果は「False」
Debug.Print IsDate("2025年3月16日")		'結果は「True」
Debug.Print IsDate("令和7年3月16日")		'結果は「True」
Debug.Print IsDate("R7/3/16")			'結果は「True」

日付の比較方法

日付変数の場合

扱う変数がDate型(日付変数)の場合は、何も考えずに不等号で比較できます。

Dim Dt1 As Date, Dt2 As Date
Dt1 = "2025/3/1"
Dt2 = "2025/03/10"

Debug.Print Dt1 < Dt2   '結果は「True」

「3月」の部分の形式をわざと変えて、「3月」と「03月」で比較しましたが、Date型のため、そんな事はお構いなくどちらも「3月」として認識されるので、正しく比較できます。

文字列の場合

しかし、変数がString型(文字列)の場合は、形式が合っていないと正しく比較できません。

Dim St1 As String, St2 As String
St1 = "2025/3/1"
St2 = "2025/03/10"

Debug.Print St1 < St2   '結果は「False」

このような場合は、CDate関数を使って日付変数に変換すれば、正しく比較できます。
※日付として認識できない文字列に対してCDate関数を使うと、「型が一致しません」というエラーになります。

Dim St1 As String, St2 As String
St1 = "2025/3/1"
St2 = "2025/03/10"

Debug.Print CDate(St1) < CDate(St2)   '結果は「True」

現在の日付と比較するときの注意点

現在の日付を求める方法として、Now関数Date関数があります。

  • Now関数:時間を含めて取得(例 2025/3/16 13:52:10)
  • Date関数:日付のみ取得(例 2025/3/16)

そのため、日付のみを比較したい場合は、Date関数を使う必要があります。
Now関数を使うと、時刻を含めて比較してしまうため、意図した通りに比較できない可能性があります。

Dim Dt1 As Date
Dt1 = "2025/3/16"

'例:現在の日付が「2025/3/16の場合」
Debug.Print Dt1 < Now
'「2025/3/16 00:00:00」<「2025/3/16 13:52:10」のように
'時刻を含めて比較するため、結果は「True」

Debug.Print Dt1 < Date
'「2025/3/16」<「2025/3/16」のように
'日付のみを比較するため、結果は「False」

日付の計算方法

日数のみを計算する場合

Date型(日付変数)に対して、「2日後」「2日前」のように日数のみを計算したい場合、何も考えずにそのまま加算・減算できます。

Dim Dt1 As Date
Dt1 = "2025/3/1"
Debug.Print Dt1 + 2     '2日後(結果は2025/3/3)
Debug.Print Dt1 - 2     '2日前(結果は2025/2/27)

また、引き算をすることで差分の計算もできます。

Dim Dt1 As Date
Dt1 = "2025/3/1"
Dt2 = "2025/3/4"
Debug.Print Dt2 - Dt1   '結果は「3」

加算・減算を行う関数(DateAdd関数)

DateAdd関数を使うと、日付だけでなく、年月や時間の加算・減算もできます。

記述方法

DateAdd(時間間隔, 追加する数値, 基準日)

第1引数の「時間間隔」に設定できる値は、以下の通りです。

設定値内容
yyyy
q四半期
m
y年間通算日
d
w週日
ww
h
n
s
スクロールできます

第2引数の「追加する数値」にマイナスの値を設定すると、過去の日付を求めることが出来ます。

Debug.Print DateAdd("m", 2, "2025/3/1")     '結果は「2025/5/1」
Debug.Print DateAdd("yyyy", -2, "2025/3/1") '結果は「2023/3/1」

差分を計算する関数(DateDiff関数)

DateDiff関数を使うと、日付だけでなく、年月や時間の差分も計算できます。

記述方法

DateDiff(時間間隔, 日付1, 日付2[, 週の始まりの曜日[, 年の第1週]])
  • 第1引数の「時間間隔」は、DateAdd関数と同様です。
  • 第2引数・第3引数の2つの日付の差分を計算します。
  • 第4引数の「週の始まりの曜日」は省略可能です。(というか私は使ったことがありません。)
    省略すると「日曜日」になります。
  • 第5引数の「年の第1週」は省略可能です。(というか私は使ったことがありません。)
    省略すると「1月1日を含む週」になります。

Debug.Print DateDiff("m", "2025/3/1", "2026/4/1")       '結果は「13」
Debug.Print DateDiff("yyyy", "2025/3/1", "2026/4/1")    '結果は「1」

日付の形式変換(Format関数)

最後に、形式変換を行うFormat関数をご説明します。
ワークシート関数のText関数と、ほぼ同じことができます。

記述方法

Format(変換元の日付,変換したい書式)

第2引数の「変換したい書式」の詳細は、Microsoftの公式サイトに委ねるとして、具体例を見て頂いたほうがわかりやすいかと思います。

Debug.Print Format("2025/3/16", "yyyy/mm/dd")		'結果は「2025/03/16」月日にゼロを付けて2桁で表示
Debug.Print Format("2025/3/16", "yyyy/m/d")		'結果は「2025/3/16」 月日にゼロを付けずに表示
Debug.Print Format("2025/3/16", "yyyy/m/d(aaa)")	'結果は「2025/3/16(日)」曜日を表示
Debug.Print Format("2025/3/16", "ggge年m月d日")		'結果は「令和7年3月16日」和暦で表示
Debug.Print Format("2025/3/16", "ge/m/d")			'結果は「R7/3/16」   和暦の省略形

コメント

タイトルとURLをコピーしました