|
▼roxy さん:
>誤差の件はシリアル値で取るとやはり出るので、全て分単位で時間を取ってきて計算しているみたいです。
>確かに誤差が出たときに微妙にずれが生じますね。
提示してコードで誤差がでたのですか?
だとしたら、誤差が発生した時刻情報(開始時刻と終了時刻)を教えてください。
私の環境では誤差が出てこないのですが、
'===========================================
Sub main()
Const Lim_cost = 1500
Dim idx As Long, jdx As Long
Dim t_m As Long
Dim n_m() As Variant
Dim st As Date, ed As Date
Dim std As Date
Dim l_rng As Range
On Error Resume Next
Set l_rng = Range("d1:d3")
t_m = 0
st = Range("a1").Value
ed = Range("b1").Value
std = Int(st)
If st > ed Then ed = ed + 1
Do While st < ed
idx = Application.Match(st - Int(st), l_rng, 1)
If l_rng.Cells(idx, 4).Value = -1 Then
t_m = t_m + l_rng.Cells(idx, 2).Value
Else
jdx = Int(st) - std + l_rng.Cells(idx, 4).Value
Err.Clear
n_m(jdx) = n_m(jdx) + l_rng.Cells(idx, 2).Value
If Err.Number <> 0 Then
ReDim Preserve n_m(jdx)
n_m(jdx) = 0
n_m(jdx) = n_m(jdx) + l_rng.Cells(idx, 2).Value
End If
End If
st = st + l_rng.Cells(idx, 3).Value
st = CDate(Format(st, "yyyy/m/d hh:mm"))
Loop
For idx = LBound(n_m()) To UBound(n_m())
t_m = t_m + IIf(n_m(idx) > Lim_cost, Lim_cost, n_m(idx))
Next
MsgBox t_m
End Sub
mainを上記と差し替えて見てください。
>1日をまたがった計算もありうるし、曜日によって料金が変わったりするからです。
曜日による料金は、料金表にその料金の追加で計算は可能です。
また、元々日をまたがった計算も可能にしてあります。
例。
セルA1に
2006/6/7 16:00:00
セルB1に
2006/6/9 16:00:00
と指定し、mainを実行すると36600という料金が表示されます。
確認してみてください。
それから、ハトさんのコードも拝見しました。
私とハトさんでは、計算の仕様が違っています。
夜には最大上限金額の計算方法です。
20:00以降6:00までの間で
\1500を超えても\1500以上に料金がなることはありません
私は、
20:00から、翌日の6:00までの料金を1500を超えないようにしてあります。
つまり、
開始を0:00 終了を23:00とした場合は、
0:00〜6:00-----200*6=1200
6:00〜20:00----14*3*400=16800
20:00〜23:00---3*2*300=1800--->1500(上限金額設定)
で1200+16800+1500=19500という料金にしていますが。
ハトさんは、
16800+1500=18300にしています。
これが、本来はどちらが仕様ですか?
私も迷いましたが、経営者側が儲かる仕様
(料金というのだから経営している事象だと思って・・)
にしました。
この辺もはっきりしてください。
|
|