Вы не хотите, чтобы эта логика была скрыта в какой-то логике нажатия кнопок.
Создайте функцию, выделенную для этого: вы берете параметр Date
и возвращаете строку, представляющую ваш отформатированный финансовый календарьдата - вы не можете использовать стандартные функции VBA.DateTime
, потому что они работают по «гражданскому календарю», который не совпадает с вашими финансовыми периодами.
Один из способов сделать это - использовать 12-позиционные массивы, которые содержат смещения для использования для каждого периода:
Public Function GetFiscalCalendarPeriod(ByVal value As Date) As String
Dim monthPeriods As Variant
monthPeriods = Array(9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8)
Dim yearOffsets As Variant
yearOffsets = Array(-1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0)
Dim index As Long
index = Month(value) - 1 'implicitly sized array is 0-based
Dim periodMonth As Long
periodMonth = monthPeriods(index)
Dim periodYear As Long
periodYear = Year(value) + yearOffsets(index)
GetFiscalCalendarPeriod = Format$(periodMonth, "00") & Right$(Format$(periodYear, "0000"), 2)
End Function
Таким образом, вы можете легко получить «финансовый период» по любой дате, где бы вам ни понадобилась эта логика.
Вв случае вашего диалога вы должны взять, например, 2018-07-01
aka «июль 2018», а функция вернет строку, например, "0318"
, поскольку июль 2018 года является третьим периодом в 2018 финансовом году;присвойте ему 2018-02-01
он же «февраль 2018», и функция вернет "1017"
, так как это 10-й период финансового года 2017.