Microsoft 製品に組み込まれている Visual Basic の実装。
こんにちは。
エラーになるのは、Range("C1") = D2 だと思いますが、どうですか?
小数誤差により、D2が微小なマイナス値になっているのだと思います。
セルではマイナスのシリアル値が設定できませんので、表記のエラーになります。
シリアル値と時刻(時間)表示の変換では、凡そ ±0.5の範囲で丸められます。
0秒ならば -0.5~0.0~+0.5 の範囲が0秒として表現されます。
(5の位置が上へ行くか、下へ行くかは、その時の値により不定のようです)
一旦、時刻文字列を経由(小数誤差をなくして整数化)させれば回避可能です。
Dim D3 As String
D3 = Format(D2 , "h:m:s")
Range("C1").Value = TimeValue(D3)
2進法の小数計算には誤差は付き物。
CPU・OSの演算精度などで結果が変わる事もあるでしょう。
小数の計算(時刻・時間の計算)の際には、
そういう事もあるのだという前提で予め対応しておく必要があるでしょう。
もしくは、時刻・時間データを取り込んだら、
それを秒(整数、2分⇒120秒)に換算し、
計算の中では全て秒(整数)同士で行ない、
最終結果(秒)をシリアル値に変換(秒÷86400)する方法でも対応可能でしょう。