日数や時刻を計算する方法

今回の目標

「今日から3日後の日付を求めたい!」や「時刻の計算をしたい!」と思ったあなたへ。
この記事では、DateAdd関数の使い方を丁寧に解説します!

目標リスト

  • DateAdd関数で日数計算や時刻計算ができるようになる

DateAdd関数について

DateAdd関数とは

DateAdd関数とは、日付や期間を足して、その結果を返す関数です。
例えば「2025/11/11 の 11日後」を計算して『2025/11/22』を返します。

DateAdd関数の構文・引数一覧・戻り値

DateAdd 関数の構文

DateAdd (interval, number, date)

戻り値

Date 型の値が戻ります。

date に number の期間の間隔(=interval)を足した結果、Date型で返します。
例えば、intervalを間隔を日にち、date に 2025/10/20、number が15 だと、date に number を足した日付「2025/11/04(火)」を返します。

DateAdd 関数の引数一覧

※一部、Microsoft社のリファレンスを参照しています。
 【Microsoft公式】 DateAdd 関数

引数名省略規定値説明
interval不可-加算する日数や時間等の期間を表す文字列式
number不可-追加する日付や時間の間隔。正の数なら●日などになり、負の数なら〇日などとなる
date不可-基準日

第一引数「interval」の定数についてです。
例えば、"yyyy" を指定すると年の計算をします。

記号説明
yyyy
m
d
h
n
s
q四半期
y通年での日数
w平日
ww

〇年前後を計算する

DateAdd関数の第一引数に、"yyyy"を指定すると年の計算をします。なお、"y"ではないことに注意してください。
※ "y" は "d" と同様の動作をしますが、細かい仕様がバージョン等により異なります。

サンプルコード

Sub SampleDateAdd1_1()
    Dim d As Date
    
    d = DateSerial(2025, 11, 1)
    Debug.Print "基準日→" & d
    Debug.Print "・1年前→" & DateAdd("yyyy", -1, d)
    Debug.Print "・1年後→" & DateAdd("yyyy", 1, d)
End Sub
【実行例】

基準日→2025/11/01(土)
・1年前→2024/11/01(金)
・1年後→2026/11/01(日)

〇か月前後を計算する

DateAdd関数の第一引数に、"m"を指定すると月の計算をします。

サンプルコード

Sub SampleDateAdd1_2()
    Dim d As Date
    
    d = DateSerial(2025, 12, 31)
    Debug.Print "基準日→" & d
    Debug.Print "・2か月前→" & DateAdd("m", -2, d)
    Debug.Print "・2か月後→" & DateAdd("m", 2, d)
End Sub
【実行例】

基準日→2025/12/31(水)
・2か月前→2025/10/31(金)
・2か月後→2026/02/28(土)

〇日前後を計算する

DateAdd関数の第一引数に、"d"を指定すると日の計算をします。なお、"y" でも日の計算が出来ますが、バージョン等により仕様が異なります。安全なプログラムを作成するために"d"を指定しましょう。

サンプルコード

Sub SampleDateAdd1_3()
    Dim d As Date
    
    d = DateSerial(2025, 10, 20)
    
    Debug.Print "基準日→" & d
    Debug.Print "・15日前→" & DateAdd("d", -15, d)
    Debug.Print "・15日後→" & DateAdd("d", 15, d)
End Sub
【実行例】

基準日→2025/10/20(月)
・15日前→2025/10/05(日)
・15日後→2025/11/04(火)

〇時間前後を計算する

DateAdd関数の第一引数に、"h"を指定すると1時間後などの時間を計算します。
時刻のみのデータで計算を行う場合、Format関数を併用した方が良いでしょう。 これは日をまたぐ計算(例:23時の2時間後)と、日付が繰り上がる(繰り下がる)ためです。
・リンク:Format関数で日付や時刻を整える方法(数値・文字の整形にも使えます)

サンプルコード1(日付と時刻のデータ)

Sub SampleDateAdd2_1_1()
    Dim t As Date
    
    t = CDate("2025/11/1 23:30:00")
    
    Debug.Print "基準日時→" & t
    Debug.Print "2時間前→" & DateAdd("h", -2, t)
    Debug.Print "2時間後→" & DateAdd("h", 2, t)
End Sub
【実行例】

基準日時→2025/11/01(土) 23:30:00
2時間前→2025/11/01(土) 21:30:00
2時間後→2025/11/02(日) 1:30:00

サンプルコード2(時刻だけのデータ)

時刻だけのデータを計算した結果、日付が変わった場合、Format 関数を使用しないと、年月日まで表示されてしまいます。

Sub SampleDateAdd2_1_2()
    Dim t As Date
    
    t = TimeSerial(23, 30, 45)
    
    Debug.Print "基準時間→" & t
    Debug.Print "2時間後(Format関数有り)" & vbNewLine & _
                " →" & Format(DateAdd("h", 2, t), "hh:nn:ss")
    Debug.Print "2時間後(Format関数無し)" & vbNewLine & _
                " →" & DateAdd("h", 2, t)
End Sub
【実行例】

