[[20250304155355]] 『時間の計算で合計が24時間ジャストになる場合の表』(ブロハン) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『時間の計算で合計が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

ありがとうございます。セル自体に式は入っていなく、VBAでループして、3つのセルの合計(横計)を上から順に加算していく(縦計)形になっています。一日6時間勤務で4日目の部分がちょうど24時間になり 6:00→12:00→18:00→0:00→30:00 の様に表示されています。累計自体は問題なく計算されています。宜しくお願い致します。
(ブロハン) 2025/03/05(水) 08:40:19

 0:00となる箇所はマクロでは何を書き込んでいるか確認してください。
 >あとその0:00と表示されるセルの数式バーには何と表示されているのだろうか?
 これへの回答はないのですか?
 念のため、表示形式が[h]:mmというのも間違いないですね?

(xyz) 2025/03/05(水) 08:59:01


>VBAでループして
コードを提示したらどうですか。
(?) 2025/03/05(水) 09:21:10

通常、h:mmであれば0:00と表示され、[h]:mmであれば24:00と表示されます。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1463524214
(ゆたか) 2025/03/05(水) 09:46:34

 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


お返事ありがとうございます。少数演算による誤差なのですね…まだVBAを勉強し始めて数か月なので 分からない部分の質問をさせて下さい。この式→ 累計僅小 = 累計 - (1 / 24 / 60 / 60 / 1000) はどのような意味がありますか? 初心者ですみません。宜しくお願い致します。

(ブロハン) 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


ご丁寧なお返事ありがとうございます。自分の作ったコードに取り入れてみます。とても勉強になりました。ありがとうございました。
(ブロハン) 2025/03/06(木) 15:48:41

 >自分の作ったコードに取り入れてみます。

 何か不安だなぁ・・

 原因は、ジャスト時刻じゃなかったんですか?
     そもそも、データの実体値がどうなっているか確かめたのですか?

 対策は、(1)ジャスト時刻になるように塩梅したんですか?
     (2)Value2プロパティを使う事にしたんですか?

 まぁ、ご本人が納得しているなら、これ以上深入りしませんけども。

(半平太) 2025/03/06(木) 16:21:35


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.