在两个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之间。 这将返回TRUE
或FALSE
,然后您可以在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)非常易于安装和使用:
- ALT-F11调出VBE窗口
- ALT-I ALT-M打开一个新的模块
- 粘贴东西,closuresVBE窗口
如果保存工作簿,则UDF将随之保存。 如果您在2003年以后使用的是Excel版本,则必须将该文件另存为.xlsm而不是.xlsx
要删除UDF:
- 如上所示调出VBE窗口
- 清除代码
- 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
包含Date1
, B2
包含Date2
这个公式应该可以在Excel
使用[几乎]任何有效的date范围 – 它甚至认识到1900
不是一个闰年