根据每月费用标准、费用起止日期计算期间费用金额
注意:
- 每月费用标准为一个定值,不论该月天数
- 整月的判断,日期满足(月+n、日-1)即为整月,举例:2022.2.2与2022.3.1期间为1个整月
- 所有计算保留2位小数
Function datecost(startdate As Date, enddate As Date, monthcost As Double) As Double
'函数定义datacost(开始日期,结束日期,每月费用标准),计算该周期内一共的费用
month_count = DateDiff("m", startdate, enddate) '月差数,整月计算
m = DateSerial(Year(startdate), Month(startdate) + month_count, Day(startdate) - 1) '月差数整月后的日期
date1 = DateSerial(Year(startdate), Month(startdate) + 1, 0) '开始日期当月的结束日期,计算当月天数
date2 = DateSerial(Year(enddate), Month(enddate) + 1, 0) '结束日期当月的结束日期,计算当月天数
date3 = DateSerial(Year(enddate), Month(enddate), 1) '结束日期当月的开始日期
date_count1 = DateDiff("d", startdate, date1) + 1 '开始日期距当月末天数,含当日,开始月费用天数
date_count2 = DateDiff("d", date3, enddate) + 1 '结束日期距当月初天数,含当日,结束月费用天数
date_count3 = DateDiff("d", startdate, enddate) + 1 '开始日期距结束日期天数,含当日,同一月内费用天数
If DateDiff("d", enddate, m) = 0 Then '日期相等判断,是否为整月,闰月不影响
datecost = monthcost * month_count
ElseIf DateDiff("d", date1, date2) = 0 Then '开始日期,结束日期在同一个月,非整月
datecost = Round(date_count3 / Day(date1) * monthcost, 2) '同一个月当月费用天数所产生的的费用
Else '开始日期,结束日期不在同一个月,构成期间非整月
date_cost1 = Round(date_count1 / Day(date1) * monthcost, 2) '开始日期当月费用天数所产生的的费用
date_cost2 = Round(date_count2 / Day(date2) * monthcost, 2) '结束日期当月费用天数所产生的的费用
month_count = DateDiff("m", date1, date2) - 1 '开始日期,结束日期中间间隔整月数量
month_cost = month_count * monthcost
datecost = date_cost1 + date_cost2 + month_cost
End If
End Function
Sub datecost帮助信息()
'运行一次后该帮助信息生效
Dim 函数名称 As String '函数名称
Dim 函数描述 As String '函数描述
Dim 参数个数(3) As String '函数参数描述 数组 个数
函数名称 = "datecost"
函数描述 = "根据每月费用标准、费用起止日期计算期间费用金额"
参数个数(0) = "参数1:费用开始日期,日期格式"
参数个数(1) = "参数2:费用结束日期,日期格式"
参数个数(2) = "参数3:每月费用标准金额,数字格式"
Call Application.MacroOptions(macro:=函数名称, Description:=函数描述, ArgumentDescriptions:=参数个数)
End Sub