我在Excel / Google表格中有一组可能是随机的开始日期和学期长度。
Example - considering 2019 as the year in question
January 2017, 24 months
January 2019, 12 months
April 2019, 12 months
May 2020, 7 months
我需要计算特定年份中每个学期的月数。
Example answers - number of months in given timeframe that are in 2019
February 2017, 24 months A: 1 months
January 2019, 12 months A: 12 months
April 2019, 12 months A: 9 months
May 2020, 7 months A: 0 months
使用DATEDIFF
计算开始和结束日期很容易。如果没有大量复杂的逻辑,我将无法找出给定年份的下降月份。
我是否缺少一系列嵌套条件语句来确定起始月份是否在指定年份?
获取嵌套太深的条件语句不是理想的,因为需要添加其他层,例如是否要更新该术语等,这会增加其他复杂性。
答案 0 :(得分:0)
您的开始日期和月份都是在单独列中的字符串。 您可以在帮助器列中将它们转换为实际日期。 数据按下面的图像布局。
我只是用一种简化的方法布置解决方案。您可以依次嵌套公式,硬代码项等以满足您的需求
将开始日期从A6中的字符串转换为实际的Excel日期,并将其放置在D6中。我只是使用以下公式,但是存在其他方法,并且可能需要其他方法,具体取决于系统设置。
=DATEVALUE(A6)
根据月偏移量计算结束日期并将其放置在E6中。为此,我使用了以下公式,该公式与您似乎理解的DATEDIFF不同。
=EOMONTH(D6,LEFT(B6,FIND(" ",B6)-1)-2)+1
将要查找的给定年份放在指定的单元格中。在这种情况下,我选择F1。
基于F1中的整数,为该年的第一个月和该年的最后一个月生成实际日期。我将它们分别放在F2和F3中。
=DATE(F1,1,1)
=DATE(F1,12,1)
Note: These can easily be embedded in formulas but can be cleaner and make formulas easier to read.
接下来,您要测试6个条件:
我将使用嵌套的IF来解决这个问题,并将逐步解释它。条件1和2都为0。因此,请检查条件之一是否为true,如果为true,则返回0:
=IF(OR(E6<$F$2,D6>$F$3),0,
请注意,公式尚未完成。如果未提供if的错误部分,则可以在其中检查条件3。
=IF(OR(E6<$F$2,D6>$F$3),0,IF(AND(D6<=$F$2,E6>=$F$3),12,
因此,这将检查开始日期和结束日期是否跨越当前年份。请注意,我使用<=和> =是因为如果期间开始日期等于当前年份的开始日期,或者结束日期等于当前年份的结束日期,则其结果相同,并节省了以后进行数学计算的时间。同样,没有提供错误的一面。要填写此部分,您需要检查条件4。
检查期间开始日期是否在给定年份之前。您不需要同时检查结束日期,因为如果结束日期是在您知道结束日期已经被您先前的条件3检查所捕获之后,则不需要。如果是,则结束日期的月份将告诉您给定年份中有多少个月。期末计算的月份为公式1
=IF(OR(E6<$F$2,D6>$F$3),0,IF(AND(D6<=$F$2,E6>=$F$3),12,IF(D6<=$F$2,MONTH(E6),
现在,您现在的下一个条件检查已经知道您的期间开始日期是在年初之后,否则以前的检查之一可能已经捕获了该日期。您需要确定期末之后是否到年末,并计算从期初到年末的月数,即公式2。
=IF(OR(E6<$F$2,D6>$F$3),0,IF(AND(D6<=$F$2,E6>=$F$3),12,IF(D6<=$F$2,MONTH(E6),IF(E6>=$F$3,12-MONTH(D6)+1,
没有任何其他条件可检查,因为您已经抓住了所有可能性,只有一种是最终条件。只需确定公式3,然后关闭嵌套IF的所有方括号即可。
=IF(OR(E6<$F$2,D6>$F$3),0,IF(AND(D6<=$F$2,E6>=$F$3),12,IF(D6<=$F$2,MONTH(E6),IF(E6>=$F$3,12-MONTH(D6)+1,MONTH(E6)-MONTH(D6)+1))))
将上面的公式放在G6中,并根据需要向下复制。
这个过程并不是我去的第一个唯一方法。其他人可能有一个更优雅的解决方案。
答案 1 :(得分:0)
该建议行之有效。以下是我所做的一些其他修改。
该术语是否已自动更新,或者是否必须终止。但是,根据您的建议,这是一个简单的修改。
参考图像 enter image description here
受审查的年份在R2中-在这种情况下为2019年 开始日期-H栏 学期长度-第一栏 续订状态-K列(如果设置为yes,则假定该期限无限期地继续) 结束日期-P栏 在Q列中的相关年份发生的给定期限的月份
第二季度存储受审查的年度 示例中使用的行是208(对不起)
P列中的公式检查是否将续订设置为Y或N。如果N使用指示的术语“结束”。如果Y将期末设置为相关年份的12/31。
=IF(K208="N",EOMONTH(H208,I208-1),DATE($Q$2,12,31))
请注意一点细微的变化,以表示结束日期为月底,因为我关心的是整月,而不是截止日期。
示例 从2/2019开始为期一个月的期限将从2/1/2019至2/28/2019(不是2/1/2019至3/1/2019) 从2019年2月3日开始的三个月的期限将从2019年2月1日到2019年4月30日(而不是从2019年1月1日到2019年5月1日)
然后,我基本上使用了Forward Ed的公式根据他所描述的逻辑来计算我关心的月份数。
=IF(OR(P208<DATE($Q$2,1,1),H208>DATE($Q$2,12,31)),0,IF(AND(H208<=DATE($Q$2,1,1),P208>=DATE($Q$2,12,31)),12,IF(H208<=DATE($Q$2,1,1),MONTH(P208),IF(P208>=DATE($Q$2,12,31),12-MONTH(H208)+1,MONTH(P208)-MONTH(H208)+1))))