更新日:、 作成日:
VBA 日付を計算する
はじめに
Excel VBA マクロの日付 (Date) を計算や期間を取得する方法を紹介します。
日付 + 1 のようにして、次の日を取得できます。数値の 1 が 1 日になります。
「DateAdd 関数」から、日や時間の単位を指定して計算できます。
日付 - 日付 のようにして、2 つの日付の期間や日数を取得できます。
「DateDiff 関数」から、日や時間の単位を指定して取得できます。
日付を計算する
算術演算子を使用して日付の計算ができます。
+ や - を入力して、日数や時間を加えられます。
演算子 | 演算名 | 使用例 | 結果 |
+ | 足し算 | 2013/01/01 + 1 | 2013/01/02 |
- | 引き算 | 2013/01/01 - 1 | 2012/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
スポンサーリンク