给定日期范围,按季度设置开始和结束日期

时间:2019-07-20 20:04:37

标签: excel vba

我需要帮助将此代码编码为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

1 个答案:

答案 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)

enter image description here