Kim有一个工作表,在其中放置了开始日期(C列)和结束日期(D列)。她需要一种方法来计算两个日期之间的月末计数。例如,如果开始日期为1/1/17,结束日期为7/31/17,则月末数为7。但是,如果结束日期为7/30/17,则月数结束是6。

您可以设计任意数量的公式来计算正确的计数。最简单的公式是,如果您始终可以指望C列中的日期是一个月的开始。在这种情况下,以下公式将可以正常工作:

=DATEDIF(C1,D1+1,"m")

如果您不能指望C列包含一个月初的日期,但是可以指望总是在同一年的开始日期和结束日期,那么以下任何公式都可以解决问题:

=IF(MONTH(D1+1)=MONTH(D1),MONTH(D1)-MONTH(C1),MONTH(D1)-MONTH(C1)+1)

=IF(MONTH(D1+1)=MONTH(D1),MONTH(D1)-1,MONTH(D1))-MONTH(C1)+1 =MONTH(EOMONTH(D1,0))-MONTH(EOMONTH(C1,0))+(EOMONTH(D1,0)=D1)

=IF(EOMONTH(D1,0)=D1,MONTH(D1)-MONTH(C1)+1,MONTH(D1)-MONTH(C1))

=IF(D1<EOMONTH(D1,0),MONTH(D1)-1,MONTH(D1))-MONTH(C1)+1 =MONTH(D1)-MONTH(C1)+IF(D1=EOMONTH(D1,0),1,0)

如果开始日期和结束日期的年份可能不同,则公式会更加复杂。以下任何一种变化都会计算出日期范围内的正确月末数:

=12*(YEAR(D1)-YEAR(C1))+MONTH(D1)-MONTH(C1)+INT(D1=EOMONTH(D1,0))

=12*(YEAR(D1)-YEAR(C1))+MONTH(D1)-MONTH(C1)+IF(EOMONTH(D1,0)=D1,1,0)

=12YEAR(D1)+MONTH(D1)-12YEAR(C1)-MONTH(C1)+IF(D1=EOMONTH(D1,0),1,0)

=12YEAR(D1)+MONTH(D1)-12YEAR(C1)-MONTH(C1)+(D1=EOMONTH(D1,0))

=12YEAR(D1)+MONTH(D1)-12YEAR(C1)-MONTH(C1)+(DAY(D1+1)=1)

=MONTH(D1)+12YEAR(D1)-MONTH(C1)-12YEAR(C1)+IF(EOMONTH(D1,0)=D1,1,0)

=(MONTH(D1+1)+12YEAR(D1+1))-(MONTH(C1)+12YEAR(C1))

=IF(D1=EOMONTH(D1,0),1,0)+MONTH(D1)-MONTH(C1)+((YEAR(D1)-YEAR(C1))*12)

=IF(EOMONTH(D1,0)=D1,(MONTH(D1)-MONTH(C1)+1)+(YEAR(D1)-YEAR(C1))12,MONTH(D1)-MONTH(C1)+(YEAR(D1)-YEAR(C1))12)

=IF(D1=EOMONTH(D1,0),DATEDIF(EOMONTH(C1,-1),EOMONTH(D1,0),"m"),DATEDIF(EOMONTH(C1,-1),EOMONTH(D1,0),"m")-1)

=IF(D1<C1,"Error",MONTH(D1)-MONTH(C1)+IF(D1MONTH(D1+1))*1)

=IF(D1<C1,"Error",(YEAR(D1)-YEAR(C1))*12+(MONTH(D1)-MONTH(C1))+(EOMONTH(D1,0)=D1))

=SUM(N(FREQUENCY(EOMONTH(ROW(INDIRECT(C1&":"&D1)),0),EOMONTH(ROW(INDIRECT(C1&":"&D1)),0))>0))-(D1<EOMONTH(D1,0))

其中一些公式有些长,因此,如果您选择使用一个公式,则需要仔细观察所有公式。

如果您更喜欢使用宏方法,那么以下用户定义的函数可能是您感兴趣的:

Function CountMonthEnds(sd As Date, ed As Date) As Integer     Dim ceom As Integer     Dim cmonth As Integer     Dim lmonth As Integer     Dim x As Date

cmonth = 0     ceom = 0     cmonth = Month(sd)

lmonth = cmonth     ' go to end date + 1 to allow for end date being end of month     For x = sd To ed + 1         cmonth = Month(x)

If cmonth <> lmonth Then             ceom = ceom + 1             lmonth = cmonth         End If     Next x     CountMonthEnds = ceom End Function

宏仅浏览开始日期和结束日期之间的所有日期。它查看每个日期的月份,如果更改,则将其视为“月末”。该计数由函数返回。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(572)适用于Microsoft Excel 2007、2010、2013和2016。