Excel VBA質問箱 IV

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

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


43163 / 76732 ←次へ | 前へ→

【38623】Re:料金計算マクロ
発言  sin  - 06/6/7(水) 15:53 -

引用なし
パスワード
   ▼ハト さん:
ありがとうございます。

>DataAddを使っても誤差が出るようです
>
>誤差を計測してみたところ
>『1.11022302462516E-16』
>小数点以下16桁(^^;
この計測の仕方、よろしければご教授下さい。

>
>1分の値が
>『0.000694444444444444』
>
>これだと比較している箇所はRoundを使って、
>小数点以下8桁をまるめてしまえば誤差を無視できそうですね(^^;
>
>    If TTime >= NTime Then Exit Do
>               ↓
>    If Round(TTime, 8) >= Round(NTime, 8) Then Exit Do
わたしもどこかで「日時はシリアル値」というのを聞いたのを思い出し、
調べたところ詳細に解説されてました^^
http://www.h3.dion.ne.jp/~sakatsu/TimeSerial_Error.htm

なので私も
>    If TTime >= NTime Then Exit Do

      TTime = TimeValue(Format(TTime, "h:mm"))
      NTime = TimeValue(Format(NTime, "h:mm"))
      If TTime >= NTime Then Exit Do
としてみたところ解決しました。


ただ、↓のようにテストしていたのですが、
14:00〜16:00や17:00〜18:00など割り切れている
ところでは誤差が出ないように思えるのですが・・・
しかし上記のようにすると正しい結果が得られるので
表示の仕方の問題でしょうか?


Sub Test_Time()

Dim ws As Worksheet
Dim STime As Date
Dim ETime As Date
Dim NTime As Date
Dim TTime As Date
Dim ATime As Date
Dim i As Long
Dim j As Long
Dim TVal As Long
Dim NVal As Long

  Set ws = ThisWorkbook.Worksheets("Sheet1")
  ws.Columns("a:b").ColumnWidth = 12
  ws.Columns("e:f").ColumnWidth = 16

  ATime = TimeValue("6:00")
  For i = 1 To 14
    ws.Cells(i, 1) = ATime
    ATime = ATime + TimeValue("1:00")
    ws.Cells(i, 2) = ATime
  Next i

  j = 1

  For i = 1 To 14
    TVal = 0
    NVal = 0

    STime = TimeValue(ws.Range(Cells(i, 1), Cells(i, 1)).Text)
    ETime = TimeValue(ws.Range(Cells(i, 2), Cells(i, 2)).Text)

    If STime > ETime Then
      NTime = TimeValue("23:59")
    Else
      NTime = ETime
    End If

    TTime = STime
    ws.Cells(j, 5) = CStr(STime) & "〜" & CStr(ETime)

    Do
      Select Case TTime
        Case Is > TimeValue("23:29")
          NVal = NVal + 300
          If NTime = ETime Then Exit Do
          TTime = TTime - TimeValue("23:30")
          NTime = ETime
        Case Is >= TimeValue("20:00")
          TTime = TTime + TimeValue("0:30")
          NVal = NVal + 300
        Case Is >= TimeValue("6:00")
          TTime = TTime + TimeValue("0:20")
          TVal = TVal + 400
        Case Else
          TTime = TTime + TimeValue("1:00")
          NVal = NVal + 200
      End Select

      j = j + 1
      ws.Cells(j, 5) = CDbl(TTime)
      ws.Cells(j, 6) = CDbl(NTime)

'      TTime = TimeValue(Format(TTime, "h:mm"))
'      NTime = TimeValue(Format(NTime, "h:mm"))
      If TTime >= NTime Then Exit Do
    Loop

    j = j + 1
    If NVal > 1500 Then NVal = 1500
    TVal = TVal + NVal
    ws.Cells(i, 3) = TVal
  Next i
  Range("a1").Select
End Sub
2 hits

【38516】料金計算マクロ mai 06/6/5(月) 16:16 質問
【38524】Re:料金計算マクロ ハト 06/6/5(月) 18:11 回答
【38526】Re:料金計算マクロ ハト 06/6/5(月) 18:34 発言
【38579】Re:料金計算マクロ sin 06/6/6(火) 16:13 発言
【38606】Re:料金計算マクロ ハト 06/6/7(水) 10:31 発言
【38618】Re:料金計算マクロ ハト 06/6/7(水) 13:52 発言
【38623】Re:料金計算マクロ sin 06/6/7(水) 15:53 発言
【38629】Re:料金計算マクロ ハト 06/6/7(水) 16:29 発言
【38537】Re:料金計算マクロ ハト 06/6/6(火) 10:32 回答
【38602】Re:料金計算マクロ roxy 06/6/7(水) 9:29 お礼
【38608】Re:料金計算マクロ roxy 06/6/7(水) 10:40 質問
【38612】Re:料金計算マクロ ハト 06/6/7(水) 11:06 発言
【38532】Re:料金計算マクロ ichinose 06/6/6(火) 8:57 発言
【38533】Re:料金計算マクロ 訂正 ichinose 06/6/6(火) 9:10 発言
【38601】Re:料金計算マクロ 訂正 roxy 06/6/7(水) 9:27 お礼
【38624】Re:料金計算マクロ 訂正 ichinose 06/6/7(水) 16:02 発言
【38627】Re:料金計算マクロ 訂正 ハト 06/6/7(水) 16:23 発言
【38645】Re:料金計算マクロ 訂正 roxy 06/6/7(水) 17:58 発言
【38690】Re:料金計算マクロ 訂正 sin 06/6/8(木) 15:54 発言

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