DateAdd
DateAdd関数は日付や時刻に対して加算や減算を行います。たとえば、2017/12/13の3日後の日付や、現在時刻の2時間前の時刻などを取得できます。
加算や減算の単位は引数で指定します。
なお、日付や時刻がDate型の変数であればDateAdd関数を使わなくても加減算は可能です。加減算の単位は日数になります。日付であればDate型変数 + 1で1日後、時刻であればDate型変数 + “1:00:00″で1時間後を取得できます。
構文
1 |
Function DateAdd(Interval As String, Number As Double, Date) As Date |
Interval | 算出する間隔単位を文字列で指定します。指定は以下の10種類のいずれかを指定します。年”yyyy”と月”m”を同時に”yyyym”のような指定は出来ません。
|
||||||||||||||||||||||
Number | 加算または減算する値を指定します。加算の場合はプラス値、減算の場合はマイナス値を指定します。
小数点を含む数値も指定可能ですが小数点以下の値は無視されます。小数部分は無視するのに整数型ではなくDouble型としたのは設計ミスでしょうね。なお、ヘルプでは「長整数型 (Long) でない場合は、最も近い整数値に丸められてから評価されます」と書いてありますが、実際には小数点以下は切り捨てられるためこの記述は誤りです。なお、「小数点以下を丸める」とはその時々において意味が変わりますが、通常は小数第一位(0.123なら1の部分)を四捨五入することを言います。 |
||||||||||||||||||||||
Date | 加算や減算を行う元の日付や時刻を指定します。指定する形式にはDate型、文字列(例:”2017/12/9″、”10:12:09″)、日付リテラル(例:#12/12/2017#、#10:00:00 AM#)のいずれでも構いません。 | ||||||||||||||||||||||
Date(戻り値) | 戻り値を内部処理形式Date型のVariant型の値で受け取ります。 |
日付や時刻の指定可能範囲
第三引数には指定できる範囲が決まっています。
日付の場合は西暦100年1月1日から9999年12月31日までの範囲になります。DateAdd関数の結果がこの範囲を超えた場合は実行時エラー5(プロシージャの呼び出し、または引数が不正です。)になります。
On Error Resume Nextでエラーを回避した場合は戻り値に何も設定されません。
以下は9999年12月31日に1日加算しようとしてエラーになるサンプルです。
1 2 3 4 |
Sub DateAddErrTest() Dim v v = DateAdd("d", 1, "9999/12/31") End Sub |
時刻の場合は0時0分0秒から23時59分59秒までの範囲になります。時刻の加減算で日付が変わるような場合はエラーにはなりませんが日付の繰り上がりや繰り下がりが発生するため、戻り値には時刻だけでなく日付部分も返却されます。
以下は0:00:00から1秒減算して日付が1日前になるサンプルです。
1 2 3 4 5 6 |
Sub DateAddDownTimeTest() Dim v v = DateAdd("s", -1, "0:00:00") Debug.Print v Debug.Print Format(v, "hh:mm:dd") End Sub |
実行結果
1 2 |
1899/12/29 23:59:59 23:59:29 |
時刻しか指定していない場合は内部的には1899年12月30日という日付になっているため、日付が繰り下がることにより戻り値もその日付が含まれてしまいます。
このような日付が変わるような時刻の加減算が発生する場合は5行目のようにFormat関数で時刻部分のみを抽出する必要があります。
サンプルコード
Now関数による現在日時に対して各単位で1加算した日付や時刻を取得するサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
Sub DateAddTest() Dim d As Date d = DateAdd("yyyy", 1, Now) Debug.Print d d = DateAdd("m", 1, Now) Debug.Print d d = DateAdd("d", 1, Now) Debug.Print d d = DateAdd("ww", 1, Now) Debug.Print d d = DateAdd("w", 1, Now) Debug.Print d d = DateAdd("q", 1, Now) Debug.Print d d = DateAdd("y", 1, Now) Debug.Print d d = DateAdd("h", 1, Now) Debug.Print d d = DateAdd("n", 1, Now) Debug.Print d d = DateAdd("s", 1, Now) Debug.Print d End Sub |
実行結果
1 2 3 4 5 6 7 8 9 10 |
2018/12/13 0:44:19 2018/01/13 0:44:19 2017/12/14 0:44:19 2017/12/20 0:44:19 2017/12/14 0:44:19 2018/03/13 0:44:19 2017/12/14 0:44:19 2017/12/13 1:44:19 2017/12/13 0:45:19 2017/12/13 0:44:20 |
このように、戻り値はDate型で返却されるため、日付と時刻が両方保持されています。
上のサンプルと同様ですが、日付部分だけや時刻部分だけが必要な場合はFormat関数で整形する必要があります。