| 
    
     |  | ▼mai さん: おはようございます。
 新規ブックの標準モジュールに
 
 '===============================================================
 Option Explicit
 Sub main()
 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(CStr(st))
 Loop
 For idx = LBound(n_m()) To UBound(n_m())
 t_m = t_m + IIf(n_m(idx) > 1500, 1500, n_m(idx))
 Next
 MsgBox t_m
 End Sub
 '===============================================================
 Sub set_hyo()
 Call set_list
 Range("A1:B1").NumberFormatLocal = "h:mm"
 End Sub
 '===============================================================
 Function set_list() As Range
 Const セル範囲 = "d1:d3"
 Const リスト = "={""0:00"",200,""1:00"",0;""6:00"",400,""0:20"",-1;""20:00"",300,""0:30"",1}"
 Set set_list = Range(セル範囲)
 set_list.Resize(, 4).FormulaArray = Evaluate(リスト)
 End Function
 
 としてください。
 
 
 1.まず、プロシジャーset_hyoを実行してアクティブシートに
 料金表を作成してください。
 
 2.アクティブシートのセルA1が開始時刻、B1が終了時刻とします。
 
 3.尚、入力された時刻が 開始時刻<終了時刻という場合は、終了時刻は翌日の時刻
 だと解釈します。
 4.開始時刻、終了時刻を入力後、プロシジャーmainを実行してください。
 料金が表示されます。
 
 
 入力例
 
 セルA1  5:00  B1 8:00  料金 2600
 
 セルA1 21:00  B1 0:00  料金 1500
 (この場合、自動的に翌日の0:00と解釈します)
 
 セルA1  5:00  B1 7:10  料金 600
 
 セルA1 19:00  B1 21:00  料金 1800
 
 
 という結果を表示します。
 確認してください。
 
 これ難しいのは、時刻は少数だから誤差が出るんだよね!!
 補正したつもりですが、十分な確認をしていません・・。
 
 検証してみてください。
 
 |  |