日付や時間の期間を計算する方法

今回の目標

「今日から月末までの日付を求めたい!」や「残り何時間か計算をしたい!」と思ったあなたへ。
この記事では、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」の定数についてです。
週を基準にした日付計算を行う場合にのみ使用します。

記号説明
vbUseSystem0NLS API 設定
vbSunday1日曜日 (既定)
vbMonday2月曜日
vbTuesday3火曜日
vbWednesday4水曜日
vbThursday5木曜日
vbFriday6金曜日
vbSaturday7土曜日

第五引数「firstweekofyear」の定数についてです。
週を基準にした日付計算を行う場合にのみ使用します。

記号説明
vbUseSystem0NLS API 設定
vbFirstJan111 月 1 日が含まれる週から開始(既定)
vbFirstFourDays2新年で少なくとも 4 日ある最初の週から開始
vbFirstFullWeek3年の最初の完全な週から開始

年の期間を計算する

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

関連リンク

ページの先頭へ