ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > 函数与公式 > 如何根据一个月中周日的单双号条件求月休假总天数?

如何根据一个月中周日的单双号条件求月休假总天数?

作者:绿色风 分类: 时间:2022-08-17 浏览:84
楼主
wjc2090742
Q:如何根据一个月中周日的单双号条件,周日是单号的休假1天,双号的休假2天,求月休假总天数?
A:如下图,在A1输入年,B1输入月,C1得出结果。

 

C1:
  1. =SUM((WEEKDAY(DATE(A1,B1,ROW(1:31)))=1)*(MONTH(DATE(A1,B1,ROW(1:31)))=B1)*(2-MOD(DAY(DATE(A1,B1,ROW(1:31))),2)))


建议一楼一楼的看下去。自己非常喜欢这个帖,尤其是公式演变的过程。从1楼中规中矩的日期函数的思路,一路到草版44个字符的表演。
休假天数.rar
2楼
gouweicao78
  1. =COUNT(1/((MOD(A1&-B1&-ROW(1:31),7)=1)+(MOD(A1&-B1&-ROW(1:31),2)=1)*(MOD(A1&-B1&-ROW(1:31),7)=0)))
思路:
1、A1&-B1&-ROW(1:31)构建31天日期,如果没有31天的月份,后几个日期是错误的;
2、MOD(日期,7)——等于1时是星期天,等于0是星期六
3、三个条件:条件1+条件2*条件3,即条件1或者(条件2且条件3),也就是:要么这一天是周日(肯定休息),要么这一天是周六且是单号(则周日是双号)

问题:如果某月最后一天X是单号、周六,而下月1号是周日、双号,那么X是否休息?这一点题目没有明确,我的答案是休息的,算到当月。
3楼
kevinchengcw
问题:如果某月最后一天X是单号、周六,而下月1号是周日、双号,那么X是否休息?这一点题目没有明确,我的答案是休息的,算到当月。

我这里是要上班的,只有当月双数日期的星期天前的星期六才能休
4楼
gouweicao78
嗯,刚才我的公式也有个小问题,题意应该是某月“某日”day是双号日期,而不是转换为日期序列号后是双数
=COUNT(1/(MOD(A1&-B1&-ROW(1:31),7)=1))+COUNT(1/(MOD(DAY(A1&-B1&-ROW(1:31)),2)+MOD(A1&-B1&-ROW(1:31),7)=0))

根据这个条件,那么只有2~31号是双号且1~30号是周六的情况补休1天:
  1. =COUNT(1/(MOD(A1&-B1&-ROW(1:31),7)=1))+COUNT(1/(MOD(DAY(A1&-B1&-ROW(2:31)),2)+MOD(A1&-B1&-ROW(1:30),7)=0))
5楼
gouweicao78
  1. =COUNT(1/((MOD(A1&-B1&-ROW(1:31),7)={1,0})*IF({1,0},1,(MOD(DAY(A1&-B1&-ROW(2:32)),2)=0))))
其中,第1个MOD判断1~31日是否{周日、周六}
第2个MOD判断2~32号日期是否双号,并结合IF({1,0}返回第1列是1第2列是MOD判断的数组,与第一个MOD返回的2列数组相乘。

此处常量数组让公式简化,利用同样维度、尺寸(2列31行)数组运算时,各回各家各找各妈的“分别”计算方式,也就是说:第一个MOD是周日的,都乘以1;是周六的,都乘以第2个MOD判断双号。互不干扰。

最终,利用COUNT忽略错误,将可能存在的:日期不足31天(更不可能有32天)导致的错误去除掉,这是用DATE函数做不到的,呵呵,“错”有“错”的妙用。
6楼
wjc2090742
草版的思路真是漂亮,研究了好久。我的是1列*1列*1列,草版的是2列*2列。所以不一定非要用时间函数去纠错,可以用别的办法规避错误值。受启发,改写了一下自己的公式,仍然是1列求和的思路,但是excel的sum不能像count那样忽略错误值,没有办法写出2003版也适用的通式。

改写的公式:
  1. =SUM(IFERROR((WEEKDAY(A1&-B1&-ROW(1:31))=1)*(2-MOD(DAY(A1&-B1&-ROW(1:31)),2)),0))


kevinchengcw的这个题目真的好赞,也是我非常喜欢日期函数的原因,excel中的日期真是太神奇了,日期、数值、文本,太好玩了。
休假天数.rar
7楼
gouweicao78

DAY(A1&-B1&-ROW(1:31))——实际上就是ROW(1:31),呵呵,还可以再简化:
  1. =SUM(IFERROR((WEEKDAY(A1&-B1&-ROW(1:31))=1)*(2-MOD(ROW(1:31),2)),0))
  1. =SUM(IFERROR((MOD(A1&-B1&-ROW(1:31),7)=1)*(2-MOD(ROW(1:31),2)),0))
8楼
gouweicao78
  1. =COUNT(1/(MOD(A1&-B1&-IF({1,0},ROW(1:31),2*ROW(1:15)),7)=1))


也就是说,day用了2种情况,第一种是1~31都判断周日的,第二种是仅判断2、4、……30日是否周日
9楼
gouweicao78
反正都不怕32号了,也就不怕62号了,都是“错”,就豁出去了,再短一次:
  1. =COUNT(1/(MOD(A1&-B1&-ROW(1:31)*{1,2},7)=1))
10楼
kevinchengcw
呵呵,这个问题被各位研究的这么深入啊,厉害,可惜了,公式我看不太懂,慢慢消化
11楼
donghan
还是草版的功力深厚呀
12楼
wjc2090742
表扬下自己,赞美一下kevinchengcw,能引出这么精彩的表演。

我很喜欢这个过程,在我看来,5楼甚至比9楼更重要。补上完整的附件。
休假天数.rar
13楼
mjgdxx
好难
14楼
蒸蒸日上
我也看不懂,我能在这里做个记号吗,留着慢慢理解和消化!

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap