『時間の計算で合計が24時間ジャストになる場合の表示について』(ブロハン)
タイムカードの計算で週間労働時間を計算しているのですが、日々の就業時間を加算していく際 合計時間がジャスト24時間の場合の表示のされ方が 0:00 になってしまい困っています。時間の計算自体は24時間として計算されているので 合計の値はあっているので、表示の問題だけなのですが どうしたら24:00と表示されますでしょうか? 設定は [h]:mm になっています。宜しく願いします。
< 使用 Excel:Excel2010、使用 OS:Windows10 >
その0:00になるセルにはどのような式が入っているのだろうか? (ねむねむ) 2025/03/04(火) 16:17:37
あとその0:00と表示されるセルの数式バーには何と表示されているのだろうか? (ねむねむ) 2025/03/04(火) 16:19:13
0:00となる箇所はマクロでは何を書き込んでいるか確認してください。 >あとその0:00と表示されるセルの数式バーには何と表示されているのだろうか? これへの回答はないのですか? 念のため、表示形式が[h]:mmというのも間違いないですね?
(xyz) 2025/03/05(水) 08:59:01
RangeオブジェクトのValueプロパティ(プログラムの一種)のバグでしょうね
>一日6時間勤務で4日目の部分がちょうど24時間になり 6:00→12:00→18:00→0:00→30:00
一日6時間勤務とのことですが、実際は僅かに小さいんじゃないですか?
・・と言うのは、6時間なら十進数0.25ですから、この問題が生じることはないと思われるからです。
よくある話だと、数式による時間計算で、小数演算誤差により本来の時刻数値より僅かに小さくなることがあります。 その場合、累計は正しくとも、Valueプロパティに処理させると1日分が桁落ちします。 Value2プロパティを使えばこの問題は発生しません。
Sub サンプル() Dim 累計 As Date Dim 累計僅小 As Date Dim i As Long
Range("A1:C5").NumberFormat = "[h]:mm"
For i = 1 To 5
累計 = 累計 + 0.25 累計僅小 = 累計 - (1 / 24 / 60 / 60 / 1000)
Cells(i, "A").Value = 累計 Cells(i, "B").Value = 累計僅小 Cells(i, "C").Value2 = 累計僅小 Next i
End Sub
<結果図> 行 __A__ __B__ __C__ 1 6:00 6:00 6:00 2 12:00 12:00 12:00 3 18:00 18:00 18:00 4 24:00 0:00 24:00 ← 5 30:00 30:00 30:00
(半平太) 2025/03/05(水) 10:17:24
(ブロハン) 2025/03/05(水) 14:54:11
>少数演算による誤差なのですね
いえ、小数演算誤差は可能性の高い遠因であって、実際そうなのかは不明です。
※そちらで確かめてください。(情報が不足しているので、こちらでは分かりません) 前述しましたが、本当に6:00の倍数なら、 小数演算誤差は発生しないですし、今回のトラブルも発生しないハズです。
原因がなんであれ、ジャスト24:00より0.5秒以下分少ない値になったDate型データを RangeのValueプロパティで処理すると0:00にされてしまうと言うことです。 発売から数十年経っているのに、頻繁に使われるValueプロパティでこんなバグが残っているのは信じがたいです。
>累計僅小 = 累計 - (1 / 24 / 60 / 60 / 1000) はどのような意味がありますか? ジャスト時刻より1000分の1秒引いて、問題が発生するテスト用データを人工的に作っているだけです。
(半平太) 2025/03/05(水) 15:57:36
>自分の作ったコードに取り入れてみます。
何か不安だなぁ・・
原因は、ジャスト時刻じゃなかったんですか? そもそも、データの実体値がどうなっているか確かめたのですか?
対策は、(1)ジャスト時刻になるように塩梅したんですか? (2)Value2プロパティを使う事にしたんですか?
まぁ、ご本人が納得しているなら、これ以上深入りしませんけども。
(半平太) 2025/03/06(木) 16:21:35
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.