Excel VBA質問箱 IV

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

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


28368 / 76732 ←次へ | 前へ→

【53663】Re:Worksheetfunction.Floor について
発言  ichinose  - 08/1/29(火) 23:47 -

引用なし
パスワード
   こんばんは。

時間を表す Cdate("23:01") や Cdate("0:05") って

sub test()
  MsgBox CDbl(CDate("23:01"))
  MsgBox CDbl(CDate("0:05"))
end sub
なんてコードで確認するとわかりますが、小数点以下の桁数が大きい小数ですよね!!

PCはこういう計算が弱いんです。
理由は、

www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=46479;id=excel

↑ここと同じ理由です。

WorksheetFunction.Floor(time1, CDate("0:05"))

この関数って実際には

Int(time1 / CDate("0:05")) * CDate("0:05")

↑こんな計算を行ってくれる関数です。

小数点以下の桁数が大きい小数同士で上記のような計算を行うと
誤差はでる可能性は大きいです。

時刻を秒単位にする、つまり、整数で比較すると正しい比較が行えます

'=================================================================
Sub main()

  Dim time1 As Double, time2 As Double
 
  time1 = CDate("23:01") * 24 * 60 * 60
  time2 = CDate("23:00") * 24 * 60 * 60
 
  'time1 を5分単位に切り下げ
  time1 = WorksheetFunction.Floor(time1, CDate("0:05") * 24 * 60 * 60)
 
  If time1 / 86400 = time2 / 86400 Then
    Debug.Print "ok"
  Else
    Debug.Print "no"
  End If
  MsgBox Format(time1 / 86400, "hh:mm:ss")
   
End Sub


プログラミングでは、小数の計算は 要注意ですよ!!

1 hits

【53662】Worksheetfunction.Floor について 映画館スタッフ 08/1/29(火) 22:53 質問
【53663】Re:Worksheetfunction.Floor について ichinose 08/1/29(火) 23:47 発言
【53664】Re:Worksheetfunction.Floor について 映画館スタッフ 08/1/30(水) 9:42 お礼

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