【问题标题】:Formula for finding between the 2 dates whether Leap Year comes in-between在两个日期之间查找闰年是否介于两者之间的公式
【发布时间】:2015-04-29 07:56:17
【问题描述】:

如何计算两个日期之间使用的年份是否为闰年。

示例:如果 Date1 = 02/02/2015 并且 Date2 = 03/01/2016。

所以,如果我们计算,那么结果应该是“闰年”,但如果我们使用 Date2 = 02/01/2016,那么结果应该是“无闰年”。

所以,如果 date2 超过 2016 年 2 月 29 日,那么只有它给出结果“闰年”,否则不会。

谢谢!

【问题讨论】:

  • Excel 的创建者(无论他们是谁)可能已经回答了这个问题。
  • @Strawberry - Excel 认为 1900 年 2 月 29 日是一个有效日期,所以我猜不是(对 Lotus 兼容性的旧回归)。

标签: excel


【解决方案1】:

循环间隔的每个日期可能有点苛刻。 这个函数只会每年循环一次:

Public Function DatesOfLeapYear(ByVal Date1 As Date, ByVal Date2 As Date) As Boolean

    Dim LeapYear            As Boolean

    Do
        If DateDiff("d", Date1, DateSerial(Year(Date1), 3, 1)) > 0 Then
            If Day(DateSerial(Year(Date1), 2, 29)) = 29 Then
                LeapYear = True
                Exit Do
            End If
        End If
        Date1 = DateAdd("yyyy", 1, Date1)
    Loop Until Date1 >= Date2

    DatesOfLeapYear = LeapYear

End Function

它按原样返回 True/False,但您当然可以修改它以返回显式结果或格式化输出。

【讨论】:

    【解决方案2】:

    此公式适用于 1900 年 3 月 1 日至 4770 年 11 月 24 日

    =IF(SUMPRODUCT((DAY(ROW(INDIRECT(Date1&":"&Date2)))=29)*(MONTH(ROW(INDIRECT(Date1&":"&Date2)))=2)),"Leap Year","No Leap Year")
    

    它在 Date1 和 Date2 之间寻找 29 月 29 日的存在。

    VBA 例程没有这些日期限制。以下检查从 Date1 到 Date2 的任何年份是否是闰年;如果是,则该日期是否在 date1 和 date2 之间。这将返回 TRUEFALSE,然后您可以在 IF 函数中使用它们来返回您想要的内容。

    Option Explicit
    Function IsLeapYear(DT1 As Date, DT2 As Date) As Boolean
        Dim I As Long
        Dim DT As Date
    
    For I = Year(DT1) To Year(DT2)
        DT = DateSerial(I, 2, 29)
        If Day(DT) = 29 And _
            DT >= DT1 And _
            DT <= DT2 Then
                IsLeapYear = True
                Exit Function
        End If
    Next I
    
    End Function
    

    【讨论】:

    • 智能从 1900 年 3 月 1 日开始!
    • 非常感谢 Ron 的回答。它真的很好用而且没有错误。
    • @Sumeet 很高兴为您提供帮助。由于它对您很有效,如果您能将我的回复标记为答案,我将不胜感激。谢谢。
    【解决方案3】:

    试试下面的小用户定义函数:

    Public Function LeapTest(d1 As Date, d2 As Date) As String
        Dim dEarly As Date, dLate As Date
        Dim wf As WorksheetFunction, yr As Long
        Set wf = Application.WorksheetFunction
        Dim d As Date
    
        dEarly = wf.Min(d1, d2)
        dLate = wf.Max(d1, d2)
        yr = Year(dEarly)
        For d = dEarly To dLate
            If Format(d, "mm/dd") = "02/29" Then
                LeapTest = "Leap Year"
                Exit Function
            End If
        Next d
        LeapTest = "Not Leap Year"
    End Function
    

    它只是遍历寻找 2 月 29 日的日期范围。

    用户定义函数 (UDF) 非常易于安装和使用:

    1. ALT-F11 调出 VBE 窗口
    2. ALT-I ALT-M 打开一个新模块
    3. 粘贴内容并关闭 VBE 窗口

    如果您保存工作簿,UDF 将与它一起保存。 如果您使用的是 2003 年以后的 Excel 版本,则必须保存 文件为 .xlsm 而不是 .xlsx

    要删除 UDF:

    1. 如上所示打开 VBE 窗口
    2. 清除代码
    3. 关闭 VBE 窗口

    要使用 Excel 中的 UDF:

    =LeapTest(A1,B1)

    要了解有关宏的更多信息,请参阅:

    http://www.mvps.org/dmcritchie/excel/getstarted.htm

    http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

    有关 UDF 的详细信息,请参阅:

    http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

    必须启用宏才能正常工作!

    例子:

    【讨论】:

      【解决方案4】:

      如果 date2 超过 02/29/16,那么只有它给出结果“闰年”

      如果Date1 在 A1 中,Date2 在 A2 中,请尝试:

      =IF(AND(A1<DATE(2016,2,29),A2>DATE(2016,2,29)),"Leap Year","No Leap Year")
      

      【讨论】:

        【解决方案5】:

        至少每 8 年有一次闰年,因此在接下来的 8 年内查找Date1 或之后的下一个leap day 并查看那一天是否在日期范围内就足够了

        这个公式可以做到这一点

        =IF(B2&gt;=EOMONTH(A2,MATCH(29,INDEX(DAY(EOMONTH(A2,ROW(INDIRECT("1:96"))-1)),0),0)-1),"Leap Year","No Leap Year")

        其中A2 包含Date1 并且B2 包含Date2

        该公式应该适用于 [几乎] Excel 中的任何有效日期范围 - 它甚至可以识别 1900 不是闰年

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-02-26
          • 2021-08-23
          • 2021-03-11
          • 2011-06-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多