我的开始/结束日期很少,每个月的价格很少,而且每个月有一个日期和课程的表格,所以我需要根据两个日期之间的时间段来迭代课程值,我想很多标准公式没有什么是匹配的,所以我尝试将我的PHP知识,学习suntax并编写我的第一个vba代码,我把它放在这里:
excel数据平均目录如下所示:
[startDate]| [endDate] |[inMonth]| [totalByCourse]
11.01.2010 | 20.02.2011 | 200 | =ConvertCourse( A1, B1, C1, myRange )
15.05.2010 | 25.03.2011 | 400 | =ConvertCourse( A2, B2, C2, myRange )
...等约100次
# [date] |[course]
1 30.08.2010 | 5
...
5 30.12.2010 | 18
6 10.01.2011 | 2
...
10 10.05.2011 | 6
... so on for about 20 times
日期范围|提交给宏的课程被命名为myRange,它不是从一年的第一个月开始而不是在一年的最后一个月结束,所以它使计算算法变得非常复杂,并让我写了一些暴力循环,这就是为什么代码有很多,如果检查状态。
Excel编译器在ConvertCourse函数调用的第一行压缩并且只是注释可能会出现等,它也直接写入奇怪的输出到模块ActiveCell.FormulaR1C1 = _
"=ConvertCourse(R[-1]C[-6],RC[-5],R[-1]C[-3],CourseRange)"
Range("K3").Select
我只是想把它当作公式输出到带有功能的模块,怎么做错了,怎么做呢?
答案 0 :(得分:0)
该函数采用[totalByCourse] / 30并将其乘以两个日期之间每个月的[课程]成本,同时调整短月的成本。
我建议使用内置的Excel WorkSheet函数复制该函数。没有完整的样本数据和比较输出的实际预期结果,我无法做到这一点。
两个新的命名范围被硬编码到公式中。
CourseDates = OFFSET(Sheet1!$ H $ 1,1,0,COUNTA(Sheet1!$ H:$ H)-1,1)
课程= OFFSET(Sheet1!$ I $ 1,1,0,COUNTA(Sheet1!$ I:$ I)-1,1)
式
SUMPRODUCT( - (CourseDates> = - “2011-07-20”), - (CourseDates< = - “2011-8-20”),课程* DailyCost)
Function ConvertCourse(StartDate As Date, EndDate As Date, pSumMonthly As Double) As Double
Const dLength As Integer = 30
Dim x As Long
Dim periodInDays As Integer, DailyCost As Double, result As Double
Dim NewEndDate As Date
DailyCost = pSumMonthly / dLength
periodInDays = DateDiff("d", StartDate, EndDate)
NewEndDate = StartDate + Int(periodInDays / dLength) * 30
result = getCourseTotal(StartDate, NewEndDate, DailyCost)
If NewEndDate < EndDate Then
result = result + (EndDate - NewEndDate) * DailyCost * getCourseTotal(StartDate, NewEndDate, 1)
End If
ConvertCourse = result
End Function
'SUMPRODUCT(--(CourseDates>=--"2011-07-20"),--(CourseDates<=--"2011-8-20"),Courses*130)
Function getCourseTotal(StartDate As Date, EndDate As Date, DailyCost As Double)
Dim Formula As String
Formula = "=SUMPRODUCT(--(CourseDates>=--" & Format(StartDate, "\""YYYY-MM-DD\""") & _
"),--(CourseDates<=--" & Format(EndDate, "\""YYYY-MM-DD\""") & "),Courses)"
getCourseTotal = Evaluate(Formula) * DailyCost
End Function