Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4730 / 13646 ツリー ←次へ | 前へ→

【54860】正しい時間表示ができません HCM 08/4/2(水) 13:21 質問[未読]
【54864】Re:正しい時間表示ができません ひげくま 08/4/2(水) 13:36 発言[未読]
【54868】Re:正しい時間表示ができません HCM 08/4/2(水) 13:49 発言[未読]
【54879】Re:正しい時間表示ができません ichinose 08/4/3(木) 6:51 発言[未読]
【54893】Re:正しい時間表示ができません HCM 08/4/3(木) 14:52 お礼[未読]

【54860】正しい時間表示ができません
質問  HCM  - 08/4/2(水) 13:21 -

引用なし
パスワード
   今回初めてVBAを使っている初心者ですが、どうしても原因がわからない
問題が出ています。
勤務時間の総計を求めようとしていますが、うまく表示できません。

Date型変数を用意して、これに任意のセルに書かれた時間を取得して加
算していくのですが、数箇所だけ加算しているのにも関わらず、時間が
減算されて表示されます。
一例では、40:00+8:00時、48:00となるはずが、"24:00"と表示されます。

以下は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).Value = tTime
    ActiveCell.Offset(i, 2).Value = iTime
  Next i

【54864】Re:正しい時間表示ができません
発言  ひげくま  - 08/4/2(水) 13:36 -

引用なし
パスワード
   ▼HCM さん:
>一例では、40:00+8:00時、48:00となるはずが、"24:00"と表示されます。

本当に24:00ですか?
0:00じゃないですか?

もしかしたら、原因はVBAではなく、セルの表示形式かもしれません。
今はたぶん、h:mm:ss になっていると思いますので、[h]:mm:ss に変えてみてください。

【54868】Re:正しい時間表示ができません
発言  HCM  - 08/4/2(水) 13:49 -

引用なし
パスワード
   ▼ひげくま さん:

>本当に24:00ですか?
>0:00じゃないですか?

24:00と表示されています。
表示形式は仰るように[h]:mmにしています。

表示形式を日付にした時に、日付が戻っているので、加算処理に問題が
あるのか?と思い、Double型で同じ加算をさせたのですが、Double値を
見る限りでは問題がありません。

現在の処理では、21回、8:00を加算していくのですが、以下のような
表示結果になり、4回表示異常が発生します。

期待値( 48:00) 表示結果[h]:mm( 24:00)
期待値(120:00) 表示結果[h]:mm( 96:00)
期待値(144:00) 表示結果[h]:mm(120:00)
期待値(168:00) 表示結果[h]:mm(144:00)

あと、加算値の取得元となるセルの表示形式は、
分類:時刻 種類:13:30 で、
セルへの入力値は8:00:00 となっています。

【54879】Re:正しい時間表示ができません
発言  ichinose  - 08/4/3(木) 6:51 -

引用なし
パスワード
   ▼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

【54893】Re:正しい時間表示ができません
お礼  HCM  - 08/4/3(木) 14:52 -

引用なし
パスワード
   ▼ichinose さん:

こんにちは。早朝にも関わらず、詳細な説明ありがとうございます。

ichinoseさんの仰るようにDouble型で記憶させる事にし、無事問題
解決に至りました。

本当にありがとうございました。

4730 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free