【问题标题】:Setting start and end dates by quarter given a date range在给定日期范围的情况下按季度设置开始和结束日期
【发布时间】:2025-12-23 09:15:12
【问题描述】:

我需要帮助将其编码为 Excel-VBA 中的函数。老实说,我不认为我是否能够清楚地解释这一点,但是就这样吧。

我有一个日期范围,可以是同一年内的任何日期

示例日期范围: 日期 A = 01/15/2019 日期 B = 2019 年 12 月 10 日

我必须将日期拆分为它所涵盖的一年中每个季度的开始日期和结束日期。由于 DateA 在 Q1,第一个开始日期将是给定的 DateA,第一个结束日期将是 Q1(3 月 31 日)的结束。所以对于这个例子:

开始日期 1 = 01/15/2019 结束日期 1 = 03/31/2019

接下来,我现在必须获取从 Q2 到 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

【问题讨论】:

  • 我假设结束日期 4 是 o 型,应该是 2019 年 12 月 31 日?
  • 嗨!没有。预期结束日期仍应为给定日期范围内的 DateB,即使它在第 4 季度结束。涵盖的日期应仅为从 DateA 到 DateB。例如,DateB 可以是 08/01/2019(Q3)。在日期 A 到日期 B 之间,它仅涵盖 3 个季度。因此,结果将只是 Q1-Q3:开始日期 1 = 01/15/2019 ... ...开始日期 3 = 07/01/2019 结束日期 3 = 08/01/2019 ----没有后续----
  • 哦,我明白了。嗯好的,我会修改我的答案。我会修改我的答案。
  • 你能再举几个例子吗?如果是 Q1 并且开始日期是 4 月 4 日,你会怎么做?或者如果开始日期是前一年呢?
  • “如果是 Q1”你指的是 dateB 吗?如果 DateA 在 Q1 并且 DateB 也是 Q1,那么它只会返回一对日期。示例 1:A = 01/15/2019 \\Q1 B = 02/21/2019 \\Q1 开始日期 1 = A 结束日期 1 = B ------------------ - 示例 2 A = 07/20/2019 \\Q3 B = 10/06/2019 \\Q4 开始日期 1 = 07/20/2019 结束日期 1 = 10/06/2019

标签: excel vba


【解决方案1】:

这两个自定义函数应该可以做到。我假设有人不会遇到任何开始日期晚于季度的情况。您可以更新公式以捕获一个变量,例如 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&lt;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&gt;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)

【讨论】:

  • 我试试看!该项目需要 VBA,因为我将运行宏来处理日期,但我对宏和 vba 还很陌生,所以这很有帮助。非常感谢你!周末快乐:)