TimeSerial
TimeSerial関数は時、分、秒の数値からDate型の時刻の値を取得することが出来ます。
分、秒の値が59を超えた場合は、時や分の値が繰り上がります。時の値が23を超えた場合はDate型が持つ日付が繰り上がります。
TimeSerial関数の各引数には0:00:00から23:59:59の範囲を超えるような値を設定することが出来ますが、0:00:00から23:59:59の範囲を超える場合は、返却値のDate型の基準日付である1899/12/30が過去日付や未来日付に変わるため正しく時刻を得られない場合があります。
構文
1 |
Function TimeSerial(Hour As Integer, Minute As Integer, Second As Integer) As Date |
Hour | 時の数値を0から23の範囲で指定します。-32,768から32,767の範囲を指定すると超過分は戻り値Date型変数が持つ日付データの増減に振り替えられます。 |
Minute | 分の数値を指定します。通常は0から59の範囲で指定しますが、-32,768から32,767の範囲を指定すると超過分は時の増減に振り替えられます。 |
Second | 秒の範囲を指定します。通常は0から59の範囲で指定しますが、-32,768から32,767の範囲を指定すると超過分は時や分の増減に振り替えられます。 |
Date(戻り値) | 引数の時分秒に該当する時刻をDate型で返却します。時刻が0:00:00から23:59:59の範囲であればDate型の日付データ部分は1899/12/30になります。 |
-32,768から32,767を超える値を設定した場合
各引数にはInteger型の範囲である-32,768から32,767が設定できますが、範囲を超える値を設定した場合は実行時エラー6「オーバーフローしました。」になります。
0時より過去の時刻
0時より過去の時刻を指定すると正しい時刻を得られません。
1 2 3 4 5 6 7 8 9 10 11 |
Sub TimeSerialPastTest() Dim t As Date '// 0時 t = TimeSerial(0, 0, 0) Debug.Print Format(t, "yyyy/mm/dd hh:mm:ss") '// 0時より過去 t = TimeSerial(0, 0, -1) Debug.Print Format(t, "yyyy/mm/dd hh:mm:ss") End Sub |
実行結果
1 2 |
1899/12/30 00:00:00 1899/12/30 00:00:01 |
9行目では0時の1秒前である23:59:59を期待しているのですが、実際には00:00:01になっています。
このように0時より過去時刻は正しく得られません。
23:59:59より未来の時刻
23:59:59より未来の時刻を指定すると時刻は正しく得られますが、TimeSerial関数で取得したDate型変数の日付は繰り上がりが発生します。
1 2 3 4 5 6 7 8 9 10 11 |
Sub TimeSerialFutureTest() Dim t As Date '// 0時 t = TimeSerial(0, 0, 0) Debug.Print Format(t, "yyyy/mm/dd hh:mm:ss") '// 23時59分59秒より2秒未来 t = TimeSerial(23, 59, 61) Debug.Print Format(t, "yyyy/mm/dd hh:mm:ss") End Sub |
実行結果
1 2 |
1899/12/30 00:00:00 1899/12/31 00:00:01 |
9行目の時刻は期待通りになっていますが、日付が基準の1899/12/30の翌日の12/31になっています。
サンプルコード
TimeSerial関数はDate型の結果を返すため、その値に対して単純に数値の足し算や引き算を行うと日付の増減になってしまいます。
時分秒の加減算を行う場合はTimeSerial関数で加減算したい時間を指定します。
以下は基準時刻10:10:10に対して時間の加算と減算を行うサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub TimeSerialPlusMinusTest() Dim t As Date '// 10:10:10 t = TimeSerial(10, 10, 10) Debug.Print Format(t, "yyyy/mm/dd hh:mm:ss") '// 10時間23分45秒を加算 t = t + TimeSerial(10, 23, 45) Debug.Print Format(t, "yyyy/mm/dd hh:mm:ss") '// 10時間23分45秒を減算 t = t - TimeSerial(10, 23, 45) Debug.Print Format(t, "yyyy/mm/dd hh:mm:ss") End Sub |
実行結果
1 2 3 |
1899/12/30 10:10:10 1899/12/30 20:33:55 1899/12/30 10:10:10 |