VBA 日付を計算する

はじめに

Excel VBA マクロの日付 (Date) を計算や期間を取得する方法を紹介します。

日付 + 1 のようにして、次の日を取得できます。数値の 1 が 1 日になります。

DateAdd 関数」から、日や時間の単位を指定して計算できます。

日付 - 日付 のようにして、2 つの日付の期間や日数を取得できます。

DateDiff 関数」から、日や時間の単位を指定して取得できます。

  • 目次
    • 日付を計算する
    • 日付の期間を取得する

日付を計算する

算術演算子を使用して日付の計算ができます。

+- を入力して、日数や時間を加えられます。

演算子 演算名 使用例 結果
+足し算2013/01/01 + 12013/01/02
-引き算2013/01/01 - 12012/12/31
Dim d As Date
d = CDate("2013/1/1") + 1 ' 明日
Debug.Print(d) ' 2013/01/02

d = CDate("2013/1/1") + 7 ' 次の週
Debug.Print(d) ' 2013/01/08

d = CDate("2013/1/1") - 1 ' 昨日
Debug.Print(d) ' 2012/12/31

d = CDate("2013/1/1") - 7 ' 前の週
Debug.Print(d) ' 2012/12/25

数値が 1 増えるごとに日付も 1 日増えます。

小数が時刻になります。数値の 1 が 1 日になるので時間は次のように計算できます。

  • 1 時:1 / 24
  • 1 分:1 / 24 / 60
  • 1 秒:1 / 24 / 60 / 60
Dim t As Date
t = (1 / 24)           ' 1 時間
Debug.Print(t) ' 1:00:00

t = (1 / 24 / 60)      ' 1 分
Debug.Print(t) ' 0:01:00

t = (1 / 24 / 60 / 60) ' 1 秒
Debug.Print(t) ' 0:00:01

Dim d As Date
d = 1
d = d + t ' 1 秒加える
Debug.Print(d) ' 1899/12/31 0:00:01

d = d + t ' 1 秒加える
Debug.Print(d) ' 1899/12/31 0:00:02

時刻を割り算で求めるのは手間なので、文字列を時刻に変換すると簡単です。

Dim t As Date
t = "1:0:0" ' 1 時間
Debug.Print(t) ' 1:00:00

t = "0:1:0" ' 1 分
Debug.Print(t) ' 0:01:00

t = "0:0:1" ' 1 秒
Debug.Print(t) ' 0:00:01

Dim d As Date
d = 1
d = d + t ' 1 秒加える
Debug.Print(d) ' 1899/12/31 0:00:01

d = d + t ' 1 秒加える
Debug.Print(d) ' 1899/12/31 0:00:02
算術演算子について詳しくは「演算子」をご覧ください。

1 日や月末

Excel の「日付を自動で入力する」の方法で、1 日や月末など好きな日付を取得できます。

Excel の関数を使用するには「WorksheetFunction」をご覧ください。
Dim 対象 As Date
対象 = "2013/1/15"

Dim d As Date

' 1 日
d = DateSerial(Year(対象), Month(対象), 1)
Debug.Print(d) ' 2013/01/01

' 月末
d = WorksheetFunction.EoMonth(対象, 0)
Debug.Print(d) ' 2013/01/31

DateAdd 関数

DateAdd 関数」を使用して、年月日、時分秒を指定して計算できます。

引数には (単位, 加算時間, 日時) を指定します。単位には次のものがあります。

  • yyyy:年
  • m:月
  • d:日
  • h:時
  • n:分
  • s:秒
  • w:平日
  • ww:週
  • q:四半期
Dim d As Date

d = DateAdd("yyyy", 1, CDate("2013/1/1")) ' 1 年後
Debug.Print(d) ' 2014/01/01

d = DateAdd("d", -1, CDate("2013/1/1"))   ' 昨日
Debug.Print(d) ' 2012/12/31

d = DateAdd("h", 1, CDate("2013/1/1"))    ' 1 時間後
Debug.Print(d) ' 2013/01/01 1:00:00

日付の期間を取得する

上記の「日付を計算する」方法と同じです。

- を入力して、日数や時間を取得できます。

Dim 日数 As Long
日数 = CDate("2013/1/1") - CDate("2013/1/1")
Debug.Print(日数) ' 0

日数 = CDate("2013/1/2") - CDate("2013/1/1")
Debug.Print(日数) ' 1

日数 = CDate("2013/1/8") - CDate("2013/1/1")
Debug.Print(日数) ' 7

Dim 時間 As Date
時間 = CDate("10:0:0") - CDate("1:0:0")
Debug.Print(時間) ' 9:00:00

時間 = CDate("10:0:0") - CDate("0:1:0")
Debug.Print(時間) ' 9:59:00

時間 = CDate("10:0:0") - CDate("0:0:1")
Debug.Print(時間) ' 9:59:59

同じ日付の日数は 1 日も経過していないので 0 になります。

DateDiff 関数

DateDiff 関数」を使用して、2 つの日付の間隔を取得できます。

引数には (単位, 日時1, 日時2) を指定します。単位には次のものがあります。

  • yyyy:年
  • m:月
  • d:日
  • h:時
  • n:分
  • s:秒
  • w:平日
  • ww:週
  • q:四半期
Dim i As Integer

i = DateDiff("yyyy", CDate("2013/1/1"), CDate("2014/12/31"))    ' 年
Debug.Print(i) ' 1

i = DateDiff("d", CDate("2013/1/1"), CDate("2013/1/7"))         ' 日
Debug.Print(i) ' 6

i = DateDiff("h", CDate("2013/1/1"), CDate("2013/1/1 1:00:00")) ' 時
Debug.Print(i) ' 1

休日を除いた日数

Excel の「エクセル 勤務期間や営業日数を求める日付関数」の方法で、休日を除いた日数など好きな日数を取得できます。

Excel の関数を使用するには「WorksheetFunction」をご覧ください。
Dim d1 As Date
Dim d2 As Date
d1 = "2013/1/1"
d2 = "2013/1/7"

' 休日を除いた日数
Dim l As Long
l = WorksheetFunction.NetworkDays_Intl(d1, d2)
Debug.Print(l) ' 5