我需要帮助将此代码编码为Excel-VBA中的函数。老实说,我不认为我是否能够清楚地解释这一点,但是在这里。
我的日期范围可以是同一年中的任何日期
样本日期范围: 日期A = 01/15/2019 日期B = 12/10/2019
我必须将日期分为所涵盖的每个季度的开始日期和结束日期。由于DateA在Q1中,因此第一个开始日期将是给定的DateA,第一个结束日期将是Q1的结束(3月31日)。因此,对于此示例:
开始日期1 = 01/15/2019 结束日期1 = 03/31/2019
向前看,我现在必须获取从第二季度开始到DateB的日期。
这是我到目前为止的开始。首先,我必须找到范围的开始位置。
Select Case Month(startdate)
Case 1 to 3
'what to do
Case 3 to 6
'what to do
Case 7 to 9
'what to do
Case 10 to 12
'what to do
End Select
我还不知道如何编写后续步骤或如何从此处进行编码。
最终结果必须如下:
开始日期1 = 01/15/2019
结束日期1 = 03/31/2019
开始日期2 = 04/01/2019
结束日期2 = 06/30/2019
开始日期3 = 07/01/2019
结束日期3 = 09/30/2019
开始日期4 = 10/01/2019
结束日期4 = 12/10/2019
答案 0 :(得分:0)
这两个自定义函数应该做到这一点。我假设某人不会有任何开始日期晚于该季度的情况。您可以更新公式以捕获一个变量,例如2018年3月31日,但我只是将其设置为获取季度数和年份。
Function startDate(beginTIME As Date, QuarterNumber As Long, TheYEar As Long) As Date
Dim Q_BeginDates(1 To 4) As Date
Q_BeginDates(1) = DateSerial(TheYEar, 1, 1)
Q_BeginDates(2) = DateSerial(TheYEar, 4, 1)
Q_BeginDates(3) = DateSerial(TheYEar, 7, 1)
Q_BeginDates(4) = DateSerial(TheYEar, 10, 1)
If beginTIME < Q_BeginDates(QuarterNumber) Then
startDate = Q_BeginDates(QuarterNumber)
Else
startDate = beginTIME
End If
End Function
Function endDate(endTIME As Date, QuarterNumber As Long, TheYEar As Long) As Date
Dim Q_EndDates(1 To 4) As Date
Q_EndDates(1) = DateSerial(TheYEar, 3, 31)
Q_EndDates(2) = DateSerial(TheYEar, 6, 30)
Q_EndDates(3) = DateSerial(TheYEar, 9, 30)
Q_EndDates(4) = DateSerial(TheYEar, 12, 31)
If endTIME > Q_EndDates(QuarterNumber) Then
endDate = Q_EndDates(QuarterNumber)
Else
endDate = endTIME
End If
End Function
此外,我仍然建议您使用非VBA。这是我在模型上做的方法...
单元格C5中的公式为=IF(A1<DATE(LEFT(B5,4),CHOOSE(RIGHT(B5,1),1,4,7,10),1),DATE(LEFT(B5,4),CHOOSE(RIGHT(B5,1),1,4,7,10),1),$A$1)
单元格D5中的公式为:
=IF($B$1>DATE(LEFT(B5,4),CHOOSE(RIGHT(B5,1),3,6,9,12),CHOOSE(RIGHT(B5,1),31,30,30,31)),DATE(LEFT(B5,4),CHOOSE(RIGHT(B5,1),3,6,9,12),CHOOSE(RIGHT(B5,1),31,30,30,31)),$B$1)