日数や時刻を計算する方法
今回の目標
「今日から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
