日付や時間の期間を計算する方法
今回の目標
「今日から月末までの日付を求めたい!」や「残り何時間か計算をしたい!」と思ったあなたへ。
この記事では、DateDiff関数の使い方を丁寧に解説します!
目標リスト
- DateDiff関数で日付や時間の期間の計算ができるようになる
DateDiff関数について
DateDiff関数とは
DateDiff関数とは、2つの日付や時刻の差(期間)を求めて返す関数です。
例えば「2025/11/11 と 2025/11/22 は何日あるか」を計算して『11』を返します。
DateDiff関数の構文など
DateDiff 関数の構文
DateDiff (interval, date1, date2, [firstdayofweek], [firstweekofyear])
戻り値
date1 から date2 までの期間を、指定した間隔(interval)単位で返します。戻り値は Long 型です。
例えば、intervalを 月 を指定し、date1 に 2025/10/11、date2 に 2025/11/22 を指定した場合、date1 から date2 までに経過した「月」の数が 1 なので、「1」を返します。
要するに、date2 - date1 の差を、指定した間隔単位で求める関数です。
このとき、指定した間隔より小さい単位は切り捨てられます。 つまり、「月」単位で指定した場合は、「日」以下は計算に含まれません。
【例】
・10/15 ~ 12/15 → 2か月
・10/31 ~ 12/1 → 同じく 2か月(端数は切り捨て)
・2025/10/31 ~ 2026/12/1 → 14か月
DateDiff 関数の引数一覧
※一部、Microsoft社のリファレンスを参照しています。
【Microsoft公式】
DateDiff 関数
| 引数名 | 省略 | 規定値 | 説明 |
|---|---|---|---|
| interval | 不可 | - | 時間間隔の計算に使用する時間単位を表す文字列 |
| date1 | 不可 | - | 基準日1 |
| date2 | 不可 | - | 基準日2 |
| firstdayofweek | 可能 | vbSunday (=1) | 週の始まりの曜日を表す定数 |
| firstweekofyear | 可能 | vbFirstJan1 (=1) | 年の第 1 週を指定する定数 |
第一引数「interval」の定数についてです。
例えば、"yyyy" を指定すると年の計算をします。
| 記号 | 説明 |
|---|---|
| yyyy | 年 |
| m | 月 |
| d | 日 |
| h | 時 |
| n | 分 |
| s | 秒 |
| q | 四半期 |
| y | 通年での日数 |
| w | 平日 |
| ww | 週 |
第四引数「firstdayofweek」の定数についてです。
週を基準にした日付計算を行う場合にのみ使用します。
| 記号 | 値 | 説明 |
|---|---|---|
| vbUseSystem | 0 | NLS API 設定 |
| vbSunday | 1 | 日曜日 (既定) |
| vbMonday | 2 | 月曜日 |
| vbTuesday | 3 | 火曜日 |
| vbWednesday | 4 | 水曜日 |
| vbThursday | 5 | 木曜日 |
| vbFriday | 6 | 金曜日 |
| vbSaturday | 7 | 土曜日 |
第五引数「firstweekofyear」の定数についてです。
週を基準にした日付計算を行う場合にのみ使用します。
| 記号 | 値 | 説明 |
|---|---|---|
| vbUseSystem | 0 | NLS API 設定 |
| vbFirstJan1 | 1 | 1 月 1 日が含まれる週から開始(既定) |
| vbFirstFourDays | 2 | 新年で少なくとも 4 日ある最初の週から開始 |
| vbFirstFullWeek | 3 | 年の最初の完全な週から開始 |
年の期間を計算する
DateDiff関数の第一引数に、"yyyy"を指定すると年の計算をします。なお、"y"ではないことに注意してください。
※ "y" は "d" と同様の動作をしますが、細かい仕様がバージョン等により異なります。
サンプルコード
Sub SampleDateDiff1_1()
Dim d1 As Date, d2 As Date, d3 As Date
d1 = DateSerial(2022, 10, 1) '2022年10月1日
d2 = DateSerial(2023, 12, 1) '2023年12月1日
d3 = DateSerial(2025, 11, 1) '2025年11月1日
Debug.Print d3 & " - " & d1 & " → " & _
"[yyyy]" & DateDiff("yyyy", d1, d3)
Debug.Print d3 & " - " & d2 & " → " & _
"[yyyy]" & DateDiff("yyyy", d2, d3)
End Sub
2025/11/01(土) - 2022/10/01(土) → [yyyy]3
2025/11/01(土) - 2023/12/01(金) → [yyyy]2
サンプルコード
Sub SampleDateDiff1_2()
Dim d1 As Date
Dim d2 As Date
Dim d3 As Date
d1 = DateSerial(2023, 12, 31) '2023年12月31日
d2 = DateSerial(2027, 7, 10) '2027年7月10日
d3 = DateSerial(2025, 9, 1) '2025年9月1日
Debug.Print d3 & " - " & d1 & " → " & _
"[yyyy]" & DateDiff("yyyy", d1, d3)
Debug.Print d3 & " - " & d2 & " → " & _
"[yyyy]" & DateDiff("yyyy", d2, d3)
End Sub
2025/09/01(月) - 2023/12/31(日) → [yyyy]2
2025/09/01(月) - 2027/07/10(木) → [yyyy]-2
月の期間を計算する
DateDiff関数の第一引数に、"m"を指定すると月の計算をします。
サンプルコード
Sub SampleDateDiff2_1()
Dim d1 As Date, d2 As Date, d3 As Date
d1 = DateSerial(2025, 8, 31) '2025年8月31日
d2 = DateSerial(2025, 9, 1) '2025年9月1日
d3 = DateSerial(2025, 9, 30) '2025年9月30日
Debug.Print d3 & " - " & d1 & " → " & _
"[m]" & DateDiff("m", d1, d3)
Debug.Print d3 & " - " & d2 & " → " & _
"[m]" & DateDiff("m", d2, d3)
End Sub
2025/09/30(火) - 2025/08/31(日) → [m]1
2025/09/30(火) - 2025/09/01(月) → [m]0
サンプルコード
Sub SampleDateDiff2_2()
Dim d1 As Date, d2 As Date, d3 As Date
d1 = DateSerial(2025, 8, 1) '2025年8月1日
d2 = DateSerial(2025, 8, 10) '2025年8月10日
d3 = DateSerial(2025, 10, 1) '2025年10月1日
Debug.Print d3 & " - " & d1 & " → " & _
"[m]" & DateDiff("m", d1, d3)
Debug.Print d3 & " - " & d2 & " → " & _
"[m]" & DateDiff("m", d2, d3)
End Sub
2025/10/01(水) - 2025/08/01(金) → [m]2
2025/10/01(水) - 2025/08/10(日) → [m]2
日の期間を計算する
DateDiff関数の第一引数に、"d"を指定すると日の計算をします。なお、"y" でも日の計算が出来ますが、バージョン等により仕様が異なります。安全なプログラムを作成するために"d"を指定しましょう。
サンプルコード1
Sub SampleDateDiff3_1()
Dim d1 As Date
Dim d2 As Date
d1 = DateSerial(2025, 9, 1) '2025年9月1日
d2 = DateSerial(2025, 9, 11) '2025年9月11日
Debug.Print d1 & " - " & d2 & " → " & _
"[d]" & DateDiff("d", d1, d2)
Debug.Print d2 & " - " & d1 & " → " & _
"[d]" & DateDiff("d", d2, d1)
End Sub
2025/09/01(月) - 2025/09/11(木) → [d]10
2025/09/11(木) - 2025/09/01(月) → [d]-10
サンプルコード2
Sub SampleDateDiff3_2()
Dim d1 As Date
Dim d2 As Date
'今日の日付
d1 = Date
'今月末の日付(来月末なら、+1 を +2 にする)
d2 = DateSerial(Year(d1), Month(d1) + 1, 0)
Debug.Print "今日の日付→" & d1
Debug.Print "月末の日付→" & d2
Debug.Print "月末までの日数" & _
"→" & DateDiff("d", d1, d2)
End Sub
今日の日付→2025/10/15(水)
月末の日付→2025/10/31(金)
月末までの日数→16
時間の期間を計算する
DateDiff関数の第一引数に、"h"を指定すると何時間経過したかの計算します。
サンプルコード1
Sub SampleDateDiff4_1()
Dim t1 As Date
Dim t2 As Date
Dim t3 As Date
t1 = TimeSerial(10, 16, 48) '10時16分48秒
t2 = TimeSerial(15, 38, 0) '15時38分00秒
t3 = TimeSerial(13, 27, 59) '13時27分59秒
'15時 - 10時 → 3時間
Debug.Print t3 & " - " & t1 & " → " & _
"[h]" & DateDiff("h", t1, t3)
'15時 - 13時 → -2h
Debug.Print t3 & " - " & t2 & " → " & _
"[h]" & DateDiff("h", t2, t3)
End Sub
13:27:59 - 10:16:48 → [h]3
13:27:59 - 15:38:00 → [h]-2
サンプルコード2
Sub SampleDateDiff4_2()
Dim d1 As Date
Dim d2 As Date
Dim d3 As Date
d1 = CDate("2025/8/3 10:16:48") '2025年8月3日 10時16分48秒
d2 = CDate("2025/8/4 15:38:00") '2025年8月4日 15時38分00秒
d3 = CDate("2025/8/3 13:27:59") '2025年8月3日 13時27分59秒
'8/3 13時 - 8/3 10時 → 3時間
Debug.Print d3 & " - " & d1 & " → " & _
"[h]" & DateDiff("h", d1, d3)
'8/3 13時 - 8/4 15時 → -26時間
Debug.Print d3 & " - " & d2 & " → " & _
"[h]" & DateDiff("h", d2, d3)
End Sub
2025/08/03(日) 13:27:59 - 2025/08/03(日) 10:16:48 → [h]3
2025/08/03(日) 13:27:59 - 2025/08/04(月) 15:38:00 → [h]-26
分の期間を計算する
DateDiff関数の第一引数に、"n"を指定すると数分経過したかの時間を計算します。
"h" ではなく、"n" です。
サンプルコード
Sub SampleDateDiff5_1()
Dim t1 As Date
Dim t2 As Date
Dim t3 As Date
t1 = TimeSerial(10, 15, 10) '10時15分10秒
t2 = TimeSerial(11, 35, 30) '11時35分50秒
t3 = TimeSerial(10, 20, 20) '10時20分20秒
'10時20分 - 10時15分 → 5m
Debug.Print t1 & " - " & t3 & " → " & _
"[n]" & DateDiff("n", t1, t3)
'10時20分 - 11時35分 → 75m
Debug.Print t3 & " - " & t2 & " → " & _
"[n]" & DateDiff("n", t2, t3)
End Sub
10:15:10 - 10:20:20 → [n]5
10:20:20 - 11:35:30 → [n]-75
秒の期間を計算する
DateDiff関数の第一引数に、"s"を指定すると数秒経過したかなどの時間を計算します。
サンプルコード1
Sub SampleDateDiff6_1()
Dim t1 As Date
Dim t2 As Date
Dim t3 As Date
t1 = TimeSerial(10, 15, 10) '10時15分10秒
t2 = TimeSerial(11, 35, 30) '11時35分50秒
t3 = TimeSerial(10, 20, 20) '10時20分20秒
'10時20分20秒 - 10時15分10秒 → 310秒(5m x 60 = 300)
Debug.Print t1 & " - " & t3 & " → " & _
"[s]" & DateDiff("s", t1, t3)
'10時20分20秒 - 11時35分30秒 → -4510秒(75m x 60 = 4500)
Debug.Print t3 & " - " & t2 & " → " & _
"[s]" & DateDiff("s", t2, t3)
End Sub
10:15:10 - 10:20:20 → [s]310
10:20:20 - 11:35:30 → [s]-4510
週の期間を計算する
DateDiff関数の第一引数に、"w"を指定すると何週経過したかなどの時間を計算します。
サンプルコード1
Sub SampleDateDiff7_1()
Dim d1 As Date: d1 = DateSerial(2025, 10, 1)
Dim d2 As Date: d2 = DateSerial(2025, 10, 5)
Dim d3 As Date: d3 = DateSerial(2025, 10, 8)
Debug.Print d3 & " - " & d1 & " → " & _
"[w]" & DateDiff("w", d1, d3)
Debug.Print d3 & " - " & d2 & " → " & _
"[w]" & DateDiff("w", d2, d3)
End Sub
2025/10/08(水) - 2025/10/01(水) → [w]1
2025/10/08(水) - 2025/10/05(日) → [w]0
週の始まりを指定して週の期間を計算する
DateDiff関数の第一引数に "ww" を、第4引数に曜日の定数を指定すると、その曜⽇を週の始まりとして、週の切り替えが何回発生したかを計算します。
つまり、火曜日を基準にすると「date1 ~ date2 の間に、火曜日始まりの週が何回切り替わったか(月曜日→火曜日が何回あったか」を返します。
サンプルコード1
Sub SampleDateDiff8_1()
Dim d1 As Date, d2 As Date, d3 As Date
d1 = DateSerial(2025, 10, 1) '2025/10/1 は、水曜日
d2 = DateSerial(2025, 10, 8) '2025/10/8 は、水曜日
d3 = DateSerial(2025, 10, 5) '2025/10/5 は、日曜日
'水曜 ~ 火曜 で計測(火曜→水曜の回数をカウント)
Debug.Print d1 & " ~ " & d2 & " → " & _
"[ww/水]" & DateDiff("ww", d1, d2, vbWednesday)
'木曜 ~ 水曜 で計測(水曜→木曜の回数をカウント)
Debug.Print d1 & " ~ " & d2 & " → " & _
"[ww/木]" & DateDiff("ww", d1, d2, vbThursday)
'水曜 ~ 火曜 で計測(火曜→水曜の回数をカウント)
Debug.Print d1 & " ~ " & d3 & " → " & _
"[ww/水]" & DateDiff("ww", d1, d3, vbWednesday)
End Sub
2025/10/01(水) ~ 2025/10/08(水) → [ww/水]1
2025/10/01(水) ~ 2025/10/08(水) → [ww/木]1
2025/10/01(水) ~ 2025/10/05(日) → [ww/水]0
