我必须制作一份报告,每天都会使用不同的设置自动执行几次。该报告选择两个日期之间的记录。现在,客户希望可以在文本或Excel文件中自由定义将运行每个报告的日期。例如,我每天都想运行当天的报告,以及前一年的同一天,前一周的同一天,前一周以及上一年的下个月。然后在每个月的第一个月,整个上个月等等。我想你得到了要点。
我的问题是:有没有确定的方法呢?一些文本编码的日期偏移?我看了,什么也没出现。然而,这似乎并不是一个古怪的命题。我想情况已经发生过。我不想重新发明轮子。但是,如果没有任何内容,欢迎任何想法: - )
答案 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