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

今回の目標

「今日から月末までの日付を求めたい!」や「残り何時間か計算をしたい!」と思ったあなたへ。
この記事では、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

関連リンク

ページの先頭へ