问题:按检修周期自动显示下次需要检修的日期。
函数公式解决:
=IF(MOD(DATEDIF(EOMONTH($B2,-1)+1,E$1-1,"m")+1,SUBSTITUTE($C2,"个月",)),"",E$1+MIN(DAY($B2),DAY(EOMONTH(E$1,0)))-1)
利用Mod函数计算周期
Mod函数的第一参数是初次检修时间与第一行每个时间之间的月差,使用DateDif函数计算。
两日期间月差会因为起始日期的日大于结果日期的日而且产生不同结果,如1月1日至5月1日差4个月,但1月31日到5月1日就只能算3个月了,所以用Eomonth把起始日期全部改成B列日期所在月的第一天。
Eomonth第二参数是-1是指上个月最后一天,再加1即当月第一天。
结束日期之所以减1,是因为表格对日期的起止计算规则,8月1日是至8月31日不满一个月,到9月1日就是一个月了。
为保证Mod计算结果为0的月份刚好是需要检修的月份,这一参数最后加1。
Mod第二参数就是提取C列检修周期中的数值,如果确定周期不会超过10个月,也可以用Left(C2)提取。
每个检修日期是第一行显示的年、月和初次检修时间的日,正常只需要用E1加上B2的日,即用Day函数提取,如2023年12月1日加上2023年8月10日中的10日,再减1修正即可。
日期会出现一些特殊情况,如2月没有31日,其结果为自动后延至3月,为保证初次检修为月底是复检时间不会落入下个月初,用Min函数提取初检日和该月最后一天的最小值,以2月为例,2月最后一天29日小于初检的31日,以两者中小的29日作为最后的日期。
If部分保证只显示检修日,其他显示空文本。