为批处理报告定义从今天起的日期偏移量

时间:2016-04-08 18:53:55

标签: algorithm encoding formatting

我必须制作一份报告,每天都会使用不同的设置自动执行几次。该报告选择两个日期之间的记录。现在,客户希望可以在文本或Excel文件中自由定义将运行每个报告的日期。例如,我每天都想运行当天的报告,以及前一年的同一天,前一周的同一天,前一周以及上一年的下个月。然后在每个月的第一个月,整个上个月等等。我想你得到了要点。

我的问题是:有没有确定的方法呢?一些文本编码的日期偏移?我看了,什么也没出现。然而,这似乎并不是一个古怪的命题。我想情况已经发生过。我不想重新发明轮子。但是,如果没有任何内容,欢迎任何想法: - )

1 个答案:

答案 0 :(得分:0)

好的,所以我自己做了,这次没有免费午餐:-)我选择的格式如下:

+ 1W,fW,-1D(那将是下周,那周的第一天,然后是前一天)

分隔符是逗号,键是D表示天,W表示星期,M表示月份,Y表示年份,F表示第一个,L表示最后一个(所有键可以是小写或大写)。格式忽略空格,但最后一个非空格字符必须是键。只允许整数偏移。

我给出了第一个解释文本偏移的VBA函数的实现。虽然很少进行测试,但它似乎有效。

嗯,这就是后人。

 Public Function GetDateFromOffset(fecIni As Date, sDif As String) As Date
    Dim sArr() As String, ii As Integer, fRes As Date
    fRes = fecIni
    sArr = Split(sDif, ",")

    For ii = LBound(sArr()) To UBound(sArr())
        fRes = ApplyOneOffset(fRes, sArr(ii))
    Next ii

    GetDateFromOffset = fRes
End Function

Public Function ApplyOneOffset(fecIni As Date, sDif As String) As Date
    Const C_DAY As String = "D", C_WEEK As String = "W", C_MONTH As String = "M", C_YEAR As String = "Y"
    Const C_FIRST As String = "F", C_LAST As String = "L"

    Dim iDesp As Integer, sDesp As String, fRes As Date
    sDesp = UCase(Right(sDif, 1))
    sDif = Trim(UCase(Left(sDif, Len(sDif) - 1)))
    Select Case sDesp
        Case C_DAY
            If (IsNumeric(sDif)) Then
                fRes = DateAdd("d", CInt(sDif), fecIni)
            End If
        Case C_WEEK
            If (sDif = C_FIRST) Then
                fRes = dhFirstDayInWeek(fecIni)
            ElseIf (sDif = C_LAST) Then
                fRes = dhLastDayInWeek(fecIni)
            ElseIf (IsNumeric(sDif)) Then
                fRes = DateAdd("ww", CInt(sDif), fecIni)
            End If
        Case C_MONTH
            If (sDif = C_FIRST) Then
                fRes = dhFirstDayInMonth(fecIni)
            ElseIf (sDif = C_LAST) Then
                fRes = dhLastDayInMonth(fecIni)
            ElseIf (IsNumeric(sDif)) Then
                fRes = DateAdd("m", CInt(sDif), fecIni)
            End If
        Case C_YEAR
            If (sDif = C_FIRST) Then
                fRes = DateSerial(YEAR(fecIni), 1, 1)
            ElseIf (sDif = C_LAST) Then
                fRes = DateSerial(YEAR(fecIni), 31, 12)
            ElseIf (IsNumeric(sDif)) Then
                fRes = DateAdd("yyyy", CInt(sDif), fecIni)
            End If
        Case Else
            fRes = fecIni
    End Select

    ApplyOneOffset = fRes

End Function