|
▼HCM さん:
おはようございます。
>今回初めてVBAを使っている初心者ですが、どうしても原因がわからない
>問題が出ています。
>勤務時間の総計を求めようとしていますが、うまく表示できません。
>
>Date型変数を用意して、これに任意のセルに書かれた時間を取得して加
>算していくのですが、数箇所だけ加算しているのにも関わらず、時間が
>減算されて表示されます。
>一例では、40:00+8:00時、48:00となるはずが、"24:00"と表示されます。
バグだと思いますけどねえ!!
>tTime = tTime + CDate(ActiveCell.Offset(i, 0).Value)
これ↑実際には、小数桁の多い数の足し算ですから、
計算上は、48:00になる結果もぴったりの48:00(=2)ではなく、
微妙に小さいですね!!
この時にバグが発生しているようにです。
Sub test()
Dim dd As Date
dd = 1.9999998
Cells(1, 1).Value = dd
dd = 2
Cells(1, 2).Value = dd
End Sub
A1とB1では、丸々1日違いますからねえ!!
では、どこら辺りでこの現象が発生するかという値の限界値は?
Sub test2()
Dim dd As Date
dd = 1.99999
Cells(1, 1).Value = dd
End Sub
上記の1.99999では、正しい値の1900/1/1 23:59:59
これを表示しますが、
小数桁をもう一つ増やして試すと
Sub test3()
Dim dd As Date
dd = 1.999999
Cells(1, 1).Value = dd
End Sub
1900/1/1 00:00:00 なってしまいます。
バグっぽいねえ!!
Double型で行うとこのバグは発生しませんねえ!!
そういえば、Excelの時間関連の関数って返る値ってDouble型の値なんですよね!!
例
now() timevalue ...
よって、Double型で計算しましょう!!
>以下はDate型変数の表示形式を日付に変え時の表示結果です。
>加算処理がおかしい気もするのですが、同様の加算処理をDouble型で行
>った所、値は増加しているので、処理には問題無いようにも思えます。
>
>1.期待値(32:00), Date型変数値(1990/1/1 8:00), Double型変数値(1.333333..)
>2.期待値(40:00), Date型変数値(1990/1/1 16:00), Double型変数値(1.666666..)
>3.期待値(48:00), Date型変数値(1990/1/1 0:00), Double型変数値(2.0)
> 3の実際の表示は24:00
>
>実際の時間取得〜加算処理コードは以下となっています。
>どうしておかしな表示になる事があるのか、ご教授願えませんでしょうか?
>宜しくお願い致します。
>
> Dim tTime As Date
> Dim iTime As Double
>
> For i = 1 To 31
> 'セルから工数取得〜工数加算
> tTime = tTime + CDate(ActiveCell.Offset(i, 0).Value)
> iTime = iTime + CDbl(ActiveCell.Offset(i, 0).Value)
> '加算結果をテスト表示
> ActiveCell.Offset(i, 1).NumberFormat = "[h]:mm" '書式
ActiveCell.Offset(i, 1).Value2 = tTime
'こんなでも良いですね!!意味は↓とほぼ同じですが・・・、
> ActiveCell.Offset(i, 2).Value = iTime
> Next i
|
|