使用句点迭代日期范围,如何使用公式

时间:2016-11-20 04:49:56

标签: excel vba excel-vba

我的开始/结束日期很少,每个月的价格很少,而且每个月有一个日期和课程的表格,所以我需要根据两个日期之间的时间段来迭代课程值,我想很多标准公式没有什么是匹配的,所以我尝试将我的PHP知识,学习suntax并编写我的第一个vba代码,我把它放在这里:

http://pastebin.com/XXLKvdA4

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

我只是想把它当作公式输出到带有功能的模块,怎么做错了,怎么做呢?

1 个答案:

答案 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)

enter image description here

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