excel中计算农历的公式在网上可以查找,不少人也会写:
(第1个函数出马)
TEXT(日期,"[$-130000]yyyy-mm-dd")
TEXT可以对单元格的值格式化处理,这里[]里的字符 $-130000 是计算农历的关键,至于为什么这样写,微软也没有更准确的说法,所以同学们也不必深究,死记就行了,如果你真的很想知道,百度一下就会有答案,不过也只是网友猜测。
只是这个公式就行了吗?不行!因为农历也有润月情况,比如2014年闰九月,即有2个九月。下面是1949年~2020年的润月表。
年份 | 润月 |
1949 | 7 |
1952 | 5 |
1955 | 3 |
1957 | 8 |
1960 | 6 |
1963 | 4 |
1966 | 3 |
1968 | 7 |
1971 | 5 |
1974 | 4 |
1976 | 8 |
1979 | 6 |
1982 | 4 |
1984 | 10 |
1987 | 6 |
1990 | 5 |
1993 | 3 |
1995 | 8 |
1998 | 5 |
2001 | 4 |
2004 | 2 |
2006 | 7 |
2009 | 5 |
2012 | 4 |
2014 | 9 |
2017 | 6 |
2020 | 4 |
用text函数计算的农历日期没考虑到闰月,怎么把闰月因素也加上呢?
【例】如下图所示,要求根据B2的阳历在B3单元格中返回对应的农历日期。
原理应该是这样的
用B2的年份 (第2个函数)
Year(B2)
从D和E列查找对应的闰月(第3个函数)
VLOOKUP(YEAR(B2),D:E,2,0)
查出出来后和B2的月份进行比较(第4个函数出现)
VLOOKUP(YEAR(B2),D:E,2,0)<MONTH(B2)
如果闰月大于B2的日期,不需要对日期处理,否则需要处理,为了方便处理,在表达式前添加 - 号,TRUE遇到-变成 -1 ,FALSE变成0
-(VLOOKUP(YEAR(B2),D:E,2,0)<MONTH(B2))
因为有的年份没有闰月,VLOOKUP查不到会返回错误值,所以需要用IFERROR函数把错误值转换为0 (第5个函数出马)
IFERROR(-(VLOOKUP(YEAR(B2),D:E,2,0)<MONTH(B2)),0)
最后如果是润月后的日期,TEXT计算后的月份再 - 1 ,完成这个功能的函数是EDATE函数(第6个函数),最终的计算农历的函数也已完成!
=EDATE(TEXT(B2,"[$-130000]yyyy-mm-dd"),IFERROR(-(VLOOKUP(YEAR(B2),D:E,2,0)<MONTH(B2)),0))
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。