在两个date之间find闰年之间的公式

我如何计算两个date之间使用的年份是否为闰年?

例如:如果Date1 = 02/02/2015和Date2 = 03/01/2016。

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

所以,如果date2正在穿过02/29/16,那么只会给出结果“闰年”,否则不会。

谢谢!

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

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,但是当然可以修改它以返回一个显式结果或格式化输出。

这个公式将从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月的存在。

VBA例程不会有这些date限制。 以下检查从Date1到Date2中的任何一年是否为闰年; 如果是,则该date介于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 

尝试以下小型用户定义function:

 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日的date范围。

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

  1. ALT-F11调出VBE窗口
  2. ALT-I ALT-M打开一个新的模块
  3. 粘贴东西,closuresVBE窗口

如果保存工作簿,则UDF将随之保存。 如果您在2003年以后使用的是Excel版本,则必须将该文件另存为.xlsm而不是.xlsx

要删除UDF:

  1. 如上所示调出VBE窗口
  2. 清除代码
  3. closuresVBE窗口

从Excel中使用UDF:

= LeapTest(A1,B1)

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

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

macros必须启用这个工作!

例子:

在这里输入图像说明

如果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") 

每8年至less有一次闰年,因此在接下来的8年内,在leap day之后或之后的下个leap day应该足够了,看看这一天是否在date范围之内

这个公式将做到这一点

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

其中A2包含Date1B2包含Date2

这个公式应该可以在Excel使用[几乎]任何有效的date范围 – 它甚至认识到1900不是一个闰年