Excelで1秒未満の時間を扱いたい。具体的にはスポーツのタイムの記録で,1/100秒単位である。
セルの表示形式をm:ss.00
にし,3分45.67秒を3:45.67
と入力するとちゃんと表示される。
さて,VBAである。以下,必要な精度は1/100秒だが,誤差が出ていないかを見るため,表示形式をm:ss.000
にしている。時間を発生するTimeSerial
関数がある。しかし,これの秒(第3引数)は整数である。
Cells(1, 1) = TimeSerial(0, 3, 45.67)
と,45.67
と実数にしても文句は出ないが,結果は45.67秒ではなく46秒になる。あれえ。
では,TimeSerial
で作った45秒に0.67秒を足すか。まず,0.01秒は作れるか。
Dim ts, tcs
ts = TimeSerial(0, 0, 1)
tcs = 0.01 * ts
Cells(1, 1) = tcs
これはOK。0.67秒は作れるか。
tss = 67 * tcs
これもOK。では足す。
ti = TimeSerial(0, 3, 45)
t = ti + tss
あれえ,これは46秒である。TimeSerial
の結果はVariant (Date)
というものらしいが,これは可能であれば1秒単位で丸めてしまおうとするもののようだ。
Variant
がダメならSingle
にすればいいのか?以下にしたらできた。
Dim rts As Single, rtcs As Single, rtss As Single, rti As Single
rts = TimeSerial(0, 0, 1)
rtcs = 0.01 * rts
rtss = 67 * rtcs
rti = TimeSerial(0, 3, 45)
Cells(1, 1) = rti + rtss