基準時間→23:30:45
2時間後(Format関数有り)
 →01:30:45
2時間後(Format関数無し)
 →1899/12/31(日) 1:30:45

〇分前後を計算する

DateAdd関数の第一引数に、"n"を指定すると数分後などの時間を計算します。"h" ではなく、"n" です。
時刻のみのデータで計算を行う場合、Format関数を併用した方が良いでしょう。 これは日をまたぐ計算(例:23時30分の30分間後)と、日付が繰り上がる(繰り下がる)ためです。 この仕様についての詳細は「〇時間前後を計算する」のサンプルコード2を確認ください。
・リンク:Format関数で日付や時刻を整える方法(数値・文字の整形にも使えます)

サンプルコード

Sub SampleDateAdd2_2()
    Dim t As Date
    
    t = TimeSerial(23, 45, 0)
    
    Debug.Print "基準時間→" & t
    Debug.Print "30分前→" & _
                Format(DateAdd("n", -30, t), "hh:nn:ss")
    Debug.Print "30分後→" & _
                Format(DateAdd("n", 30, t), "hh:nn:ss")
    Debug.Print "30分後(Format関数無し)" & vbNewLine & _
                " →" & DateAdd("n", 30, t)
End Sub
【実行例】

基準時間→23:45:00
30分前→23:15:00
30分後→00:15:00
30分後(Format関数無し)
→1899/12/31(日) 0:15:00

〇秒前後を計算する

DateAdd関数の第一引数に、"s"を指定すると数秒後などの時間を計算します。
時刻のみのデータで計算を行う場合、Format関数を併用した方が良いでしょう。 これは日をまたぐ計算(例:23時30分45秒の30秒後)と、日付が繰り上がる(繰り下がる)ためです。 この仕様についての詳細は「〇時間前後を計算する」のサンプルコード2を確認ください。
・リンク:Format関数で日付や時刻を整える方法(数値・文字の整形にも使えます)

サンプルコード1

Sub SampleDateAdd2_3()
    Dim t As Date
    
    t = TimeSerial(23, 59, 45)
    
    Debug.Print "基準時間→" & t
    Debug.Print "30秒前→" & Format(DateAdd("s", -30, t), "hh:nn:ss")
    Debug.Print "30秒後→" & Format(DateAdd("s", 30, t), "hh:nn:ss")
    Debug.Print "30秒後(Format関数無し)" & vbNewLine & _
                " →" & DateAdd("n", 30, t)
End Sub
【実行例】

基準時間→23:59:45
30秒前→23:59:15
30秒後→00:00:15
30秒後(Format関数無し)
→1899/12/31(日) 0:29:45

1年2か月と3日後を計算する

複数の日数計算を行う方法です。
DateAdd関数で1ステップずつ計算する方法と、1ステップだけでDateSerial関数とYear/Month/Day関数で計算する方法があります。
DateAdd関数は、ステップ数が多くなりますが、シンプルで良いという人もいます。 DateSerial関数とYear/Month/Day関数は、1ステップに詰め込んでいますが、1ステップが故に読みやすいという人もいます。
1年2か月と3日後を計算するサンプルプログラムを用意しました。好きな方を選ぶと良いでしょう。

サンプルコード1

Sub SampleDateAdd1_Ex1()
    Dim d As Date: d = DateSerial(2026, 1, 1)
    
    ' 1年2か月と3日後を求める
    d = DateAdd("yyyy", 1, d)
    d = DateAdd("m", 2, d)
    d = DateAdd("d", 3, d)
    
    Debug.Print d
End Sub
【実行例】

2027/03/04(木)

サンプルコード2

Sub SampleDateAdd1_Ex2()
    Dim d As Date: d = DateSerial(2026, 1, 1)
    
    ' 1年2か月と3日後を求める
    d = DateSerial(Year(d) + 1, Month(d) + 2, Day(d) + 3)
    
    Debug.Print d
End Sub
【実行例】

2027/03/04(木)

1時間30分20秒後を計算する

複数の時刻計算を行う方法です。 DateAdd関数で1ステップずつ計算する方法と、1ステップだけでDateSerial関数とHour/Minute/Second関数で計算する方法があります。
1時間30分20秒後を計算するサンプルプログラムを用意しました。好きな方を選ぶと良いでしょう。

サンプルコード1

Sub SampleDateAdd2_Ex1()
    Dim t As Date
    
    ' 1時間30分20秒後を求める
    t = TimeSerial(12, 30, 45)
    t = DateAdd("h", 1, t)
    t = DateAdd("n", 30, t)
    t = DateAdd("s", 20, t)
    
    Debug.Print Format(t, "hh:nn:ss")
End Sub
【実行例】

14:01:05

サンプルコード2

Sub SampleDateAdd2_Ex2()
    Dim t As Date
    
    ' 1時間30分20秒後を求める
    t = TimeSerial(12, 30, 45)
    t = TimeSerial(Hour(t) + 1, Minute(t) + 30, Second(t) + 20)
    
    Debug.Print t
End Sub
【実行例】

14:01:05

関連リンク

ページの先頭へ