很简单的。给你一个:
将这3个时间段,分别指定一个状态字
00:00-8:00  为1
16:00-20:00 为2
20:00-24:00 为3
这个过程的功能:
输入:一个时间
输出:指出这个时间属于那一个时间段,
Private Sub Set_Flags(T As Date, Et_f As Integer)
    If T > Time2 Then
        Et_f = 3
    ElseIf T < Time2 Then
        Et_f = 1
    Else
        Et_f = 2
    End If
End Sub
---------------------
功能:指出两个时间
输入:两个时间
输出:这个两个时间相差多少天
Private Function IfSameDay(Bt As Date, Et As Date) As Integer
    IfSameDay = DateDiff("d", Bt, Et)
End Function
-----------------------
功能:计算某个时间点的价值
输入:一个时间
输出:该时刻的价钱
Private Function Cur_Money(T As Date, T_F As Integer) As Integer
    Select Case T_F
        Case 1
            Cur_Money = DateDiff("h", T, "00:00") * 60   
            
        Case 2
            Cur_Money = DateDiff("h", T, "16:00") * 30 + 480 '480是整个是00:00-8:00的价钱 8*60 
        Case 3
            Cur_Money = DateDiff("h", T, "20:00") * 80 + 600 ’600是从00:00-8:00 和16:00-20:00 的价值总和:60*8+30*4
    End Select
End Function
--------------------------------
功能:算出2个时间之间的价值
输出
Bt 是开始时间。Et 是结束时间
Bt_Status 是指出Bt是属于哪个时间段的
Et_Status  是指出Et是属于哪个时间段的
Private Sub Sum_Up(Bt as date,Et as Date)
    Dim Bt_Status As Integer
    Dim Et_Status As Integer
    Dim Bt As Date, Et As Date
    Set_Flags Bt, Bt_Status
    Set_Flags Et, Et_Status
    '判断2个时间是不是同一天,记住这里我只处理了差一天的情况。我是根据你说的,我觉得不应该有差几天的情况,如果有的话,自己处理一下就行了
    If IfSameDay(Bt, Et) <> 0 Then
        Debug.Print Cur_Money(Et, Et_Status) - Cur_Money(Bt, Bt_Status)
    Else
        Debug.Print 920 - Cur_Money(Bt, Bt_Status) + Cur_Money(Et, Et_Status)
    End If
End Sub这个我没有很详细的写出,只是写了个大概,这也是一种想法。可以参考一下