我们有一个4-5-4的日历,财政年度从二月的一个星期日开始。对于2016年财政年度,第一天实际上是1月--是1月31日的星期日。
我需要编写一个函数,将日期作为输入并返回财政周,比如201552,这将是2015年财政年度的第52财政周。
我认为第一步是确定输入日期的财政年度的开始日期。我知道它总是一个星期天,但是我怎么知道它是日历二月的第一个星期天,还是一月日历中的最后一个星期天?
(幸运的是,出于这个函数的目的,我可以忽略偶尔的第53周;在这种情况下,我可以返回52周。这是因为(我被告知)有53个财政周的年份是不可预测的(不管怎么说),而且是由人的想法决定的。
有什么建议吗?
更新:
从FY2005到FY2017,我收到了一份带有FY日历的文件。我看到的模式是:
我想这给了我我需要的东西。
发布于 2015-06-16 20:59:39
我认为第一步是为输入日期的2月1日找到一周中的一天。
接下来,找到FY的第一天,这是基于2月1日的一周。如果是星期一,图,或韦德,那么FY的第一天是一月的最后一个星期天。否则,FY的第一天是一月的第一个星期日。
接下来,确定输入日期是在那个FY中还是在前面的那个。
然后,如果输入日期在前一个FY中,则获取该FY的第一天。
接下来,计算从FY的第一天到输入日期的日期。除以7,舍入到下一个整数。这是财政周。
在这一点上,我将知道输入日期的财政年度和财政周,并可以返回。
更新:
下面是我所拥有的,它在我的测试中起作用:
Public Function ConvertDateToRawFYWeek(convert_date As Date) As String
'Fiscal year starts on either:
'the last Sunday in January (if Feb 1st is a Mon, Tue, or Wed), OR:
'the first Sunday in February (if Feb 1st is Thur, Fri, Sat, or Sun).
Dim iCalendarYearOfInputDate As Long, iInputMonth As Long, iInputDay As Long, iTmpYear As Long
Dim iFebFirstOfTmpYear As Long, strFebFirstWeekdayOfTmpYear As String
Dim iFirstDayofFYOfTmpYear As Long
Dim iFiscalYearOfInputDate As Long
Dim iDayOfInputDate As Long
Dim iDayOfFY As Long, iWeekOfFY As Long, strWeekOfFY As String
Dim bDone As Boolean
iCalendarYearOfInputDate = Year(convert_date)
iInputMonth = Month(convert_date)
iInputDay = Day(convert_date)
iDayOfInputDate = CLng(DateValue(convert_date))
bDone = False 'init.
iTmpYear = iCalendarYearOfInputDate 'init.
Do
'***get the day of the week of feb 1st of tmp date's year:
iFebFirstOfTmpYear = DateSerial(iTmpYear, 2, 1)
strFebFirstWeekdayOfTmpYear = Format(iFebFirstOfTmpYear, "DDDD")
'***get the first day of the FY of the tmp date's year:
Select Case strFebFirstWeekdayOfTmpYear
Case "Monday"
'first day of the tmp year's FY is the last Sunday of January, which for the tmp year is Jan 31st:
iFirstDayofFYOfTmpYear = iFebFirstOfTmpYear - 1
Case "Tuesday"
'first day of the tmp year's FY is the last Sunday of January, which for the tmp year is Jan 30th:
iFirstDayofFYOfTmpYear = iFebFirstOfTmpYear - 2
Case "Wednesday"
'first day of the tmp year's FY is the last Sunday of January, which for the tmp year is Jan 29th:
iFirstDayofFYOfTmpYear = iFebFirstOfTmpYear - 3
Case "Thursday"
'first day of the tmp year's FY is the first Sunday of February, which for the tmp year is Feb 4th:
iFirstDayofFYOfTmpYear = iFebFirstOfTmpYear + 3
Case "Friday"
'first day of the tmp year's FY is the first Sunday of February, which for the tmp year is Feb 3rd:
iFirstDayofFYOfTmpYear = iFebFirstOfTmpYear + 2
Case "Saturday"
'first day of the tmp year's FY is the first Sunday of February, which for the tmp year is Feb 2nd:
iFirstDayofFYOfTmpYear = iFebFirstOfTmpYear + 1
Case "Sunday"
'first day of the tmp year's FY is the first Sunday of February, which for the tmp year is Feb 1st:
iFirstDayofFYOfTmpYear = iFebFirstOfTmpYear
End Select
'***get the fiscal year of the input date:
If iDayOfInputDate >= iFirstDayofFYOfTmpYear Then
iFiscalYearOfInputDate = iTmpYear
bDone = True
Else
iTmpYear = iTmpYear - 1 'loop again.
End If
Loop Until bDone
'***count the days from that first day of the FY, to the day of the input date.
'Divide by 7, rounding UP to the next integer. That is the FY week.
iDayOfFY = iDayOfInputDate - iFirstDayofFYOfTmpYear
iWeekOfFY = Round((iDayOfFY / 7) + 0.50000000000001) 'round up to next integer.
strWeekOfFY = Format(iWeekOfFY, "00")
strFY = Format(iTmpYear, "0000")
ConvertDateToRawFYWeek = strFY & strWeekOfFY
End Functionhttps://stackoverflow.com/questions/30876667
复制相似问题